首页 > 代码库 > Linux启动原理介绍及设置开机启动脚本方法

Linux启动原理介绍及设置开机启动脚本方法

转自本人个人博客:http://www.xgezhang.com/linux_init_shell.html


之前总是对Linux的整个启动脉络不了解,把这个问题看得很神秘,昨天稍微研究了一下,其实还是很简单的。

    Linux启动时,所有的启动脚本都放在/etc/init.d/ 下面,而这些脚本又有映射到各个/etc/rcX.d,这个X代表0-6,分别对应不同的系统级别:

  • 0代表关机(halt)
  • 1级别是单用户模式(single)
  • 2级别是多用户级别,这个是默认级
  • 3,4,5未定义,可以提供给用户定义其他多用户级别
  • 6代表重启(restart)
  • S级别系统内部定义的单用户恢复模式。

    也就是说,每一个rcX.d文件里面都会有一些启动项,每个目录下的文件数量是小于 /etc/init.d目录下的总数。对于不同的系统环境,只会运行对应目录中的进程。用户可以通过 runlevel 指令查看本机系统运行级别。

    在每一个rcX.d目录中,文件都是通过/etc/init.d里的脚本软连接过来的,命名方式如下:

    [K|S][0-9,0-9][name]

    K表示stop服务,而S表示start服务, 比如S20hostapd S91apach2

    后头跟的两位数数字则是表示运行顺序,小数字优先运行。比如上述启动项,显然apache2服务器需要在前面的网络进程、dns进程等开启之后再打开。

    对于不同的文件,总是按照K小数->K大数->S小数->S大数的顺序执行,并且所有文件都会执行。

    这里补充一下,多数的linux都是用一种叫System V的机制来启动运行级别,会有一个inittab文件来更改默认配置,并且在所以进程开始之前会先执行sysinit目录下的进程,而ubuntu是用的另一种机制叫startup,从9.10版本之后就没有兼容inittab等方式了,所以找不到这些东西。

    介绍完了,那么我们要怎么设置一个开机启动脚本呢?方法有两种:

    1.编辑rc.local文件

    这是一个给使用者自定义的启动文件,启动顺序在最后,即在启动了rcX.d之后执行,有点类似于windows下面的启动项。我们可以把自己的脚本内容直接编辑到rc.local文件中。这样的做法优点是比较方便,缺点是如果脚本太多不便于管理

    2.添加脚本文件到init.d中,并构建软链接

    我们可以把写好的脚本,拷贝到/etc/init.d目录下。然后查看本机的运行级别,比如为2.然后添加一个软链接,比如:

     ln  -s /etc/init.d/myshell   /etc/rc2.d/S60mysqld  

    或者这里介绍一个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

    比如:update-rc.d myshell start 90 1 2 3 4 5 . stop 52 0 6 .
    start 90 1 2 3 4 5 . : 表示在1、2、3、4、5这五个运行级别中,按先后顺序,由小到大,执行顺序是90。
    stop 52 0 6 . :表示在0、6这两个运行级别中,按照先后顺序,由小到大,第52个停止这个脚本的运行。

    最后提一点,如果想要删除某个运行级别所要运行的服务,可以把相应rcX.d文件夹里的软连接名字的第一个字母小写(这个是debian的文章推荐的做法,也是bum的做法),也可以删除这个软连接(这个是sysv-rc-conf的做法)。具体怎么做就看各位了。

    欢迎转载,请注明出处。


Linux启动原理介绍及设置开机启动脚本方法