引导过程的步骤
Linux 系统典型的引导过程由下面 6 个不同的阶段组成:
- 加载并初始化内核
- 检测和配置设置
- 创建内核线程
- 操作员干预(仅用于手工引导)
- 执行系统启动脚本
- 多用户模式运行
系统管理员对以上大多数步骤几乎没有什么控制权。我们通过编辑系统启动脚本来影响大多数的引导配置。
初始化内核
Linux 内核本身就是一个程序,系统引导过程中的第一项任务就是把这个程序载入内存,以便执行它。
内核的路径名通常是
或者
Linux 系统实现了一种有两个阶段的加载过程。第一阶段,系统 ROM 把一个小的引导程序从载入到内存中。然后,再由引导程序安排载入内核。
配置硬件
内核执行的第一批任务之一包括检查机器的环境以确定机器有什么硬件。大多数内核为它们所找到的每个设备打印出一行专门信息。现在的发行版本所包含的内核能够在绝大多数机器配置上运行,只要做最少量的定制(如果需要的话)。
内核线程
一旦完成基本的初始化任务,内核就在用户空间创建几个“自发”的进程。它们之所以被称称为是自发进程,是因为这些进程不是通过系统正规的 fork 机制所创建的。在所有这些进程中,只有init 是真正的完整的用户进程,并且一定是进程 1 ,使用
一旦创建完毕自发进程,内核在引导阶段的任务就完成了。不过,处理基本操作(比如接受登录)的进程还一个都没有创建呢,而且大多数 Linux 守护进程也都没有启动。这些任务都是由init 来负责的。
操作员干预(仅限手工引导)
如果系统以单用户模式进行引导,那么在 init 启动时,内核所给出的命令行标志(就是“single”)会通知 init 实际要引导的是单用户模式。进程 init 最后会把控制权交给 sulogin(是login 的一个“中间但不可控”的特殊版本,它提示用户输入 root 口令,如果口令正确,系统将产生一个 root shell),
在许多单用户环境下,文件系统的根目录是按只读方式安装的。如果 /tmp 是根文件系统的一部分,那么许多要使用临时文件的命令(例如 vi)都不能执行。为了解决这个问题,必须先把根文件系统(/)以读写方式重新安装,再开始单用户模式的交互操作。下面这条命令通常就能实现这个技巧:
正常的自动引导过程会运行 fsck 命令,检查并修复文件系统。在以单用户模式启动系统时,可能需要手工执行 fsck。当单用户 shell 退出时,系统将尝试继续引导进入多用户模式。
执行启动脚本
到了系统准备运行其启动脚本的时候,我们就能看出它是 Linux 系统了。尽管它看起来还不很像全部启动完毕的系统,接下来的工作就交由 init 根据一定的算法来运行shell 脚本。
多用户运行
在初始化脚本运行过以后,系统就是完全运行的系统了,不过现在用户还不能登录进来。为了在某个特定终端(包括控制台)上接受用户登录,必须有一个 getty 进程监听终端或者控制台。init 直接生成这些getty 进程,完成引导过程。init 还负责生成图形登录系统,如 xdm,gdm 或者 kdm.
引导加载程序:GRUB
《Linux Administration Handbook》一书关于该节讲得非常多,不过对于新版本的 GRUB 来说好多都已经,也不能说是过时,不过已经变得不那么重要了,所以我结合新版本的 GRUB 来说吧。用户可以通过
安装到第一个硬盘的第一个分区,必须用括号来避免 shell 用它自己的方式来解释括号。
GRUB 给物理磁盘命名的方法和 Linux 的习惯标准不一样,GRUB 设备名看上去类似于:
第一个数值表示物理驱动器号(从0开始),第二个数值表示分区号(也是从0开始),在本例中,(hd0, 0) 相当于 Linux 设备/dev/hda1。
新版本的 GRUB 默认设置文件位于 /etc/default/grub, 如果你修改了该文件需要运行
来更新 /boot/grub/grub.cfg 文件。update-grub 命令将自动搜索所有驱动器上可供加载的内核影像文件包括 Linux, Windows, OpenBSD 等,然后自动配置好/boot/grub/grub.cfg 文件。
GRUB 支持一种功能强大的命令界面,而且能随时编辑配置文件中的配置项。在 GRUB 的启动界面键入 c 就可以进入命令行模式。在命令行上按下TAB 键就可以看到可能命令的快捷清单。GRUB的命令选项:
命令 | 功能 |
---|---|
reboot | 软启动系统 |
find | 在所有可以安装的分区上寻找一个文件 |
root | 制定根设备(一个分区) |
kernel | 从根设备加载的内核 |
help | 获得一条命令的交互性帮助信息 |
boot | 以指定内核影像文件启动系统 |
要了解有关 GRUB 及其命令行选项的详细信息,可以参考其官方手册:
在整理该文的时候,偶然机会看到 forum.ubuntu.org.cn 论坛上有位兄弟介绍了 GRUB2 修改背景图片、字体大小和颜色的帖子,顺便也将该帖子的链接放在这里参考吧:原文《ubuntu11.10的grub2修改背景图片和字体大小、颜色》一起来美化 GRUB。
引导单用户模式
单用户模式是一种在不影响其他用户(或者不被其他用户影响)的情况下,修改系统配置或者实施维护工作的好方式。单用户模式也是在受损系统上展开恢复工作所采用的模式。用户可以在其他运行级内通过执行
命令进入单用户模式。除非正在调试和引导有关的问题,否则没有必要重启系统。文件系统的根目录在系统引导时以只读方式安装,这是一种预防系统不稳定的手段。如果需要修改配置文件来解决问题,可以用下面的命令重新安装文件系统
在 GRUB 下,要引导单用户模式,只需在 /etc/default/grub 的 "GRUB_CMDLINE_LINUX_DEFAULT=" 现有内核选项之后加上single 标志,如下面的例子所示:
然后执行 update-grub 命令更新 /boot/grub/grub.cfg 文件即可。
启动脚本
从单用户模式退出以后(或者,在自动引导过程中要运行单用户 shell 的时刻),init 执行系统的启动脚本。经常在启动脚本中执行的一些任务如下:
- 设置计算机的名称
- 设置时区
- 采用 fsck 检查磁盘(只在自动模式下)
- 安装系统的磁盘
- 从 /tmp 目录删除旧文件
- 配置网络接口
- 启动守护进程和网络服务
大多数启动脚本的内容相当详尽,而且能打印出正在做的每件事情的描述。
init 和运行级
传统的 init 定义了 7 个“运行级(run level)”,每一个级别都代表系统应该补充运行的某些特定服务:
- 0 级是完全关闭系统的级别
- 1 级或 S 级代表单用户模式
- 2~5 级是多用户级别
- 6 级是“重新引导(reboot)”的级别
0 级和 6 级比较特殊,因为系统实际上不能留在这两个级别里,进入这两个级别的效果是关闭系统或者重新引导系统。在大多数系统上,正常的多用户运行级别是 2 或 3 级。运行级 5 经常用于 X Window 的登录进程,比如xdm。运行级 1 和 S 的定义在每种系统上是不同的。
启动脚本的主拷贝位于 /etc/init.d/ 这个目录下。每个脚本负责一个守护进程。这些脚本都认识参数 start 和 stop,大多数脚本还认识参数 restart,作为系统管理员,要启动和停止各个服务,只要手工运行与之有关的init.d 脚本就可以了。
尽管 /etc/init.d/ 中的脚本能够启动和停止各个服务,但是由 init 运行的主控制脚本需要知道其他一些信息,这些信息说明了要进入任何指定的运行级别需运行哪些脚本(并带什么参数)。当主脚本把系统引入到一个新的运行级别时,它不是直接在/etc/init.d/ 目录下找,而是查找叫做 rclevel.d 的目录,这里的level 就是要进入的运行级别编号(例如,rc0.d、rc1.d 等)。
在典型情况下,这些 rclevel.d 目录所包含的符号链接都链接到了/etc/init.d/ 目录中的脚本上。这些符号链接的名称都以 S 或 K 开头,后跟一个数字以及该脚本所控制的服务名(例如,S34named)。当init 从低的运行级别向高的运行级别过渡时,它按照数字递增的顺序运行所有以 S 开头的、带有start 参数的脚本。当 init 从高的运行级别向低的运行级别过渡时,它按照数字递减的顺序运行所有以K(表示 kill,杀死的意思)开头、带有 stop 参数的脚本。
这一机制让系统管理员可以细粒度地控制启动服务的顺序。例如,在网络接口启动之前先启动 SSH 就没有意义。在 Fedora 系统上,虽然 network 和 sshd 都配置了在运行级 2 启动,但是 network 的脚本序号为 10,而 sshd 的脚本序号为 55,所以 network 肯定先运行。在加入新服务的时候,一定要考虑到这种依赖关系。
Debian 和 Ubuntu 的启动脚本
关于 Ubuntu 系统的启动流程、增/删启动项信息,wiki.ubuntu.org.cn 上已经有一份相当详细且实用的文章介绍,此处就不作记录了,详细信息参考ubuntu 启动
重新引导和关机
引导系统本质上只能用一种方法来完成,与此不同的是,关闭或重新引导系统有许多种方法。
- 关闭电源
- 使用 shutdown 命令
- 使用 halt 和 reboot 命令
- 使用 telinit 来改变 init 的运行级别
- 使用 poweroff 命令告诉系统关闭电源
例如,一条提醒用户上午 9:30 实施预定的维护而停止系统运行的 shutdown 命令如下:
还可以指定相对的关机时间。例如,下面的命令将在它开始运行 15 分钟后关机。
halt 命令执行关闭系统所需要的基本任务。
reboot 快速的重新启动
telinit 改变 init 的运行级,让系统进入单用户模式
poweroff 请 Linux 关闭电源