运行级别和启动脚本
init概述
init是系统引导起来后第一个运行的进程,从很多方面来说,它都是最重要的守护进程。它的进程号始终是1,而且是除了几个系统进程之外所有用户进程的祖先。
init 最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语言、文件系统格式及其他服务的启动等。而所有的动作都会通过 init的配置文件/etc/inittab来规划,而inittab 内还有一个很重要的设定内容,那就是默认的 run level (运行级别)。
init至少定义了7个run revel(运行级别),每一个运行级别都代表着系统应该补充运行的一组特定服务:
- 0表示关机;
- 1表示单用户;
- 2表示没有网络的命令行级别;
- 3命令行级别(大多服务器都用这个级别);
- 4为保留级别;
- 5为图形化级别;
6为重启。
启动脚本
一般的,我们都会将启动脚本拷贝到/etc/init.d目录下,每个脚本负责一个守护进程或者系统的某个特定方面。这些脚本都知道start和stop这两个参数表示它们所处理的服务是进行启动还是停止。大多数启动脚本还认识restart参数,该参数一般等同于先执行stop后再执行start。
当系统引入到一个新的运行级别时,它不是直接在init.d目录下寻找脚本,而是查找rc(level).d目录,这里的revel就要就进入的运行级别编号(例如rc0.d、rc1.d等)。rc(level).d目录下所包含的文件都会软链接到init.d目录下的启动脚本上,它们都以S或K开头(表示start或kill),后跟一个数字以及该脚本所控制的服务名。
/etc/rc(revel).d/目录大致内容如下所示:
当init从低运行级别向高级过渡时,会按照数字的递增顺序,带start参数执行所有以S开头的脚本;当init从高运行级别向低级别过渡时,则按照数字的递减顺序,带stop参数执行所有以K开头的脚本。
这种机制能让系统管理员更加细微力度地控制启动服务的顺序,但在加入新服务的时候,应当考虑到启动脚本之间的一些依赖关系。例如,在网络服务network启动之前先启动sshd就没有意义。虽然他们都配置了在2 revel启动,但是network的脚本序号为10,而sshd的序号为55,所以network服务肯定先运行。
还有一个在系统引导时运行的/etc/rc.local脚本。它作为启动过程的一部分,是最后一个运行的脚本,我们一般把一些特有的启动项或启动之后的任务加入这个脚本。