转载linux
1、Linux的引导过程windows
系统启动以后,在进入init.d以前,咱们先来看看系统都作了什么工做。系统加电以后,首先进行的硬件自检,而后是bootload对系统的初始化,加载内核。网络
内核被加载到内存以后,就开始执行了。一旦内核启动运行,对硬件的检测就会决定须要对哪些设备驱动进行初始化。数据结构
从这开始,内核就可以挂装根文件系统(这个过程相似于Windows识别并存取C盘的过程)。内核挂装了根文件系统,并已初始化全部的设备驱动程序和数据结构等以后,就经过启动一个叫init的用户级程序,完成引导进程。rest
2、 运行级别(run level)
Init进程是系统启动以后的第一个用户进程,因此它的pid(进程编号)始终为1。init进程上来首先作的事是去读取/etc/目录下inittab文件中initdefault id值,这个值称为运行级别(run-level)。它决定了系统启动以后运行于什么级别。运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6 ,具备不一样的功能。不一样的运行级定义以下:
# 0 - 停机(千万别把initdefault设置为0,不然系统永远没法启动)
# 1 - 单用户模式
# 2 - 多用户,没有 NFS
# 3 - 彻底多用户模式(标准的运行级)
# 4 – 系统保留的
# 5 - X11 (x window)
# 6 - 从新启动 (千万不要把initdefault 设置为6,不然将一直在重启 )blog
3、 /etc/rc.d/与/etc/rc.d/init.d的关系
写到这里,应该差很少要进入init.d了,但是我以为单写/etc/rc.d/init.d的话不必定能说得清楚明白,就拿它跟/etc/rc.d这个它上一级的目录一块儿来讨论,可能比较合适一些,由于他们之间有着千丝万缕的关系。
在这里先解释一下init.d里面放的都是什么东西。这个目录存放的是一些脚本,通常是linux以rpm包安装时设定的一些服务的启动脚本。系统在安装时装了好多rpm包,这里面就有不少对应的脚本。执行这些脚本能够用来启动,中止,重启这些服务。
前面说到,/etc/rc.d/init.d这个目录下的脚本就相似与windows中的注册表,在系统启动的时候执行。程序运行到这里(init进程读取了运行级别),相信从命名的角度你们也能猜到该运行/etc/rc.d/init.d里面的脚本了,否则它为何也叫init(.d)呢是吧。没错,是该运行init.d里的脚本了,可是并非直接运行,而是有选择的由于系统并不须要启动全部的服务。
那么,系统是如何选择哪些须要启动哪些不要呢?这时刚才说的运行级别就起做用了。在决定了系统启动的run level以后,/etc/rc.d/rc这个脚本先执行。在RH9和FC7的源码中它都是一上来就check_runlevel()(虽然实现的代码不同,也大同小异),知道了运行级别以后,对于每个运行级别,在rc.d下都有一个子目录分别是rc0.d,rc1.d ….. rc6.d。每一个目录下都是到init.d目录的一部分脚本一些连接。每一个级别要执行哪些服务就在相对应的目录下,好比级别5要启动的服务就都放在rc5.d下,可是放在这个rc5.d下的都是一些连接文件,连接到init.d中相对应的文件,真正干活到init.d里的脚本。排序
到这里,估计你们可能都比较清楚了,我开始也觉得是这样的。但是后来我仔细看过和比较这些连接文件和init.d里真正被执行的脚本的文件名以后,一直有几个问题没弄明白。借着写这个文章的机会,我作了一些功课,总算是大概解开了那些疑惑。
一、这些连接文件前面为何会带一个Kxx或者Sxx呢?
是这样的,带K的表示中止(Kill)一个服务,S表示开启(Start)的意思
二、K和S后面带的数字呢?干什么用的
这个我开始的时候还觉得是排列起来好看或者数数用呢。后来发现不是的。它的做用是用来排序,就是决定这些脚本执行的顺序,数值小的先执行,数值大的后执行。不少时候这些执行顺序是很重要的,好比要启动Apache服务,就必须先配置网络接口,否则一个没有IP的机子来启动http服务那岂不是很搞笑。。。
三、无心中我发现同一个服务带S的和带K的连接到init.d以后是同一个脚本。我就纳闷了,为何会是执行同一个脚本呢?
这个时候真是S和K的妙用了,原来S和K并不止是用来看起来分的清楚而已。S给和K还分别给init.d下面的脚本传递了start和stop的参数。哦,是这样的(焕然大悟的样子,呵呵)!这时我才想起来原来曾经无数用过的/etc/rc.d/init.d/network restart命令。原来传S时至关于执行了/etc/rc.d/init.d/xxx start这条命令,固然K就至关于/etc/rc.d/init.d/xxx stop了。接口
4、/etc/init.d 是 指向 /etc/rc.d/init.d 的软连接。进程