10 引导过程简介 #
引导 Linux 系统涉及不同组件和任务。BIOS 或 UEFI 会初始化硬件本身,并通过引导加载程序启动内核。在此之后,引导进程完全由操作系统控制,并由 systemd
处理。systemd
会提供一组“目标”,用于引导与日常使用、维护或紧急情况相关的设置。
10.1 Linux 引导进程 #
Linux 引导进程包括多个阶段,每个阶段由一个不同组件来代表。下面的列表简要总结了引导过程并介绍了所涉及的所有主要组件:
BIOS/UEFI. 在打开计算机之后,BIOS 或 UEFI 将初始化屏幕和键盘并测试主内存。直到这一阶段,计算机不访问任何大容量储存媒体。随后,将从 CMOS 值装载有关当前日期、时间和最重要的外设的信息。当识别出第一块硬盘及其几何属性之后,系统控制将从 BIOS 传递到引导加载程序。如果 BIOS 支持网络引导,则也可以配置提供引导加载程序的引导服务器。在 AMD64/Intel 64 系统上需要进行 PXE 引导。其他体系结构通常使用 BOOTP 协议获得引导加载程序。有关 UEFI 的详细信息,请参见第 11 章 “UEFI(统一可扩展固件接口)”。
引导加载程序. 第一块硬盘的前 512 个字节的物理数据扇区将被装载到主储存器中,位于此扇区开始位置的引导加载程序将接管系统控制。引导加载程序执行的命令决定了引导进程剩余的部分。因此,第一块硬盘的前 512 个字节称为主引导记录 (MBR)。引导加载程序随后将控制传递到实际的操作系统(在本例中即 Linux 内核)。 有关 Linux 引导加载程序 GRUB 2 的详细信息,请参见第 12 章 “引导加载程序 GRUB 2”。对于网络引导,BIOS 充当了引导加载程序。它会从引导服务器获取引导映像,然后启动系统。这完全不依赖本地硬盘。
如果根文件系统无法从引导环境中装入,则必须先对其进行检查和修复,才能继续引导。如果文件系统为 Ext3 和 Ext4,文件系统检查程序将会自动启动。如果是 XFS 和 Btrfs 文件系统,则不会自动开始修复过程,而是向用户显示有关可用于修复文件系统的选项的信息。成功修复文件系统后,退出引导环境将会使系统重试装入根文件系统。如果装入成功,将正常继续引导。
内核和
initramfs
. 为了转交系统控制权,引导加载程序会将内核和基于 RAM 的初始文件系统 (initramfs
) 两者都装载到内存中。内核可以直接使用initramfs
的内容。initramfs
包含一个小的可执行文件init
,它可以处理真实根文件系统的装入。如果需要特殊硬盘驱动程序才能访问大容量储存,则这些程序必须在initramfs
中。有关initramfs
的详细信息,请参见第 10.2 节 “initramfs
”。如果系统没有本地硬盘,则initramfs
必须为内核提供根文件系统。这可以使用网络块设备(如 iSCSI 或 SAN)进行,但也可以使用 NFS 作为根设备。注意:init
进程命名有两个不同的程序通常命名为“init”:
用于装入根文件系统的
initramfs
进程用于设置系统的操作系统进程
在本章中,我们将它们分别称为“
initramfs
上的 init
”和“systemd
”。initramfs 中的 init
. 此程序执行装入正确根文件系统所需的全部操作。它为所需的文件系统提供内核功能,并为使用
udev
的大量储存控制器提供设备驱动程序。找到 root 文件系统后,对其进行错误检查并装入。如果装入成功,系统会清理initramfs
并执行根文件系统上的systemd
守护程序。有关initramfs
上的init
的更多信息,请参见第 10.3 节 “initramfs
中的 init”。有关udev
的详细信息,请参见第 22 章 “使用udev
进行动态内核设备管理”。systemd
.systemd
通过启动服务并装入文件系统来处理实际的系统引导。第 13 章 “systemd
守护程序”中介绍了systemd
。
10.2 initramfs
#
initramfs
是一个小型 cpio 存档,可由内核装载到 RAM 磁盘中。它提供了一个最小的 Linux 环境,可在装入实际 root 文件系统之前执行程序。这个最小的 Linux 环境由 BIOS 或 UEFI 例程载入内存,而且除了需要足够的内存外没有特定的硬件要求。initramfs
存档必须始终提供一个名为 init
的可执行文件,该文件执行根文件系统上的 systemd
守护程序,使引导进程得以继续。
在能够装入 root 文件系统并启动操作系统之前,内核需要相应的驱动程序来访问 root 文件系统所在的设备。 这些驱动程序可能包括用于特定类型硬盘的特殊驱动程序,甚至还可能包括访问网络文件系统所需的网络驱动程序。root 文件系统所需的模块可以由 initramfs
上的 init
来装载。装载模块后,udev
将为 initramfs
提供所需的设备。在引导过程的后面,更改 root 文件系统之后需要重新生成设备。将 systemd
单元 udev.service
与 udevtrigger
命令结合使用可以实现此目的。
如果需要更换硬件(例如硬盘),并且引导时此硬件需要内核中的不同驱动程序,则您必须更新 initramfs
文件。通过调用 dracut
-f
(选项 -f
会覆盖现有 initramfs 文件)执行此操作。要添加适用于新硬件的驱动程序,请编辑 /etc/dracut.conf.d/01-dist.conf
,添加下面一行。如果该文件不存在,请予以创建。
force_drivers+="DRIVER1"
用驱动程序的模块名称替换 DRIVER1。如果您需要添加多个驱动程序,请将其全部列出并以空格分隔 (DRIVER1
DRIVER2
)。
initramfs
或 init
引导加载程序装载 initramfs
或 init
的方式与内核相同。更新 initramfs
或 init
后无需重新安装 GRUB 2,因为 GRUB 2 会在引导时从该目录中搜索正确的文件。
如果您在 sysctl
界面中通过编辑相关文件(/etc/sysctl.conf
或 /etc/sysctl.d/*.conf
)更改了内核变量的值,系统下次重引导时,这项更改将会丢失。即使您在运行时使用 sysctl --system
装载这些值,更改也不会保存到 initramfs 文件中。您需要调用 dracut
-f
(选项 -f
会重写现有 initramfs 文件)来更新该文件。
10.3 initramfs
中的 init #
initramfs
上的 init
的主要用途是准备真实 root 文件系统的装入和访问。根据您的系统配置的不同,initramfs
上的 init
负责以下任务。
- 装载内核模块
根据硬件配置的不同,可能需要一些特殊的驱动程序来访问计算机的硬件组件(最重要的组件是硬盘)。要访问最终的 root 文件系统,内核需要装载适当的文件系统驱动程序。
- 提供块特殊文件
内核对每个装载的模块生成设备事件。
udev
会处理这些事件并在 RAM 文件系统的/dev
中生成所需的特殊块文件。没有这些特殊文件,文件系统和其他设备将不可访问。- 管理 RAID 和 LVM 设置
如果将系统配置为在 RAID 或 LVM 下保存根文件文件系统,则
initramfs
上的init
将设置 LVM 或 RAID 以支持以后对根文件系统的访问。要在不使用 YaST 的情况下直接更改
/usr
或swap
分区,则需要执行另外的操作。如未执行这些步骤,您的系统将会以紧急模式启动。为避免以紧急模式启动系统,请执行以下步骤:编辑
/etc/fstab
中的相应项,并将先前的分区替换为逻辑卷。执行以下命令:
root #
mount
-aroot #
swapon
-a使用
mkinitrd
或dracut
重新生成初始 RAM 磁盘 (initramfs)。如果是 IBM Z,另外还需运行
grub2-install
。
有关 RAID 和 LVM 的详细信息,请参见第 10 章 “专家分区程序”。
- 管理网络配置
如果将系统配置为使用通过网络装入的根文件系统(通过 NFS 装入),则
initramfs
上的init
必须确保装载了正确的网络驱动程序,并确保将其设置为支持访问根文件系统。如果文件系统驻留在一个联网的块设备(如 iSCSI 或 SAN)上,则与储存服务器的连接也由
initramfs
上的init
设置。SUSE Linux Enterprise Server 支持在主要目标不可用的情况下从次要 iSCSI 目标引导。有关 iSCSI 引导目标配置的更多细节,请参见第 14.3.1 节 “使用 YaST 执行 iSCSI 发起端配置”。
如果在安装过程的初始引导阶段调用 initramfs
上的 init
,它要执行的任务将与上述任务不同:
- 查找安装媒体
当您启动安装进程时,计算机会装载一个安装内核以及一个包含 YaST 安装程序的特殊
init
。YaST 安装程序正在 RAM 文件系统中运行,它需要知道安装媒体的位置,才能访问安装媒体以安装操作系统。- 启动硬件识别并装载适当的内核模块
如第 10.2 节 “
initramfs
” 中所述,引导进程从可用于大多数硬件配置的一组最小的驱动程序开始。init
将启动初始硬件扫描进程,以确定适合您的硬件配置的一组驱动程序。这些驱动程序用于生成引导系统所需的自定义initramfs
。如果引导时不需要这些模块,但冷插拔时需要,您可以使用systemd
装载这些模块。有关详细信息,请参见第 13.6.4 节 “装载内核模块”。- 装载安装系统
系统在正确识别硬件后会装载相应的驱动程序。
udev
程序会建立特殊的设备文件,init
将使用 YaST 安装程序启动安装系统。- 启动 YaST
最后,
init
将启动 YaST,由后者启动包安装和系统配置。