分类:
2008-10-15 16:24:00
本文向您描述了如何在不影响可用性的前提下加快 Linux 操作系统的引导速度。当然,这种方法要求您对系统服务及服务之间的依赖关系有所理解,如果它们可以并行启动,就让它们并行启动而不是串行启动。
毫无疑问 Linux 是一个优秀的系统,但仍然无法摆脱一个常见的责难(尤其是来自具有 Microsoft 背景的人),那就是 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- 方式(图形登录界面) |
6 | 重新引导 |
init如何初始化系统
init 通过一个ASCII配置文件(/etc/inittab)来确定如何改变运行级。通常,init 会根据这个配置文件去运行 /etc/rc.d/rc 脚本,并将运行级数字传递给这一脚本。
|
在本文看来,正是从运行 rc 脚本开始,事情才变得有趣。
系统服务
rc 脚本负责启动用户需要的所有服务。就像名字所描述的一样,所谓服务就是系统提供的有用的工具。可能会有很多服务需要启动。大部分的 Linux 系统会启动 sshd(Shell服务)、syslog(系统日志工具)和 lpd(打印服务),但还会有更多的服务需要启动。比如,我的 Red Hat 9 系统现在运行着29个服务,但如果我把所有的服务都启动,那么我的系统中将会有近50服务在运行。
还有一点很重要,我们应该明白有的服务可能只能由特定的运行级来启动。比如,除了运行级5(多用户图形方式)以外,几乎不会启动某种形式的图形服务,因为其它所有的运行级都是非图形方式的。接下来我们将深入讨论这一问题。
服务程序在哪里?
|
通常在 /etc/rc.d/init.d/ 目录下可以找到服务程序。
如果你浏览一下这个目录,你就会发现相当多的(如果不是全部都是的话)服务程序实际上都是 shell 脚本,用于调用其他程序完成实际的工作。
[1]