<< Back to shouce.jb51.net

这些脚本工作时,启动过程是怎样的?

Linux 使用的是基于运行级(runlevels)概念的启动工具 -- SysVinit 。在不同系统之间会有很多不同之处,所以不能简单地认为某个系统 <如某个发行版> 上是这么运行的,于是在 LFS 中也会这样。 LFS 有它自己的一套执行机制,当然,LFS 也遵守一般的标准。

SysVinit (下面我们将称之为 init ) 在运行时会使用运行级的配置,一共有七个运行级(实际上,还有更多的通常用不到的特殊用途的运行级,init 的 man 手册会详细说明),在每个运行级中,计算机都要做指定的事。默认的运行级是3。下面是我们常用的几个运行级:

0: 关机
1: 单用户模式
2: 多用户模式,但不提供网络服务
3: 全功能多用户模式
4: 可由用户定制,否则同3
5: 同4,一般用于GUI的登录(如 X 的 xdm 或 KDE 的 kdm)
6: 重新启动机器

用来改变运行级的命令是 init <runlevel>,这里 <runlevel> 是目标运行级。例如,要重启一台计算机,用户可以发出init 6命令。实际上reboot命令只是一个别名,同样的halt命令也是init 0的别名。

在/etc/rc.d下面有很多诸如rc?.d的目录和rcsysinit.d目录,里面有很多符号链接。在这儿,? 是指运行级对应的数字。用户可以看看他们的内容(当这一章结束后,你会发现这些东西并没有你想象的那么复杂)。在这些目录下都会有符号链接文件,它们的名字都是以K或S开头,后面跟有三个数字:000-999。K意味着停止(Kill)一个服务。S意味着开始(Start)一个服务,数字标志着启动过程中的运行顺序,越小的数字在启动过程中越早的执行。当init 转换到其他运行级别时,一些相应的服务会被停止,而另一些服务则会开始。

实际上所有的脚本都在 /etc/init.d 中。它们完成了全部的工作,所有的符号链接都指向它们。停止(killing)的连接和启动(starting)连接指向 /etc/init.d 下的同一个脚本。这是因为调用这些脚本时可以使用不同的参数(例如停止-Stop、开始-Start、重载-Reload、显示当前状态-Status),当一个K连接被使用时,相应地使用Stop参数;S连接被使用时,相应地使用Start参数。

有一个例外。在rc0.d和rc6.d目录中的S链接不会开始任何服务。它们会用stop参数调用,来停止某些服务。这背后的逻辑是,当你准备关机或重启的时候,你不会想开始什么服务,只会停止它们。

下面是脚本的参数:

放心大胆的去修改启动进程的运行方式(因为这是你自己的 LFS 系统)。后面的内容仅仅是一个示例(我们觉得这样很好,当然你有可能觉得不爽)。