服务端测试中,经常需要在虚拟机或物理机(linux系统)内部进行一些服务或应用程序、脚本的自启动配置,以达到应用可以实现开机自启动的目的。想要实现这部分的功能,首先需要对linux的启动及加载流程有一定的了解,才能更好的在测试中对其进行实现及应用。本文们将首先介绍一下 linux的启动加载流程(以redhat系统为例),让大家可以抓住linux启动的脉络,使linux的启动过程不再神秘;然后将介绍常用的几种linux的自启动配置方法及实践,方便大家在测试中进行使用。
Linux的启动及加载流程
1、Redhat的启动方式和执行次序
· 加载内核
· 执行init程序
· /etc/rc.d/rc.sysinit # 由init执行的第一个脚本
· /etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式
· /etc/rc.d/rc.local
· /sbin/mingetty # 等待用户登录
其中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:
· 调入keymap以及系统字体
· 启动swapping
· 设置主机名
· 设置NIS域名
· 检查(fsck)并mount文件系统
· 打开quota
· 装载声卡模块
· 设置系统时钟,等等。
2、Linux /etc/rc.d/目录的详解
rc.d的内容如下:
· init.d/ :各种服务器和程序的二进制文件存放目录。
· rcx.d/: 各个启动级别的执行程序连接目录。里头的东西都是指向init.d/的一些软连接。具体的后边叙述。
· 还有三个脚本:rc.sysinit, rc,rc.local。
其中,/etc /rc.d/rc则根据其参数指定的运行模式(运行级别,你在inittab文件中可以设置)来执行相应目录下的脚本。凡是以Kxx开头的 ,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。调用的顺序按xx 从小到大来执行。例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调用 /etc/rc.d/rc3.d/下的脚本。
值得一提的是,Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。
程序开机自启动实现方法
在对linux系统的启动加载流程有了初步的了解以后,我们可以通过在流程中不同阶段的调用来实现服务及程序的开机自启动,本文中我们介绍两种常用的方法:rc.local以及 /etc/init.d配置。
方法一:通过在 /etc/rc.local添加对应的服务或脚本,来实现开机自启动
通过前面启动加载流程的介绍,我们可以了解到,rc.local是开机启动流程中最后一个加载的脚本,所以我们可以将我们想要加在的服务放到该脚本中来实现服务的自启动。
这种方式实现起来也是非常简单的,有任何想要在开机时就进行的程序或服务,直接将他写入 /etc/rc.local,那么该工作就会在开机的时候自动被载入,而不必等我们登入系统去启动呢!也就是说,在linux启动的最后阶段,系统会执行存于rc.local中的命令。和windows里面的“启动”菜单有点像,但是设置麻烦些,功能更强大。
PS:对于在rc.local中想要进行自启动的服务,一定要添加在exit之前,否则的话将不会被执行。
方法二:通过 /etc/init.d配置添加启动服务来实现
这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。系统在安装时装了好多 rpm包,这里面就有很多对应的脚本。执行这些脚本可以用来启动,停止,重启这些服务。举个例子来说,如果你要重新启动 sendmail 的话,而且你的 sendmail 是以 rpm 来安装的,那么下达 /etc/rc.d/init.d/sendmail restart 就可以直接启动 sendmail 啰!
前面说到,/etc/rc.d/init.d这个目录下的脚本就类似与windows中的注册表,在系统启动的时候执行。程序运行到这里(init进程读取了运行级别),是该运行init.d里的脚本了,但是并不是直接运行,而是有选择的因为系统并不需要启动所有的服务。
那么,系统是如何选择哪些需要启动哪些不要呢?这时刚才说的运行级别就起作用了。在决定了系统启动的run level之后,/etc/rc.d/rc这个脚本先执行。在RH9和FC7的源码中它都是一上来就check_runlevel()(虽然实现的代码不一样,也大同小异),知道了运行级别之后,对于每一个运行级别,在rc.d下都有一个子目录分别是rc0.d,rc1.d ….. rc6.d(一般我们用的级别在2/3/5几个级别中选择)。
每个目录下都是到init.d目录的一部分脚本一些链接。每个级别要执行哪些服务就在相对应的目录下,比如级别5要启动的服务就都放在rc5.d下,但是放在这个rc5.d下的都是一些链接文件,链接到init.d中相对应的文件,真正干活到init.d里的脚本。