技术文章,仅供参考。

通过并行化 Linux 系统服务来提高引导速度

级别:中级

James Hunt (jameshunt-at-uk.ibm.com)
软件工程师,IBM
2003 年 11 月

本文向您描述了如何在不影响可用性的前提下加快 Linux 操作系统的引导速度。当然,这种方法需要您对系统服务及服务之间的依赖关系有所理解,假如他们能够并行启动,就让他们并行启动而不是串行启动。

毫无疑问 Linux 是个优秀的系统,但仍然无法摆脱一个常见的责难(尤其是来自具备 Microsoft Windows 背景的人),那就是 Linux 系统从按下“on”键开始到能够使用,需要的时间太长。其实他们说的没错,Linux 确实需要比较长的引导时间。

在这里我所描述的加快 Linux 引导速度的技术虽然理解起来很简单,但真正实现却需要谨慎行事。我希望 Linux 的发行商能采用这种方法,这样用户就能够省去那些配置任务。但是假如您喜欢冒险,请继续阅读本文。

写在开始之前
假如您想体验一下这种方法,您首先必须得熟悉 Linux 的配置脚本。修改系统的启动配置可能会带来危险,甚至可能会导致您的系统无法启动。假如出现这种情况,请重新启动机器并进入单一用户模式(运行级1),把您所做的修改还原回来,然后再重新启动。永远记住要备份您所修改过的任何文档,为了防止最坏的情况发生,您还需要有至少一个系统备份的映像。

我强烈建议您在考虑用我所建议的方法修改一个正式的系统之前,先去修改一个无关紧要的测试系统。假如您只有一台机器,那么您能够使用 UML (User Mode Linux) 这一很有用的工具。UML是个内核补丁,他能够将Linux内核编译成为一个二进制文档,然后您能够像运行一个普通的程式相同去运行这个内核。也就是说,您能够在您的正常的系统之上以一个进程的方式来运行一个完整的 Linux 系统。您能够将其想象为在一个正常的系统中运行一个 Linux 系统。(请参阅本文末尾的参考资料,能够找到能够下载UML的站点连同 developerWorks 网站上关于UML的教程)。

使用UML您能够工作于一个测试系统,哪怕把这个测试系统完全破坏掉,也不会影响您正常的系统。

概述
本文的第一部分介绍当 Linux 内核(Linux 机器的的“核心”)加载后,一个 Linux 系统怎样在后台启动。然后介绍加快您的系统引导速度的技术。

假如您对运行级和服务启动脚本已熟悉,您可能希望直接跳转到传统服务框架的局限。

Linux 引导次序和运行级
一个 Linux 系统的引导过程能够分为几个阶段。本文并不会解释任何的不同阶段,因为我们所关心只是当内核加载后的那一个阶段。

您能够运行 /sbin/runlevel 命令来确定您的系统当前的运行级。(更多周详信息请查阅 man runlevel)。

当内核被加载并开始运行时会调用 /sbin/init 程式。这个程式以 root 身份运行,并且在开始引导时按照需要设定为“运行级”。(更多关于 init 程式的周详信息,请参考 man init)

什么是运行级?
一个运行级仅仅是个数字,Linux根据这个数字来区分不同类型的高层次配置,系统将按照不同的高层次配置来进行引导。由于绝大部分运行级数字都定义了明确的含义,因而他们基本上是“众所周知”的。Red Hat Linux 系统的主要运行级见表1。

表 1. Red Hat Linux运行级
运行级 说明
0 关闭
1 单一用户模式(一般仅用于管理目的)
2 多用户模式,不允许使用网络
3 多用户模式,允许使用网络
4 没有用到的运行级
5 多用户模式,允许使用网络,X-Windows 方式(图像登录界面)
6 重新引导

init如何初始化系统
init 通过一个ASCII配置文档(/etc/inittab)来确定如何改变运行级。通常,init 会根据这个配置文档去运行 /etc/rc.d/rc 脚本,并将运行级数字传递给这一脚本。

rc.sysinit 脚本
在 Red Hat 系统中,在运行 rc 脚本之前,init 将首先运行 /etc/rc.d/rc.sysinit 脚本,这个脚本执行那些必需的底层配置任务,比如配置系统时钟,检查磁盘错误,然后挂载文档系统。

在本文看来,正是从运行 rc 脚本开始,事情才变得有趣。

系统服务
rc 脚本负责启动用户需要的任何服务。就像名字所描述的相同,所谓服务就是系统提供的有用的工具。可能会有很多服务需要启动。大部分的 Linux 系统会启动 sshd(安全Shell服务)、syslog(系统日志工具)和 lpd(打印服务),但还会有更多的服务需要启动。比如,我的 Red Hat 9 系统现在运行着29个服务,但假如我把任何的服务都启动,那么我的系统中将会有近50服务在运行。

更有一点很重要,我们应该明白有的服务可能只能由特定的运行级来启动。比如,除了运行级5(多用户图像方式)以外,几乎不会启动某种形式的图像服务,因为其他任何的运行级都是非图像方式的。接下来我们将深入讨论这一问题。

服务程式在哪里?

可选的服务程式目录
在一些 Linux 系统中,服务程式有时候是在 /etc/init.d 目录下。

通常在 /etc/rc.d/init.d/ 目录下能够找到服务程式。

假如您浏览一下这个目录,您就会发现相当多的(假如不是全部都是的话)服务程式实际上都是 shell 脚本,用于调用其他程式完成实际的工作。

rc 脚本如何知道在每个运行级下去运行哪些脚本?
回顾一下,假如我们不希望在某个运行级下运行某个脚本,我们如何告诉系统这样去做?答案是在 /etc/rc.d/ 目录下,在这个目录下,除了我们已讨论过的 init.d/ 目录以外,更有一组目录,每一个目录对应一个运行级。这些目录以 rc<runlevel>.d 的形式来命名,比如,对应运行级5的目录为 /etc/rc.d/rc5.d/ 。在这些rc.d目录中,每一个目录下都有一组符号链接,指向 /etc/rc.d/init.d 中的真正的服务程式。实际上,后边我们会发现,每个服务事实上有两个符号链接。

服务链接名
这些指向实际服务程式的符号链接的名字很重要,他们遵循严格的命名约定,这样 rc 脚本就知道如何处理他们。

为了便于标识,每个链接的名字都以他们所指向的服务的名字做为后缀。

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