Ubutun 10.04中的启动项和运行级别
Ubuntu 10.04中对于运行级别(runlevel)的配置和一般的Linux系统不同。一般的Linux在/etc/inittab中配置运行级别和启动项。
而在Ubuntu10.04中,并没有使用inittab文件来配置系统启动项和运行级别。所有类似的功能是通过Upstart来实现的。要了解Ubuntu中的启动项和运行级别的配置,首先需要了解其启动过程。在Ubuntu的启动过程中,顺序依次为:内核启动init->init导入/etc/init/rc-sysinit.conf->运行/etc/init.d/rc->运行/etc/rc[x].d脚本。
首先来看看/etc/init/rc-sysinit.conf。在ubuntu10.04中,/etc/init/rc-sysinit.conf类似于inittab文件,默认运行级别是在该文件中配置的(通过设置envDEFAULT_RUNLEVEL)。值得注意的是,在这个文件中有一行代码:if[ -r /etc/inittab ],说明在ubuntu中,用户依旧可以按照自己的习惯,通过inittab来配置启动服务项和运行级别。
然后来看看/etc/init.d/rc文件。该文件为系统做了一些初始化的设置。包括PATH、umask等一系列操作。Rc文件中有这么一些命令
...for s in/etc/rc$runlevel.d/K*...
...for s in/etc/rc$runlevel.d/S*...
这说明rc文件会根据运行级别去执行rc[x].d中的脚本。
设置好运行级别x后,可以在对应的/etc/rc[x].d文件夹中查看对应的运行级别需要启动的服务的符号链接。该文件夹中的大多数文件都以SxxxName命名的,其中S表示START,xxx表示启动的顺序,Name表示需要启动的服务。因此,如果需要取消某个服务,只需要将对应启动项的S改成K(以STOP参数来调用),然后运行update-rc.d即可。很多rc[x].d中都有S99rc.local ->../init.d/rc.local这一项,因此可以在rc.local中配置自定义的启动项。要注意的是,rc.local中只要有一条语句出错,执行就会退出,造成rc.local未执行的假象,所以务必保证rc.local文件中命令的正确性。
Inittab配置
Inittab文件以identifier: run_level : action : process的结构启动项。各字段的含义分别为:
- identifier:标识符号,最多为4个字符,用于唯一的标识文件中的每项
- run_level:系统运行级别,用于指定相应的项适用于哪一个运行级别。如果该字段为空,那么相应的项将适用于所有运行级别。在该字段中,可以同时指定一个或者多个运行级别。各运行级别分别以数字0-6或字符a-c表示,且无需对其进行分隔
- action:动作关键字,用于制定init进程或者其他进程对应process所实施的动作。具体动作包括:
- boot:在引导过程中执行该进程;不等待进程结束;进程死亡时不重新启动进程
- bootwait:在引导过程中执行该进程;等待进程结束;进程死亡时不重新启动进程(如果系统的默认运行级别设置为单用户方式,在系统被引导并从单用户方式进入多用户方式时,这些项才被处理;如果系统的默认运行级别设置为多用户方式,在系统引导后,这些项会马上被处理)
- initdefault:指定系统的默认运行级别。系统启动时,init会首先查找该项,如果该字段不为空,则init将据此决定系统最初要进入的运行级别。init将run_level字段中的最大数字为当前默认的运行级别;如果该字段为空,那么将其解释为“0123456”,并将其中的最大值“6”作为默认运行级别;如果该字段不存在,那么init将要求用户在系统启动时指定一个最初的运行级别
- off:如果相应的进程正在运行,那么就发出一个警告信号,等待20秒后,再通过杀死信号强行终止该进程。如果相应的进程不存在,则忽略该项。也可以用来将一条配置失效。
- once:启动相应的进程;不等待其结束便继续处理/etc/inittab文件中的下一项;该进程死亡时不重新启动进程;当从一个运行级别进入另一个运行级别时,如果相应的进程已存在,则不重新启动
- ondemand:与“respawn”的功能完全相同,但只用于运行级别为a-c的项
- powerwait:init收到SIGPWR信号时激活该进程;UPS电源在电源发生问题时会向该进程发送信号;init进程会等待该进程至进程终止
- powerfail:同powerwait;不等待进程结束
- ctrlaltdel:当init接收到SIGINT信号时,激活对应进程
- kbrequest:当init接收到键盘信号时,激活对应进程
- respawn:如果对应的进程不存在则自动启动进程;如果对应的进程死亡时,init重新启动该进程;如果对应的进程已存在,则忽略;不等待其结束便继续处理/etc/inittab文件中的下一项
- sysinit:在启动或重新启动系统并首先进入单用户时,init执行该项;如果运行级别为1-6则不执行该项;在run_level不指定任何运行级别
- wait:启动进程并等待结束;然后处理/etc/inittab文件中的下一项
- process:要执行的shell命令。只要符合shell语法,都可适用于此
update-rc.d的使用
1、设置指定启动顺序、指定运行级别的启动项:
update-rc.d<service> start<order><runlevels>
2、设置在指定运行级中,按指定顺序停止:
update-rc.d<service> stop<order><runlevels>
3、从所有的运行级别中删除指定的启动项:
update-rc.d-f <script-name>remove