引导和配置 Linux 系统

目录

9.1. Linux 引导进程
9.2. init 进程
9.3. 通过 /etc/sysconfig 配置系统

摘要

引导 Linux 系统涉及不同组件。硬件本身是由 BIOS 初始化,而 BIOS 通过引导加载程序启动内核。此后,引导过程(包括 init 和 runlevel)完全受操作系统控制。runlevel 概念使您可以维护日常使用的设置,也可以对系统执行维护任务。

Linux 引导进程

Linux 引导进程包括多个阶段,每个阶段由一个不同组件来代表。下表概要总结了引导进程并介绍了所涉及的所有主要组件。

  1. BIOS.  在打开计算机之后,BIOS 将初始化屏幕和键盘并测试主内存。直到这一阶段,计算机不访问任何大容量储存媒体。 随后,将从 CMOS 值装载有关当前日期、时间和最重要的外设的信息。 当识别出第一块硬盘及其空间之后,系统控制将从 BIOS 传递到引导加载程序。

  2. Boot Loader.  第一块硬盘的前 512 个字节的物理数据扇区将被装载到主储存器中,位于此扇区开始位置的引导加载程序将接管系统控制。 引导加载程序执行的命令决定了引导进程剩余的部分。 因此,第一块硬盘的前 512 个字节被称为主引导记录 (MBR)。 引导加载程序随后将控制传递到实际的操作系统(在本例中即 Linux 内核)。 有关 Linux 引导加载程序 GRUB 的详细信息,请参见第 10 章 引导加载程序 GRUB

  3. 内核和 initramfs.  为了传递系统控制,引导加载程序将内核和基于 RAM 的初始文件系统 (initramfs) 装载到内存中。 内核可以直接使用 initramfs 的内容。initramfs 包含一个小的可执行文件,称为 init,可以进行真实文件系统的装入处理。 如果在访问大容量储存区之前需要特殊硬盘驱动程序,则这些程序必须在 initramfs 中。有关 initramfs 的详细信息,请参考第 9.1.1 节 “initramfs”

  4. initramfs 中的 init.  这个程序执行装入正确的 root 文件系统所需的所有操作,如为所需的文件系统提供内核功能以及为带有 udev 的大容量储存控制器提供设备驱动程序。 找到 root 文件系统后,对其进行错误检查并装入。 如果此操作成功,将清除 initramfs 并执行 root 系统上的 init 程序。有关 init 的详细信息,请参见第 9.1.2 节 “initramfs 中的 init”。 有关 udev 的更多信息,请参见第 13 章 使用 udev 进行动态内核设备管理

  5. init.  init 通过提供不同功能的多个不同的级别来处理系统的实际引导。有关 init 的介绍,请参见第 9.2 节 “init 进程”

initramfs

initramfs 是一个小型 cpio 归档,在此内核可以装载到 RAM 磁盘。 它提供了一个最小的 Linux 环境,可在装入实际 root 文件系统之前执行程序。 这个最小的 Linux 环境由 BIOS 例程装载进内存,而且除了需要足够的内存外没有特别的硬件要求。initramfs 必须始终提供一个名为 init 的可执行文件,该文件应该执行 root 文件系统中实际的 init 程序以使引导进程继续进行。

在能够装入 root 文件系统并启动操作系统之前,内核需要相应的驱动程序来访问 root 文件系统所在的设备。 这些驱动程序可能包括用于特定类型硬盘的特殊驱动程序,甚至还可能包括访问网络文件系统所需的网络驱动程序。 可使用 initramfs 上的 init 装载根目录文件系统所需的模块。 模块装载之后,udev 将为 initramfs 提供所需的设备。 在引导过程的后面,更改 root 文件系统之后需要重新生成设备。通过 boot.udev(使用 udevtrigger 命令)来完成此操作。

如果需要在已安装的系统中更改硬件(例如硬盘),并且该硬件要求在引导时内核中有不同的驱动程序,则必须更新 initramfs。其操作方法和其前身 initrd 一样,即调用 mkinitrd。 调用 mkinitrd 无需任何参数便可创建 initramfs。 调用 mkinitrd 将创建 initrd。在 SUSE® Linux Enterprise Desktop 中,要装载的模块由 /etc/sysconfig/kernel 中的变量 INITRD_MODULES 指定。安装后,自动将此变量设置为正确的值。将严格按照这些模块在 INITRD_MODULES 中出现的顺序来装载它们。 只有您依赖正确的设备文件 /dev/sd? 设置时,这才显得重要。然而,在当前系统下,也可以使用 /dev/disk/ 下的设备文件。这些文件以几个子目录的形式排序,分别为 by-idby-pathby-uuid,并始终代表相同的磁盘。 也可以在安装时通过指定相应的装入选项完成此操作。

[Important]更新 initramfs 或 initrd

引导加载程序装载 initramfs 或 initrd 的方式与内核相同。 在更新 initramfs 或 initrd 后无需重安装 GRUB,因为 GRUB 会在引导时搜索目录以获得正确的文件。

initramfs 中的 init

initramfs 中的 init 的主要用途是准备真实 root 文件系统的装入和访问。 根据系统配置的不同,init 负责以下任务。

装载内核模块

根据硬件配置的不同,可能需要一些特殊的驱动程序来访问计算机的硬件组件(最重要的组件是硬盘)。要访问最终的 root 文件系统,内核需要装载适当的文件系统驱动程序。

提供块特殊文件

内核对每个装载的模块生成设备事件。udev 处理这些事件,并在 RAM 文件系统上的 /dev 中生成必需的块特殊文件。没有这些特殊文件,文件系统和其他设备将不可访问。

管理 RAID 和 LVM 设置

如果将系统配置为在 RAID 或 LVM 下保存 root 文件系统,则 init 将设置 LVM 或 RAID 以支持稍后对 root 文件系统的访问。 在第 12 章 Advanced Disk Setup (↑部署指南)中查找关于 RAID 和 LVM 的信息。

管理网络配置

如果对系统进行配置以使用通过网络装入的 root 文件系统(通过 NFS 装入),则 init 必须确保装载了适当的网络驱动器,并确保对其进行设置以允许对 root 文件系统的访问。

在初始引导期间作为安装进程的一部分调用 init 时,要执行的任务将与上述任务不同:

查找安装媒体

启动安装进程时,计算机将通过安装媒体中的 YaST 安装程序装载一个安装内核和一个特殊的 initrd。YaST 安装程序在 RAM 文件系统中运行,它需要有关安装媒体位置的信息以访问安装媒体并安装操作系统。

启动硬件识别并装载适当的内核模块

第 9.1.1 节 “initramfs”中所述,引导进程从可用于大多数硬件配置的一组最小的驱动程序启动。init 将启动初始硬件扫描进程,以确定适合您的硬件配置的一组驱动程序。 引导进程所需的模块名写进 /etc/sysconfig/kernel 中的 INITRD_MODULES。 这些名称用来生成引导该系统所需要的自定义 initramfs。 如果模块不是用于引导,而是用于冷插入,则模块要写进 /etc/sysconfig/hardware/hwconfig-*。 本目录下用配置文件描述的所有设备均要在引导过程中进行初始化。

装载安装系统或救援系统

正确识别硬件后,即会装载相应的驱动程序,并且 udev 将创建特殊的设备文件,init 会使用实际的 YaST 安装程序启动安装系统或者启动救援系统。

启动 YaST

最后,init 将启动 YaST,由后者启动包安装和系统配置。