前面的文章谈了Grub(瓜逼)引导相关的一些问题。正常引导内核并加载后,即进入操作系统的系统初始化阶段。这篇文章浅谈一下linux系统初始化过程。
由于篇幅比较长,为方便大家在零碎时间能够一口气看完并理解,我将这个题目分成了2篇文章来写。
内核被引导后,会创建系统的第一个进程:init进程,init进程再通过读取该进程的配置文件,或者我们手动传递过来的一些参数(交互式启动),配置相应的初始化环境和服务等。
init进程是操作系统的第一个进程,也叫祖先进程,它的PID永远是1,其余的所有进程都是它的子孙进程,在Linux系统中,如果父进程关闭,那么其子进程也随之关闭,因此,这个进程如果被枪毙了,那么所有的进程也就自动退出了,该进程的配置文件为/etc/inittab(其实不同的linux系统位置是有可能不一样的,但文件名和原理是一样的),我们来看看这个配置文件的内容:
id:5:initdefault: #数字5表示启动的级别,5表示图形界面启动;
10:0:wait: /etc/rc.d/rc 0
……
16:6:wait : /etc/rc.d/rc 6 # 启动级别为6时,传递给rc程序的参数为6,则启动/etc/rc.d/rc6.d中的服务;
ca::ctrlaltdel : /sbin/shutdown -t3 -r now # 同时按下ctrl+alt+del后,等待3秒重启;
pf::powerfail : /sbin/shutdown -f -h +2 #UPS供电不足时,自动关机;
pr: 12345: powerokwait: /sbin/shutdown -c # UPS供电恢复后,取消自动关机(排除电源不稳情况);
1:2345:respawn: /sbin/mingetty tty1
……
6:2345: respawn: /sbin/mingetty tty6 # 这几行用于启动6个字符终端;
x: 5: respawn: /etc/x11/prefdm -nodaemon #如果启动的级别为5,则启动xwindows图形界面。
由/etc/inittab这个配置文件可知,操作系统的启动级别在这里被定义了,如果在系统启动时不传参数给内核,则系统根据该文件的配置作为启动级别的依据;但如果在系统刚刚被引导时,我们传递了启动参数给内核,那么将以传递的参数为准。
init进程被创建之后,将执行/etc/rc.d/rc.sysinit这个程序,实际上,rc.sysinit这个程序我们可以用less、more、cat等命令来查看就可知,它实际上是一个shell脚本,在这个脚本中,定义了系统启动时的一些必要的服务,待该程序执行完毕后,再根据/etc/inittab(或者传递的参数)定义的启动级别,执行对应的文件夹下的额外服务。例如:如果启动级别为5,则执行/etc/rc.d/rc5.d这个目录下的一系列服务,即假设启动级别为N,那么就会执行/etc/rc.d/rcN.d目录下定义的服务。
我们用ls -l这个命令来看看/etc/rc.d/rc5.d这个目录里面的服务是怎么样的。可以看见该目录下列出了一个一个的文件名,其名字定义如下:
S10network------>/etc/rc.d/init.d/network
其名字分为3段,第一段为一个字母K或者S,其中K表示Kill,即结束这个服务,S表示Start,即启动这个服务;后面是1-99之间的一个整数,这个数字代表了启动的顺序,数字越小越先启动;最后一串字母是实际服务的名字,如network表示网络服务的名字。所有的文件类型都是l软链接文件,其实际指向的位置都在/etc/rc.d/init.d这个目录里面。需要注意的是,在rcN.d目录里,先执行K的服务,再执行S的服务,即先复原,再启动服务。
由此,我们可以得出一些结论,限于篇幅问题,我将在下一篇文章中载出,也算卖个小关子吧。
哈哈哈,你懂的。
- 我的微信
- 这是我的微信扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-