您的位置:首页 > 运维架构 > Shell

Linux入职基础-5.19_详解操作shell启动(应用实战3)

2018-03-03 21:55 786 查看
详解操作shell启动(应用实战3) 

所谓shell,简单说就是命令行界面的一个软件(比如:/bin/bash),让用户可以直接与操作系统对话。
一、从init初始化开始简单回顾
内核(/vmunix,/boot/zImage等)文件加载至内存以后,就开始运行第一个程序 /sbin/init,它的进程编号(pid)为1,是所有子进程的父进程;它运行于内存保护段一直到系统关机才停止。
/sbin/init进程首先读取文件 /etc/inittab,简单流程如下:
首先,执行脚本/etc/rc.d/rc.sysinit,设定系统程序运行所需的环境。
##在/etc/inittab文件,具体体现为如下:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
其次,当rc.sysinit程序执行完毕后,将返回init继续解析/etc/inittab文件,下一步就是执行脚本/etc/rc.d/rc,它接受“运行级别”作为参数(比如3或5等),启动对应运行级别的开机启动程序(在Windows叫做"服务",在Linux就叫做"守护进程")。在init进程结束的时候执行/etc/rc.d/rc.local脚本,就是留给用户自定义开机启动所需的。
##在/etc/inittab文件,具体体现为如下:
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
每个运行级别在/etc目录下面,都有一个对应的子目录,指定要加载的程序。
[root@localhost~]# ll /etc/rc*.d/etc/rc0.d-> rc.d/rc0.d/etc/rc1.d-> rc.d/rc1.d/etc/rc2.d-> rc.d/rc2.d/etc/rc3.d-> rc.d/rc3.d/etc/rc4.d-> rc.d/rc4.d/etc/rc5.d-> rc.d/rc5.d/etc/rc6.d-> rc.d/rc6.d
上面目录名中的"rc"表示run command(运行程序),数字0~6表示对应运行级别,d表示directory(目录)含义。下面让我们看看 /etc/rc3.d 目录中到底指定了哪些程序。
[root@localhost~]# ls  /etc/rc.d/rc3.d | sort
K01dnsmasq
K02avahi-dnsconfd
K02NetworkManager
……
K89pand
K89rdisc
K91capi
S00microcode_ctl
S04readahead_early
……
S99local
S99smartd
可以看到,目录/etc/rc3.d中文件名都是"字母S或K+两位数字+程序名"的形式。在这个目录里,遵循如下可循的规则:
规则1、字母S,代表Start,就是启动的含义(启动脚本,传递的运行参数为start);
规则2、字母K,代表Kill,就是关闭的含义(关闭脚本,传递的运行参数为stop),比如,运行级别的切换,需要关闭一些程序;
规则3、后面的两位数字表示处理顺序,数字越小越早处理;数字相同时,则按照程序名的字母顺序启动;
规则4、目录/etc/rc3.d中的所有文件都是链接文件,它们指向另外一个目录/etc/init.d(而/etc/init.d指向/etc/rc.d/init.d目录)。
[root@localhost~]# ll /etc/rc3.d/
lrwxrwxrwx1 root root 16 Nov 12 23:38 S99smartd -> ../init.d/smartd
 [root@localhost ~]# ll   /etc/init.d
lrwxrwxrwx1 root root 11 Nov 12 23:34 /etc/init.d -> rc.d/init.d
可以得出,无论对应哪个运行级别,它们真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。至于在每个运行级别中将运行哪些守护进程,用户可以通过chkconfig或setup中的"System Services"来自行设定。
基本流程如下:



二、开启终端
/etc/rc.d/rc执行完毕后,返回/sbin/init进程。此时基本系统环境已经设置,各种守护进程也已经启动。/sbin/init进程接下来会启动6个虚拟终端或者是X Window图形界面来等待用户登录系统。实际参考的选项是在/etc/inittab内的这一段:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingettytty5
6:2345:respawn:/sbin/mingetty tty6
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm–nodaemon
从上面可以看出在2、3、4、5的运行级别时,都会以respawn方式执行/sbin/mingetty程序,mingetty(表示get teletype)程序能启动终端、设置模式,同时它会显示一个命令行式的文本界面。
如果我们使用的是run level 5,那么/sbin/init除了要初始化这6个虚拟终端机之外,它还会执行/etc/X11/prefdm –nodaemon这个命令,prefdm脚本会启动X Window 的图形界面。



三、用户登录
一旦发现有活动的终端(比如,控制台、虚拟终端或者远程的终端模拟器接入),/sbin/mingetty程序会给出login提示符:提示输入用户及口令。
用户的登录方式有三种:
⑴命令行界面登录
⑵图形界面登录
⑶ssh登录
现在简单介绍这三种方式,因为它们都有不同的方式对用户进行认证。
⑴命令行界面登录: /sbin/mingetty接收到用户输入用户名和密码后,就调用/bin/login程序核对用户身份与密码,如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell(/bin/bash)。比如,root用户,实际参考的选项是在/etc/passwd内的这一段:



##以下是控制台终端显示的命令行登录界面的进程情况,如下:



⑵图形界面登录:
如果运行级为5(图形界面启动),init进程调用显示管理器,即则运行xdm程序,给用户提供xdm图形界面的登录方式,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,启动用户的会话。
##run leve 5 终端登录进程情况:



##以下从虚拟终端启动图形界面登录的进程情况:



⑶ssh登录:
init进程调用sshd程序(Debian还会再运行/etc/pam.d/ssh),取代getty和login,然后启动shell。
##以下是sshd登录方式的进程情况:





四、进入 login shell
login程序验证成功后,会向对应的终端在输出最近一次登录的信息(在/var/log/lastlog中有记录),并检查用户是否有新邮件(在/usr /spool/mail/的对应用户名目录下)。
然后开始/bin/bash设置各种环境变量,它会读入一系列的配置文件,不同登录方式也存在差异:
⑴命令行界面登录方式:
对于/bin/bash来说,系统首先寻找/etc/profile脚本文件,并执行它, 这是对所有用户都有效的配置。
然后如果用户的主目录中存在以下三个配置文件:
~/.bash_profile
~/.bash_login
~/.profile
仅执行三者中之一个,其它两个不再执行,比如,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。在这些文件中又可以调用了其它配置文件,所有的配置文件执行完成后,各种环境变量也就设置好了,这时会出现大家熟悉的命令行提示符。
⑵图形界面登录方式:
只加载 /etc/profile 和 ~/.profile。也就是说,~/.bash_profile 不管有没有,都不会运行。
⑶ssh登录
与第一种命令行界面登录方式的情况完全相同
五、打开 non-login shell
上一步完成以后,Linux的启动过程就算结束,用户已经可以看到命令行提示符或者图形界面了。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: