了解 Red Hat 运行级别

作者:Mark F. Komarinski

如果您是那些冒险尝试了 Caldera Previews 或在您的系统上安装了 Red Hat 发行版的人之一,那么您最初的想法可能和我一样:/etc/rc.local 发生了什么?我应该把我的自定义命令放在哪里?[一个答案:/etc/rc.d/rc.local 在 Red Hat 系统上可用—编者注] 如果我不希望 HTTP 服务器启动怎么办?

对于那些管理 Sun Solaris 机器的人来说,这看起来非常熟悉。但我只是挠头了一段时间,直到我最终管理了一个系统,一切才变得清晰起来。现在是分享知识的时候了。

这种设置背后的想法是使一切都基于脚本。对于每个运行级别,都会运行脚本来启动每个单独的服务,而不是手动编辑一些大型文件。这些脚本位于 /etc/rc.d/init.d 中,大多数脚本都接受 startstop 作为选项。这是为了允许特定程序在启动时启动或在关机时停止。

此设置涉及 /etc/rc.d/ 下的一堆目录。这些目录是

rc0.d 包含系统关机时运行的脚本。从技术上讲,halt 或 shutdown 会使系统进入运行级别 0。此目录主要由 kill 命令组成。

rc1.d 到 rc3.d 系统更改运行级别时运行的脚本。运行级别 1 通常是单用户模式,运行级别 2 用于没有 NFS 的多用户设置,运行级别 3 是完全多用户和网络。

运行级别 4 通常未使用。

rc5.d 在 X11 模式下启动系统的脚本。这与运行级别 3 相同,但 xdm 程序会启动,从而提供图形登录界面。

rc6.d 系统重启时运行的脚本。这些脚本由 reboot 命令调用。

init.d 实际上包含所有脚本。rc?.d 目录中的文件实际上是指向 init.d 目录中脚本的链接。

启动顺序

现在我们知道了文件的位置,让我们看看正常的 Red Hat 启动顺序中发生了什么。

系统启动后,首先运行 /etc/rc.d/rc.sysinit。找到启动运行级别(在 /etc/inittab 中指定),并运行 /etc/rc.d/rc 脚本,唯一的选项是我们想要进入的运行级别。对于大多数启动,这是运行级别 3。

rc 程序在 /etc/rc.d/rc3.d 目录中查找,执行任何带有 stop 选项的 K* 脚本(rc3.d 目录中没有)。然后,所有 S* 脚本都使用 start 选项启动。脚本按数字顺序启动—因此,S10network 脚本在 S85httpd 脚本之前启动。这允许您精确选择脚本的启动时间,而无需编辑文件。K* 脚本也是如此。

让我们看看当我们切换运行级别时会发生什么—例如从运行级别 3(完全网络和多用户模式)切换到运行级别 1(单用户模式)。

首先,将执行系统正在更改的级别中的所有 K* 脚本。我的 Caldera Preview II (Red Hat 2.0) 设置在 /etc/rc.d/rc.1/ 目录中有七个 K 脚本和一个 S 脚本。K 脚本关闭 nfs、sendmail、lpd、inet、cron 和 syslog。然后 S 脚本终止任何剩余的程序并执行 init -t1 S,这告诉系统真正进入单用户模式。

进入单用户模式后,您可以通过键入 init 3 切换回完全多用户模式。

绕过 init

这里我可以再补充两点。

首先,您可以有选择地启动和停止脚本,即使是那些并非您的运行级别原生的脚本。在 /etc/rc.d/init.d/ 中执行带有 startstop 选项的脚本将启动或停止脚本控制的程序或服务。例如,这允许您从运行级别 3 关闭 NFS,同时保持所有其他系统处于活动状态。同样,您可以在准备就绪后重新启动 NFS。

在这种情况下停止 NFS 将需要停止两个系统—nfsfs 和 nfs。nfsfs 脚本将挂载或卸载 /etc/fstab 中列出的任何 NFS 挂载的文件系统。然后 nfs 脚本将关闭与 NFS 关联的进程,在本例中为 mountd 和 nfsd。

因此,关闭 NFS 的正确步骤将是

# /etc/rc.d/init.d/nfsfs stop
Unmounting remote filesystems.
# /etc/rc.d/init.d/nfs stop
Shutting down NFS services: rpc.mountd rpc.nfsd
#

而启动 NFS 将是

# /etc/rc.d/init.d/nfs start
Starting NFS services: rpc.mountd rpc.nfsd
# /etc/rc.d/init.d/nfsfs start
Mounting remote filesystems.
#
管理 init 文件

您是否想要启动 HTTP 守护程序,而无需从 rc3.d 目录中删除该文件?很简单。将 /etc/rc.d/rc3.d/S85httpd 重命名为不以大写 S 或大写 K 开头的名称。最好的选择是使用小写 “s” 或小写 “k” 重命名文件。这样,不仅脚本不会启动,而且它们会稍后出现在 ls 文件列表中,因为以大写字母开头的条目与以小写字母开头的条目分开显示。因此,您最终会得到一个现在名为 s85httpd 的文件,它与 ls -l 列表中的其余条目有些分离。

但这里有一个重要的注意事项:在禁用脚本时,请确保您知道脚本正在做什么。如果您禁用像 S10network 脚本这样的东西,您的所有网络软件都将无法工作。这就是 S10network 具有如此低数字的原因:因为其他脚本依赖于网络,并且必须在网络软件就位后执行。

您想制作自己的 init 进程来启动和停止吗?这很容易做到。创建一个接受单词 start 作为选项的脚本。并非所有脚本都需要能够停止,但如果脚本在后台启动一个进程,您几乎肯定也应该包含一个 stop 选项。例如,一个在每次您进入运行级别 3 时通过网络轮询时间的脚本不需要 stop。一个每 15 分钟启动一个程序来查询网络时间的脚本将需要一个启动和停止脚本,因为脚本启动的程序是持续运行的。第二个示例的程序更适合从 crontab 中启动,但是能够以您自己的方式做事是 Unix 的核心,不是吗?

一旦编写完成(并且经过测试),将其放入 /etc/rc.d/init.d/ 目录中。假设它是每 15 分钟检查网络机器上时间的程序,因此我们将脚本称为 “netdate”。一旦它位于 /etc/rc.d/init.d/ 目录中,您就可以在要启动它的目录中创建链接。如果您希望您的程序在运行级别 3 中运行,请从 /etc/rc.d/rc3.d/S??netdate 链接到您的脚本。使 ?? 成为一个适合目录其余部分的数字,例如 S55netdate。您希望它高于 S10,以便网络启动,并且 S55 未被占用,因此这似乎是一个足够好的位置。不需要每个数字只有一个脚本,但这是一种好的形式,因为您确切地知道脚本将以什么顺序启动。

如果您想在关机期间优雅地停止进程,请确保您的脚本接受 stop,然后从 /etc/rc.d/rc0.d/K55netdate 链接到 /etc/rc.d/init.d/netdate。同样,您应该确保您使用的数字没有被另一个子系统使用,以避免混淆。

您可以使用 init 3 测试您的新设置。由于其他子系统已经在运行,因此唯一将启动的是您刚刚添加的子系统。如果 init 3 命令挂起,则您的脚本未退出;您可能需要在行的末尾放置一个 & 符号,以将问题进程放在后台。您也可以从 /etc/rc.d/init.d/ 目录手动运行您的脚本。

现在您知道了子系统是如何工作的,您可以轻松地为您的特定 Linux 设置添加或修改现有的子系统。

Mark Komarinski (markk@auratek.com) 自 1993 年首次购买他的 386/40 以来一直在使用 Linux。他刚刚完成了一本关于 Linux 的书,将由 Prentice Hall 出版。Mark 现在在 Aurora Technologies 工作,负责内部 PC 支持和客户服务电话。他和他的妻子 Brenda 住在马萨诸塞州东部。

加载 Disqus 评论