作者Joe Zonker Brockmeier (jbroc)高级编辑User Friendly Media
提要Joe Brockmeier 研究了 Slackware Linux init 进程他讨论了系统如何初始化服务各种运行级别是什么以及如何从缺省安装中添加或除去服务来定制系统
Linux 用户正日益成熟这意味着他们想要将系统配置成执行他们希望完成的任务但目前 Linux 发行版通常都附带了自动配置的设备和启动服务如 Sendmail 或 Apache这些发行版没有考虑到的是毫不更改其缺省设置来运行服务如 Apache 用户毫不知情 会让黑客和利用脚本捣乱的人趁虚而入而且这会用完本可以更好利用的系统资源 比如可以用于 Quake 或您喜欢的编译器的更多处理器时间由于缺少控制是件糟糕的事因此让我们看一下 Linux 系统引导时在 init 进程期间在所涉及的各个运行级别上都发生了什么以及如何在系统运行时定制系统或在运行级别之间切换
我们的示例使用 x 平台上的 Slackware Linux 发行版(请参阅本文后面的参考资料)大多数信息可用于其它 Linux 发行版但在细节处会略有不同尤其是与其说 Slackware 的 init 结构类似于 System V 结构还不如说它更类似于 BSD UNIX 结构尽管 Slackware 的最新发行版中的程序做了一些让步它们要将服务添加到启动但期望这些服务是 System V 目录结构(请参阅侧栏BSD 和系统 V init 脚本之间的差异)
所有进程的父代
当 Linux 机器引导时究竟会发生什么?在计算机的 BIOS 完成其任务后系统会读取硬盘(或软盘或 CDROM或 Zip 驱动器……Linux 是非常灵活的)的第一位并会遇到引导装入程序虽然 GRUB 和其它装入程序也逐渐变得流行但通常这就是 Linux 装入程序 (LInux LOader)一般称作 LILO
然后 LILO 将 Linux 内核装入内存并开始展示它的魔力Linux 内核初始化了诸如 SCSI 卡之类的设备以及其它内核中内置的硬件设备然后内核运行 init它是除内核之外在系统运行的第一个进程如果执行 ps ax | grep 就会看到 init 的进程 ID (PID) 是
装入 init 之后它会读取 inittab 以查看下一步做什么inittab 告诉 init 要进入什么运行级别以及在哪里可以找到该运行级别的配置文件
运行级别
运行级别是由系统上的所有服务在某个给定时间定义的(基本上是操作方式)Linux 可以有几种操作方式单用户方式单用户联网方式多用户方式始于 X 窗口的多用户方式等等这部分将要说明运行级别的概念Slackware 上有哪些运行级别已经它们被叫作什么
运行级别由数字或字母标明可惜不是所有的 Linux 发行版在各个运行级别的称呼问题上都能达成共识在某些发行版中运行级别 是使用 X 窗口登录的多用户方式而其它的如 Slackware将运行级别 指定成使用控制台登录的多用户方式
据我所知所有 Linux 发行版都认同运行级别 是停机运行级别 或 S 是单用户方式(稍后将详细说明)运行级别 是重新引导系统Slackware 的运行级别如下
运行级别 = 系统停机
运行级别 = 单用户方式主要用于维护
运行级别 = 从不使用
运行级别 = 使用控制台登录的多用户方式
运行级别 = 使用 X 会话管理器的多用户方式 (XDM GDM KDM)
运行级别 = 从不使用
运行级别 = 重新引导
运行级别 S 或 s = 单用户方式
这里没有记录运行级别 到 在理论上它们适用于在需要时定制运行级别但我还没有亲自尝试过创建一个
BSD 和 System V init 脚本之间的差异
Slackware Linux 使用 BSD init 脚本说说挺容易但这究竟表示什么?
仿真 BSD init 样式的 Linux 和 UNIX 系统有一个 /etc/rcd/ 目录其中每个运行级别都包含一个 init 脚本因此如果要查看或修改运行级别 的 init 脚本应该编辑文件 /etc/rcd/rc
另一方面其 init 脚本基于 System V 的系统对于每个运行级别都有独立的目录因此如果要编辑运行级别 init 脚本应查找 /etc/rcd/ 目录并查找该目录中对应于要修改的服务的脚本
这个差异导致了 Berkeley Software Distribution (BSD) UNIX 和 AT&T System V UNIX 之间的设计差异这两者都开创了各自的 UNIX 商业版本它们连同 Vi 以及 Emacs 一起是计算机界的激烈争论之一
由于许多 Linux 发行版都喜欢 System V init 布局Slackware 现在也附带了目录和 rcsysvinit init 脚本用于保持兼容性
运行级别配置
如果您使用的不是 Slackware Linux那么配置文件的结构与我谈到的结构会大不相同除了 inittab 文件所有 Slackware 的启动配置文件都在 /etc/rcd/ 目录中
缺省情况下目录中有 个运行级别 rc* 脚本如果将 symlink 从 rc 加到 rc那么可有 个
运行级别 init 脚本是
rc = rc 文件是到 rc 的 symlink
rcM = 多用户运行级别 和 的 init 脚本
rcK = 管理运行级别单用户方式
rcS = 系统初始化脚本
rc = 运行级别 (自动引导入所选择的 X 会话管理器)的 init 脚本
rc = 重新引导或停止系统时由 init 执行的脚本
目录中的其余 rc* 文件用于启动诸如联网内核模块PCMCIASambaApacheNetatalk 和 GPM 的系统服务如果想要使某个服务(如 Apache)完全不能在任何运行级别上使用请使用 chmod 将文件的许可权从可执行更改成不可执行除去该文件也可以到达相同效果但我不推荐这种做法也许在以后某个日子您会发现要重新启用服务但却不知道怎样做
rcinet 脚本负责启动基本联网服务如设置主机名(IP 和 DHCP)rcinet 脚本负责启动所有其它 INET 服务如 NFS包转发ssh 服务器和其它联网守护程序
所有 Slackware /etc/rcd/rc* 文件都是 Bash shell 脚本都可以进行手工编辑可是对于联网您可能应该先尝试 netconfig 实用程序虽然需要手工编辑 /etc/nf 来添加多个名称服务器但是它也许能处理您想要执行的所有操作而且它非常易于使用
如果您是 Linux 初学者并且要修改系统那么也许应该确保您有引导软盘并且应该复制您所有想要编辑的 rc* 文件如果拿不定主意我通常会将文件保存为 rc*old使它们变成不可执行文件
使用运行的系统
好现在系统已经运行然而您需要在单用户方式中执行一些操作 该怎么做呢?本文的下一部分将说明如何在系统运行时更改运行级别而不是通过重新引导来更改运行级别而且还说明了为什么执行此操作以及何时执行
telinit 命令在运行的系统上更改运行级别
telinit 命令可以用于更改运行级别当以 root 身份执行 telinit S(或者想要更改的任意运行级别)时它会更改运行级别关闭前一个运行级别然后启动下一个
某种程度上您正在重新引导系统的一部分然而关闭与重新启动服务的能力正是 Linux 最可爱的品质之一想要更改机器的 IP 地址吗?没问题只要进行一些更改然后重新启动联网服务就行了只要一切配置正确备份和运行是如此迅速很难分辩是否做过更改在其它即使更改了桌面上的墙纸都必须重新引导的操作系统上尝试一下执行此操作
确实需要重新引导或彻底关闭 Linux 机器的唯一情况是如果正在添加或更改硬件假设您正在使用不能热插拔的设备或者已经中断且需要使机器脱机以修复损坏与其它操作系统不同对于那些不经过重新引导就无法解决问题的产品系统我从来没有看到过重新引导解决了这些系统上的问题我曾设法利用诸如 hdparm 的命令来挂起非生产性机器我希望这种情况发生
假设您想要执行一些系统维护而这些系统维护要求系统处于单用户方式例如使用 hdparm 调整硬盘第一步是 su(切换)到 root 用户
然后执行 telinit 命令使系统进入单用户方式
telinit S t
自变量 t 是可选的它告诉 telinit 在真正切换到单用户方式之前等待 秒然而只要执行了该命令登录到机器的任何人都会看到在控制台上出现一个警告指出系统将切换运行级别或将在 秒内停机
到了 秒时init 会关闭单用户方式中不使用的进程并使系统进入单用户方式然后将提示您输入 root 用户密码以执行系统维护
系统进入单用户方式所使用的进程略有不同缺省情况下单用户方式要求 init 在控制台上调用 sulogin 命令并要求在单用户方式中使用 root 登录
系统进入单用户方式后应该会看到如下的消息
Give root password for system maintenance
(or type ControlD for normal startup):
执行了维护之后可以执行以下命令来使系统回到以前的运行级别
telinit
此命令告诉系统重新进入多用户运行级别在此命令中可以用 或 来代替 在 Slackware 系统上运行级别 将使您进入使用 X 窗口显示管理器之一的多用户方式因此您将直接登录到 X 窗口
如果在拥有串行电缆的串行上挂了 UPS那么就可以让 UPS 在断电的情况下向系统发送一个信号如果您的产品级系统有一个很大的文件系统那么这是非常有用的我曾看到过当没