22.1.2 init和运行级
init定义了一些被称做“运行级”的东西,这里的“级”是级别的意思,用一些整数表示。进入某一个运行级意味着使用某种特定的系统资源组合。“系统资源”是一个很宽泛的概念,由于几乎所有的进程都是由init创建的,因此理论上可以完全控制在某个运行级下应该运行哪些进程。从某种意义上,init的运行级有点快餐店里“套餐”的味道,顾客可以说“来一份1号套餐”,于是服务员就端上汉堡、薯条和可乐。
Linux的init进程总共支持10个运行级,但实际定义的运行级只有7个。表22.1显示了这些运行级及其对应的系统状态。
表22.1 运行级及其对应的系统状态
运 行 级 |
系 统 状 态 |
0 |
系统关闭 |
1或S |
单用户模式 |
2 |
功能受限的多用户模式 |
3 |
完整的多用户模式 |
4 |
一般不用,留作用户自己定义 |
5 |
多用户模式,运行X窗口系统 |
6 |
重新启动 |
目前绝大部分的Linux发行版本默认都启动计算机至运行级5,也就是带有X窗口系统的多用户模式。服务器通常不需要运行X,因此常常被设置进入运行级3。运行级4被保留,方便管理员根据实际情况定义特殊的系统状态。
单用户模式是关于系统救援的。在这个运行级下,所有的多用户进程都被关闭,系统保留最小软件组合。引导系统进入单用户模式后,系统会要求用户以root身份登录到系统中。在2.4节提到的“救援模式”就是典型的单用户模式。
0和6是两个比较特殊的运行级,系统实际上并不能停留在这两个运行级中。进入这两个运行级别意味着关机和重启。使用telinit命令可以强制系统进入某个运行级。运行下面这条命令后,系统就进入运行级6,也就是关闭计算机,然后再启动。
sudo telinit 6
尽管表22.1明确地列出了所有7个运行级代表的系统状态,但事实上这只代表了大部分系统的习惯做法。在某一台特定的计算机上,管理员可能会根据实际情况调整配置:例如让运行级3也能启动X窗口系统。init的配置文件是/etc/inittab,这个文件中定义了每个运行级上需要做的事情。下面是opensuse Linux中inittab文件的一部分。
# runlevel 0 is System halt (Do not use this for initdefault!)
# runlevel 1 is Single user mode
# runlevel 2 is Local multiuser without remote network (e.g. NFS)
# runlevel 3 is Full multiuser with network
# runlevel 4 is Not used
# runlevel 5 is Full multiuser with network and xdm
# runlevel 6 is System reboot (Do not use this for initdefault!)
#
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
#l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
以“#”开头的行是注释行,紧跟在后面的这些行定义了在每个运行级下应该做的事情。inittab文件通常并不会一一列出所有应该执行的脚本,而是调用rc脚本(通常是/etc/init.d/rc)改变运行级。rc脚本随后根据传给它的参数查找与运行级有关的目录,并执行其中的脚本。
这些“与运行级有关”的目录总是以rclevel.d的形式出现,其中level就是运行级编号。例如所有要在运行级1下执行的脚本都保存在rc1.d目录下,而为了进入运行级3,那么就执行位于rc3.d目录下的脚本。通常,这些目录不是在/etc目录下,就是在/etc/init.d目录下。
$ ls -d /etc/rc* ##列出/etc目录下所有以rc开头的目录
/etc/rc0.d /etc/rc1.d /etc/rc2.d /etc/rc3.d /etc/rc4.d /etc/rc5.d /etc/rc6.d /etc/rcS.d
很显然,为了改变某个运行级所使用的系统资源组合,可以在这些目录下添加/删除相应的脚本。rclevel.d目录下的脚本文件有自己一套独特的命名和实现方法,将在22.1.3节讨论。
很容易改变Linux的默认运行级。在/etc/inittab文件中找到下面这一行:
id:5:initdefault:
这一行设置将Linux默认启动到运行级5。如果要让Linux默认启动到运行级3,可以把它改成下面这样:
id:3:initdefault: