系统的开机启动研究只从init进程接管了之后说起,开机运行到init后,通过/etc/inittab 确定了系统的runlevel和将要运行的脚本。系统层的启动,一切从这里起源,以下的说明可以通过跟踪相关文件来得知,这里仅做一些总结性的说明。

最常见的方式

  1. 通常需要开机启动的脚本统一放置在/etc/init.d 或者 /etc/rc.d/init.d 目录下。
  2. 在/etc或者/etc/rc.d/目录下有 rc5.d/rc4.d…等目录,里面放置了在各种runlevel下要执行的脚本,而且文件名是特殊格式的命名,可以用来控制执行顺序。目录下的脚本都是软链接,指向init.d目录下的真正的脚本。
  3. 以上的机制通常也定义了rc.local 为系统启动后最后的执行文件。

如果要关闭某些程序的开机启动,只需要将rc5.d/S…文件改为 rc.5/K… ,由S开头改为K开头的就行。

某些嵌入式系统可能采用的方式

  1. 第一步还是差不多,将开机时可能需要用到的脚本统一放置在/etc/init.d 或者 /etc/rc.d/init.d 目录下。
  2. 没有通过不同的目录来区分不同的runlevel,而且可能将所有开机启动的脚本全部列在某个配置文件中,顺序也是在配置文件中定义好的。
  3. rc.local 并不一定是系统启动阶段最后执行的脚本文件,这个需要特别注意,只将通用的一些命令放在这里,具体在某个正在研发的设备的非通用外设的命令很可能无法生效。

定义自己的开机顺序

要想在开机启动过程中启动某个程序,大体上有3种方法。。

  1. 直接在某个文件中启动,比如rc.local 里启动。
  2. 直接将脚本文件放在某个目录下
  3. 根据某种工具的要求,按照格式要求新增启动脚本,然后将此脚本利用工具注册到系统中。

这3种方法本质上还是利用了上述的启动过程原理,方法3只不过是借助了工具来管理而已,本质上与其它方法没有区别。选择某个方式的时候,可以按照如下的需求来做决定:如果启动脚本很简单,只有简单的几行命令,可以使用方法1;如果启动脚本很复杂,需要监测环境,进行复杂的设置时,可以使用方法2; 如果启动脚本对应的服务需要在启动后被人为的停止、再启动话,最好采用方法3,支持简单的命令来启动、停止、重新启动等需求。

涉及管理开机启动服务的工具有:

  1. chkconfig
  2. crontab
  3. rcconf
  4. update-rc.d
  5. systemctl
  6. sysv-rc-conf

上面是总结了系统在开机启动过程涉及的一些知识,这个启动过程是在用户登录之前。那么用户登录的过程中,调用脚本的一些情况是怎么样的顺序呢?这里也总结下:

  1. /etc/profile 脚本文件被执行,通常该脚本会去遍历/etc/profile.d目录下的*.sh文件并执行。这个是所有用户都有效的配置。
  2. ~/.bash_profile、~/.bash_login、~/.profile 这3个文件是按照顺序查找的,一旦找到某一个,后面的就忽略了。针对当前用户的配置放在这里,只在用户第一次登录的时候执行。
  3. ~/.bashrc,前面的步骤都是在需要用户输入用户名密码等录时启用,登录之后,用户再次打开shell,并不会执行前面的过程。每次打开shell都会运行的脚本放在这里,这里的配置不会被继承。