理解启动过程
许多现代操作系统在启动时乐于显示“请稍候”启动画面——Linux 则不然。与其他操作系统不同,Linux 在启动时非常健谈,新用户经常要求我解释启动过程中出现的所有消息。首先出现大量看似随机的消息,然后是一系列更有序的消息,这些消息在每个操作系统服务启动时出现。如果安装/启动顺利,这些有序的消息会伴随着鲜艳的颜色(通常是绿色)OK 或 DONE。如果出现问题,消息通常会以红色显示 FAILED。不幸的是,随机消息和有序消息都会快速消失在屏幕上,通常在新用户有机会阅读它们之前就消失了。
可以使用 dmesg 命令查看初始的随机消息。快速阅读 dmesg 的 manpage 会说明 dmesg 是一个可以“打印或控制内核环形缓冲区”的实用程序。 除此之外,内核环形缓冲区是记录启动消息的地方。以下命令行显示环形缓冲区当前的內容;请注意管道传输到 less,它一次显示一个屏幕的消息
dmesg | less
通过将 dmesg 命令通过 grep 进行管道传输,可以提取一些特定数据。例如,使用此命令行了解您系统的 USB 设置(请注意 grep 的 -i 参数,它指示实用程序忽略大小写,允许 USB 以及 usb 匹配)
dmesg | grep -i 'usb'
替换过滤器值以提取其他有用的信息。例如,将 usb 替换为 hd 可提供有关启动时检测到的硬盘的信息。同样,cpu 提取有关您计算机芯片的数据,而 net 提取有关您的网络设置的数据。使用 scsi 显示有关任何 SCSI 设备(包括 CD-ROM)的数据。
作为 Linux 启动的一部分,init 进程执行,操作系统进入固定数量的运行级别之一。运行级别的列表在以下配置文件的开头描述,该文件由 init 进程使用
/etc/inittab
通常,作为全新安装的结果,您的计算机配置为启动到两个运行级别之一,即运行级别 3 或运行级别 5。前者以完全多用户模式启动 Linux,在成功启动后显示基于文本的登录屏幕。后者也以完全多用户模式启动 Linux,但会显示基于图形 X11 的登录屏幕。您选择哪个选项是个人偏好,您的 Linux 安装程序通常允许您选择基于文本或图形的登录作为默认设置。/etc/inittab 文件在 id 行上指示当前系统上的默认运行级别。由于我倾向于在所有系统上启动到基于文本的登录,因此我的 /etc/inittab 文件中的 id 行如下所示
id:3:initdefault:
如果我将 3 更改为 5 并重新启动,则会出现基于图形 X11 的登录屏幕。为了编辑 /etc/inittab 文件,需要超级用户权限,因此请记住在编辑此文件时以 root 身份登录。
各种运行级别的目的是安排在特定情况下启动或停止一组特定的服务。运行级别的存在是为了重新启动和停止系统,以及在启动时启动服务。正是这些服务与本文开头提到的启动时显示的更有序的 OK 消息有关。
/etc/init.d/ 目录中存在一系列系统服务脚本。/etc/rc.d/ 目录下另一个子目录集合对应于每个运行级别。这些子目录中的符号链接指向服务脚本。通过从相应的子目录添加/删除符号链接,可以调整当 Linux 进入指定运行级别时执行哪些服务脚本。但是,手动执行此操作通常工作量太大。在我看来,最好依赖半自动化工具(例如 chkconfig)来完成大部分工作。
chkconfig 实用程序允许您更新和查询系统服务的运行级别信息。chkconfig 为您完成繁琐的工作,而不是摆弄符号链接、目录条目和服务脚本。脚本会根据需要从相应的 rc 子目录中添加或删除,从而更轻松地控制启动服务。
chkconfig 通常驻留在 /sbin/ 目录中,因此请务必以 root 身份发出以下命令。要查看按字母顺序排序的启动服务完整列表,请使用此命令行
chkconfig --list | sort | less
将显示服务列表,每个服务都附带一个指示,指示在激活特定运行级别时服务是启用 (on) 还是禁用 (off)。与往常一样,输出通过管道传输到 less 以防止其滚出屏幕。通常,确定启用哪些服务很有用。为此,请通过 grep 过滤输出,如下所示
chkconfig --list | sort | grep ':on' | less
除了列出每个启动服务的当前状态外,chkconfig 还可以打开和关闭服务,任何更改都会在下次启动后生效。这意味着,如果某个服务已启用,然后使用 chkconfig 关闭,则该服务将保持运行状态,直到系统重新启动。要立即关闭服务,只需执行服务脚本(以 root 身份),并将单词 stop 作为命令行参数传递。例如,要安排 ISDN 服务在下次启动时不再启动,请发出此命令
chkconfig isdn off
此行确保 ISDN 服务在下次重新启动时被禁用。要在不重新启动的情况下关闭 ISDN 服务,请使用此命令
/etc/init.d/isdn stop
如果您没有使用 chkconfig 关闭 ISDN 服务,它将在下次重新启动时重新启动,即使您通过执行服务脚本停止了它。因此,要立即且永久地停止 ISDN 服务,请一起发出上述命令
chkconfig isdn off && /etc/init.d/isdn stop
要控制在启动时启用哪些启动服务,请浏览 chkconfig 标识的服务列表,打开您要启用的服务,关闭要禁用的服务。当使用 chkconfig 时,这很容易做到,前提是您知道每个启动服务的作用。如果您不确定,以下两种技术可以帮助您学习。第一种方法很简单:查看是否存在有关该服务的 manpage。例如,要显示与 crond 服务关联的 manpage,请发出此命令行
man crond
假设 manpage 存在,它应该提供有关服务作用的大量信息。然后,您可以决定是否希望该服务在启动时启动,然后使用 chkconfig 根据需要启用或禁用该服务。如果 manpage 不可用(我的 Red Hat 9 系统上的 ISDN 服务没有 manpage),则会出现类似于此的消息
No manual entry for isdn
要确定 ISDN 服务的作用,第二种技术是使用 less 查看存储在 /etc/init.d/ 目录中的实际启动脚本。例如
less /etc/init.d/isdn
虽然显示的脚本可能看起来有点奇怪,但请专注于脚本顶部的注释行——它们以 # 开头。应该有一行标记为 description,以提供有关脚本作用的线索。对于 ISDN 服务,线索再清楚不过了
# description: start and stop ISDN services
通过有序地浏览启动服务脚本集,可以配置服务以满足您的需求。这样做,您可以了解 Linux 在启动过程中所做的事情。虽然存在基于 GUI 版本的 chkconfig,并且通常使用起来很方便,但它们假设管理员位于正在管理的计算机前面。当通过慢速拨号或远程网络连接访问系统进行基本维护时,基于命令行的 chkconfig 是唯一的方法。
有关 chkconfig 的更多信息,请务必阅读其 manpage。要了解有关启动过程的更多信息,请从 init manpage 开始。
Paul Barry (paul.barry@itcarlow.ie) 在爱尔兰的 卡洛理工学院 讲课。他是 使用 Perl 进行网络编程(Wiley 2002)的作者。他的新书与 Michael Moorhouse 博士(来自荷兰伊拉斯姆斯医学中心)合着,书名为 生物信息学、生物计算和 Perl(Wiley 2004)。