Joe Brockmeier 研究了 Slackware Linux init 进程。他讨论了系统如何初始化服务、各种运行级别是什么,连同如何从缺省安装中添加或除去服务来定制系统。

Linux 用户正日益成熟,这意味着他们想要将系统配置成执行他们希望完成的任务。但现在 Linux 发行版通常都附带了自动配置的设备和启动服务,如 Sendmail 或 Apache。这些发行版没有考虑到的是毫不更改其缺省配置来运行服务,如 Apache -- 用户毫不知情 -- 会让黑客和利用脚本捣乱的人趁虚而入。而且这会用完本能够更好利用的系统资源 -- 比如能够用于 Quake 或您喜欢的编译器的更多处理器时间。由于缺少控制是件“糟糕的事”,因此让我们看一下 Linux 系统引导时在 init 进程期间,在所涉及的各个运行级别上都发生了什么,连同如何在系统运行时定制系统或在运行级别之间转换。

我们的示例使用 x86 平台上的 Slackware Linux 发行版(请参阅本文后面的 参考资料 )。大多数信息可用于其他 Linux 发行版,但在细节处会略有不同。尤其是,和其说 Slackware 的 init 结构类似于 System V 结构,还不如说他更类似于 BSD UNIX 结构,尽管 Slackware 的最新发行版中的程式做了一些让步,他们要将服务添加到启动,但期望这些服务是 System V 目录结构。(请参阅侧栏, “BSD 和系统 V init 脚本之间的差异”。)

任何进程的父代

当 Linux 机器引导时,究竟会发生什么?在电脑的 BIOS 完成其任务后,系统会读取硬盘(或软盘,或 CD-ROM,或 Zip 驱动器……Linux 是很灵活的)的第一位,并会碰到引导装入程式。虽然 GRUB 和其他装入程式也逐渐变得流行,但通常这就是 Linux 装入程式 (LInux LOader),一般称作 LILO。

然后 LILO 将 Linux 内核装入内存,并开始展示他的魔力。Linux 内核初始化了诸如 SCSI 卡之类的设备,连同其他内核中内置的硬件设备。然后内核运行 init,他是除内核之外在系统运行的第一个进程。假如执行 ps ax | grep 1 ,就会看到 init 的进程 ID (PID) 是 1。

装入 init 之后,他会读取 inittab 以查看下一步做什么。 inittab 告诉 init 要进入什么运行级别,连同在哪里能够找到该运行级别的配置文档。

运行级别

运行级别是由系统上的任何服务在某个给定时间定义的(基本上是操作方式)。Linux 能够有几种操作方式:单用户方式、单用户连网方式、多用户方式、始于 X 窗口的多用户方式,等等。这部分将要说明运行级别的概念、Slackware 上有哪些运行级别,已他们被叫作什么。

运行级别由数字或字母标明。可惜,不是任何的 Linux 发行版在各个运行级别的称呼问题上都能达成共识。在某些发行版中,运行级别 3 是使用 X 窗口登录的多用户方式。而其他的,如 Slackware,将运行级别 3 指定成使用控制台登录的多用户方式。

据我所知,任何 Linux 发行版都认同运行级别 0 是“停机”、运行级别 1 或 "S" 是单用户方式(稍后将周详说明),运行级别 6 是重新引导系统。Slackware 的运行级别如下:

  • 运行级别 0 = 系统停机
  • 运行级别 1 = 单用户方式,主要用于维护
  • 运行级别 2 = 从不使用
  • 运行级别 3 = 使用控制台登录的多用户方式
  • 运行级别 4 = 使用 X11 会话管理器的多用户方式 (XDM, GDM, KDM)
  • 运行级别 5 = 从不使用
  • 运行级别 6 = 重新引导
  • 运行级别 S 或 s = 单用户方式

这里没有记录运行级别 7 到 9,在理论上,他们适用于在需要时定制运行级别。但我还没有亲自尝试过创建一个。

运行级别配置

假如您使用的不是 Slackware Linux,那么配置文档的结构和我谈到的结构会大不相同。除了 inittab 文档,任何 Slackware 的启动配置文档都在 /etc/rc.d/ 目录中。

缺省情况下,目录中有 5 个运行级别 rc.* 脚本,假如将 symlink 从 rc.0 加到 rc.6 ,那么可有 6 个。

运行级别 init 脚本是:

  • rc.0 = rc.0 文档是到 rc.6 的 symlink
  • rc.M = 多用户运行级别 2、3 和 5 的 init 脚本
  • rc.K = “管理”运行级别,单用户方式
  • rc.S = 系统初始化脚本
  • rc.4 = 运行级别 4(自动引导入所选择的 X 会话管理器)的 init 脚本
  • rc.6 = 重新引导或停止系统时由 init 执行的脚本

目录中的其余 rc.* 文档用于启动诸如连网、内核模块、PCMCIA、Samba、Apache、Netatalk 和 GPM 的系统服务。假如想要使某个服务(如 Apache)完全不能在任何运行级别上使用,请使用 chmod 将文档的许可权从可执行更改成不可执行。除去该文档也能够到达相同效果,但我不推荐这种做法。也许在以后某个日子您会发现要重新启用服务,但却不知道怎样做。

rc.inet1 脚本负责启动基本连网服务,如配置主机名(IP 和 DHCP)。 rc.inet2 脚本负责启动任何其他 INET 服务,如 NFS、包转发、ssh 服务器和其他连网守护程式。

任何 Slackware /etc/rc.d/rc.* 文档都是 Bash shell 脚本,都能够进行手工编辑。可是对于连网,您可能应该先尝试 netconfig 实用程式。虽然需要手工编辑 /etc/resolv.conf

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!