/sbin/init讲解

/sbin/init程序是系统中所有程序的父进程。这个进程的PID总是1,它负责启动组成Linux操作系统的其他进程。那些使用过一段时间Linux操作系统的用户都知道,Ubuntu服务器上的init程序与大家之前习惯使用的init程序不同。它们在如何初始化UNIX操作系统方面有一些不同的标准,但是绝大多数传统Linux发行版都使用著名的System V init模型(马上就会讲到),然而一些现代Linux发行版选择使用其他系统,如Upstart,或者最近的systemd。例如,Ubuntu服务器选择使用Upstart,但它仍然保留了System V init程序的杰出结构,如运行等级(runlevel)和针对向后兼容的/etc/rc?.d文件夹,而且Upstart现在开始处理底层所有的工作。因为服务器上最常使用的两种init系统是Sytem V init和Upstart,所以下面就分别介绍它们。
1. 传统的System V Init
System V指的是由AT&T开发的原始UNIX操作系统中的一个特定版本。在这种风格的init程序中,init进程会读取/etc/inittab的配置文件,通过它来查看默认的运行等级,下面会讨论到这点。然后进入这个运行等级,启动配置在这个运行等级下应该启动的进程。
System V init进程由很多称为运行等级的不同系统状态定义。运行等级用数字区分,从0到6,每个数字代表了一个完全不同的系统状态。例如,运行等级0留给了停止的系统状态。当你进入运行等级0,系统就会终止所有的运行进程,卸载所有的文件系统并断电。类似地,运行等级6代表重启机器。运行等级1代表单用户模式—仅有单个用户可以登录到系统中的状态。通常,没有几个进程能在单用户模式下启动,所以这个运行等级在处理系统无法完全启动的问题上非常有用。在默认的GRUB菜单中能看到一个恢复模式,它会启动进入运行等级为1的系统状态中。
运行等级2到5留给发行版使用,最终由用户来定义。定义诸多运行等级的想法是让你创建进入服务器的不同模式。很多Linux发行版都会为图形桌面设置一个运行等级(在Red Hat中,为运行等级5),并为非图形界面设置另一个运行等级(在Red Hat中,为运行等级3),这是一个传统的做法。你也可以定义其他的运行等级,例如,为启动不带网络访问的系统定义一个运行等级。然后在启动的时候,根据提示输入一个参数,用你指定的运行等级覆盖默认的运行等级。系统启动之后,你也可以用init命令后跟着运行等级的方式更改当前的运行等级。所以,想要更改为单用户模式,应该输入sudo init 1。
除了/etc/inittab,对于System V init系统启动和关闭脚本或者初始化脚本,以及系统的主要服务来说,还有很多其他重要的文件和文件夹。
/etc/init.d
该文件夹包含所有服务在各个运行等级中的全部启动脚本。一般来说,它们都是标准的shell脚本,遵守最基本的标准。每个脚本最少接受两个参数start和stop,它们分别代表启动和停止服务(如网页服务)。除此之外,init脚本通常还会接受一些额外的选项,如restart(重启服务器)、status(返回服务当前状态)、reload(告知服务从配置文件中重新载入配置)以及force-reload(强制服务重载它的配置)。当用不带参数的方式运行脚本的时候,一般应该返回一个它会接受的参数列表。
/etc/rc0.d~/etc/rc6.d
这些文件夹分别包含每个运行等级对应的init脚本。在实际使用中,它们一般通过符号链接到/etc/init.d文件夹下的实际文件。不过要注意的是,这些文件夹下的init脚本都有一些特别的名字,命名都以S(start)、K(kill)或D(disable)开头,后面跟一个数字。当init进入一个运行等级的时候,它会按照数字顺序运行所有以K开头的脚本并传入stop参数,除非对应的init脚本在前一个运行等级中没有启动。然后init按照数字顺序运行所有以S开头的脚本并传入start参数。任何以D开头的init脚本都会被忽略—这让你可以在指定的运行等级禁止一个脚本,或者你也可以仅仅移除全部符号链接。所以如果你有两个脚本,S01foo和S05bar,init首先会运行S01foo start,当它进入特定的运行等级后再执行S05bar start。
/etc/rcS.d
在这个文件夹中,你会找到在变更到特定的运行等级之前,运行的所有系统init脚本。修改这个文件夹中的脚本时要小心,因为如果它们停止工作,你将无法进入单用户模式。
/etc/rc.local
并非所有的发行版都使用了rc.local,通常它是一个留给用户修改的shell脚本。一般会在init进程结束的时候运行它,所以你可以在这里放一些想要运行的额外脚本,而不用再创建自己的init脚本。
这里有一个标准的System V init系统的启动过程。首先init启动并读取/etc/inittab文件以确定默认的运行等级,在这个例子中,运行等级为2。然后init进入/etc/rcS.d文件夹,按照数字顺序用start作为参数运行所有以S开头的脚本文件。然后init在/etc/rc2.d文件夹中做相同的工作。最后init执行完毕,但是还会在后台运行,等待运行等级的更改。
2. Upstart
System V init是一个非常优秀的系统,而且在Linux系统上也工作了很多年,不过,它并非完美无瑕。例如,当服务宕掉的时候,init脚本没有一个自动重启机制,你必须借助其他工具来监视和重启这些进程。
init脚本的另一个问题是它们通常仅受到根据运行等级更改或者系统启动的影响,除此之外,除非手动操作,这些脚本都不会运行。依赖网络连接的init脚本就是一个非常好的例子。在基于Red Hat和基于Debian系统中,名为network或networking的init脚本分别用来建立网络连接。任何依赖于网络连接的init脚本与其他脚本相比都有一个很大的数字,这样才能保证网络脚本运行之后它们才运行。但是如果你拔掉服务器的网线,再启动会怎样呢?网络脚本还会执行,但是所有依赖网络连接的init脚本都会一个接一个地超时。最后你会得到一个登录提示并可以登录。等你登录之后,如果你插上网线,重启网络服务,你会连上网络,但是没有一个需要网络连接的服务会自动重启,你必须一个个地手动启动这些服务。
Upstart的设计初衷并不仅仅是为了弥补System V init的缺陷,而且还为了提供更加健壮的服务管理。Upstart的一大特性是它由事件驱动。Upstart持续监控系统中特定事件的发生,当这些事件发生的时候,Upstart就会基于这些事件做出相应的动作。事件可能是系统启动、系统关闭、按下Ctrl-Alt-Del组合键、运行等级更改或者Upstart脚本的启动或停止。要弄清楚事件驱动的系统如何改进了传统的init脚本,让我们以前面拔下网线启动服务器为例。你可以创建一个Upstart脚本,当插入网线的时候会触发这个脚本。接着,这个脚本会为你启动网络服务。然后,当网络服务成功启动之后,你就可以配置触发任何需要网络连接的服务。现在当系统启动的时候,插上网线即可,Upstart脚本会帮你完成剩下的工作。
Upstart并没有完全替代System V init,至少对于系统服务来说没能完全替代。目前,Upstart的确替代了int和/etc/inittab文件的功能,它管理运行等级的更改、系统启动和关闭以及控制ttys。Upstart脚本中移植了越来越多的功能,但是你仍然会在/etc/init.d中找到部分标准的init脚本,所有标准的symlink都在/etc/rc?.d文件夹中。不同的是,当运行等级更改的时候,Upstart会开启或者停止服务。
Upstart脚本在/etc/init文件夹中,它们与init脚本的区别很大,因为它们不是常规的shell脚本。为了帮助解释它的语法,下面是一个Upstart脚本(/etc/init/rc.conf)的例子,在运行等级更改的时候会触发这个脚本。
来源:http://book.51cto.com/art/201405/438600.htm

此条目发表在lnmp分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据