Debian的启动过程从UEFI固件开始,然后通过引导加载程序加载内核,进入迷Debian系统,最终转移到完整的Debian系统。这四个阶段依次完成了硬件初始化、引导加载、系统初始化和应用程序启动等关键任务,最终提供完整的操作系统功能给用户使用。
一、UEFI(第一阶段)
Unified Extensible Firmware Interface (UEFI) 是一种替代传统 BIOS 的固件接口,它定义了启动管理器作为 UEFI 规范的一部分。在计算机启动时,启动管理器是启动流程的第一阶段,它负责检查启动配置并根据配置的设置执行特定的操作系统引导加载程序或操作系统内核。这些启动配置存储在 NVRAM 变量中,其中包括指示操作系统引导加载程序或操作系统内核的文件系统路径。
EFI system partition (ESP) 是一个数据存储设备分区,用于遵循 UEFI 规范。在计算机启动时,UEFI固件访问ESP,并从中加载引导加载程序和其他必要的文件。ESP通常包含一个名为BOOT的目录,其中存储了引导加载程序和其他必要的文件。操作系统安装时会自动创建ESP分区,并将引导加载程序和其他必要的文件复制到ESP中。
与旧的PC系统使用MBR(Master Boot Record)不同,UEFI需要使用ESP来存储引导加载程序和其他必要的文件。同时,UEFI支持GPT(GUID Partition Table)分区表,可以支持更大的硬盘容量和更多的分区。因此,UEFI已成为现代计算机的标准固件接口。
二、引载加载程序(第二阶段)
引导加载程序是启动过程的第二阶段,由UEFI负责启动。它的主要任务是将系统内核映像和initrd(初始 RAM 磁盘)映像加载到内存,并将控制权交给它们。initrd映像是一个临时文件系统,其中包含了启动时所需的关键文件和驱动程序。
在Debian系统中,默认使用Linux内核作为系统内核。目前的Linux 5.x内核使用的是initramfs(初始 RAM 文件系统)映像技术,它是一种比较新的方式来创建initrd映像。
在引导加载程序方面,有许多可选的引导加载程序和配置选项可以选择。GRUB(GRand Unified Bootloader)是Debian中常用的引导加载程序,它提供了灵活的配置选项和功能丰富的界面。其他常见的引导加载程序还包括LILO(LInux LOader)和SYSLINUX等。
引导加载程序列表如下:
软件包 | 流行度 | 大小 | INITRD | 引导加载程序 | 说明 |
---|---|---|---|---|---|
grub-efi-amd64 | I:325 | 184 | 支持 | GRUB UEFI | 可智能识别磁盘分区和文件系统,例如 vfat、ext4…(UEFI) |
grub-pc | V:21, I:646 | 557 | 支持 | GRUB 第 2 版 | 可智能识别磁盘分区和文件系统,例如 vfat、ext4…(BIOS) |
grub-rescue-pc | V:0, I:0 | 6615 | 支持 | GRUB 第 2 版 | 此为 GRUB 第 2 版的可引导修复映像(CD 和软盘)(PC / BIOS 版本) |
syslinux | V:3, I:37 | 344 | 支持 | Isolinux | 可识别 ISO9660 文件系统。引导 CD 使用此项。 |
syslinux | V:3, I:37 | 344 | 支持 | Syslinux | 可识别 MSDOS 文件系统(FAT)。引导软盘使用此项。 |
loadlin | V:0, I:0 | 90 | 支持 | Loadlin | 新系统从 FreeDOS 或 MSDOS 中启动。 |
mbr | V:0, I:4 | 50 | 不支持 | Neil Turton 的 MBR | 此为取代 MSDOS MBR 的自由软件。只可识别硬盘分区。 |
注意:假如没有从 grub-rescue-pc 软件包中的映像制作出来的可引导修复盘(U盘、CD 或软盘),请勿玩弄引导加载程序。即使硬盘上没有可正常工作的引导加载程序,可引导修复盘也能引导系统。
对于 UEFI 系统,GRUB2 首先读取 ESP 分区,使用 “/boot/efi/EFI/debian/grub.cfg”里面 search.fs_uuid 指定的 UUID 来确定 GRUB2 菜单配置文件 “/boot/grub/grub.cfg” 所在的分区。
GRUB2 菜单配置文件的关键部分看起来像:
menuentry 'Debian GNU/Linux' ... { load_video insmod gzio insmod part_gpt insmod ext2 search --no-floppy --fs-uuid --set=root fe3e1db5-6454-46d6-a14c-071208ebe4b1 echo 'Loading Linux 5.10.0-6-amd64 ...' linux /boot/vmlinuz-5.10.0-6-amd64 root=UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 ro quiet echo 'Loading initial ramdisk ...' initrd /boot/initrd.img-5.10.0-6-amd64 }
对于这部分的 /boot/grub/grub.cfg,这个菜单条目的意义如下。
/boot/grub/grub.cfg 文件上面部分菜单条目意义:
设置 | 值 |
---|---|
GRUB2 模块加载 | gzio , part_gpt , ext2 |
使用的根文件系统分区 | 由 UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 指定的分区标识 |
内核镜像文件在根文件系统中的路径 | /boot/vmlinuz-5.10.0-6-amd64 |
使用的内核启动参数 | “root=UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 ro quiet “ |
initrd 镜像文件在根文件系统中的路径 | /boot/initrd.img-5.10.0-6-amd64 |
注意:
通过删除 “/boot/grub/grub.cfg” 里面的 quiet ,能够查看内核启动日志信息。为固化这个修改,请编辑 “/etc/default/grub”里的 “GRUB_CMDLINE_LINUX_DEFAULT=”quiet”” 行;
通过设置在“ /etc/default/grub” 的 GRUB_BACKGROUND 变量指向到图像文件,或者把图像文件本身放入 “/boot/grub/”,能够定制 GRUB 的启动图像。
三、迷Debian系统(第三阶段)
迷 Debian 系统是启动流程的第三阶段,由引导加载程序启动。它会在内存中运行系统内核和根文件系统。这是启动流程的一个可选准备阶段。
“迷 Debian 系统”是笔者自创的术语,用于在本文档中描述启动流程的第三个阶段。这个系统通常被称为 initrd 或 initramfs 系统。内存中类似的系统在 Debian 安装程序中使用。
/init 程序是内存中的根文件系统上执行的第一个程序。这个程序在用户空间把内核初始化,并把控制权交给下一阶段。迷 Debian 系统能够在主引导流程之前添加内核模块或以加密形式挂载根文件系统,使引导流程更加灵活。
1、如果 initramfs 是由 initramfs-tools 创建,则”/init” 程序是一个 shell 脚本程序。
通过给内核添加 “break=init” 等启动参数,可以中断这部分启动流程以获取 root shell,这个 shell 环境已足够成熟,可通过它很好地检查机器的硬件;
迷 Debian 系统中可用的命令是精简过的,且主要由一个称为 busybox(1) 的 GNU 工具提供。
2、如果 initramfs 是由 dracut 创建,则 “/init” 程序是一个二进制 systemd 程序。
迷 Debian 系统中可用的命令是一个精简过的 systemd(1) 环境;
当在一个只读的根文件系统上时,使用 mount 命令需要添加 -n 选项。
四、常规Debian系统(第四阶段)
常规 Debian 系统是启动流程的第四阶段,由迷 Debian 系统启动。迷 Debian 系统的内核在此环境下继续运行。根文件系统将由内存切换到实际的硬盘文件系统上。
init 程序是系统执行的第一个程序(PID=1),它启动其它各种程序以完成主引导流程。init 程序的默认路径是 ”/usr/sbin/init“,但可通过内核启动参数修改,例如 ”init=/path/to/init_program”。
在 Debian 8 jessie(2015 年发布)版本后,”/usr/sbin/init” 是一个到 “/lib/systemd/systemd” 的符号链接。
注意:系统中实际使用的 init 命令可以使用 “ps –pid 1 -f” 命令确认。
Debian 系统启动工具列表:
软件包 | 流行度 | 大小 | 说明 |
---|---|---|---|
systemd | V:856, I:964 | 11223 | 基于事件且支持并发的 init (8) 守护进程(可替代 sysvinit ) |
cloud-init | V:2, I:5 | 2870 | initialization system for infrastructure cloud instances |
systemd-sysv | V:823, I:962 | 77 | systemd 需用的用以代替 sysvinit 的手册页和符号链接 |
init-system-helpers | V:690, I:972 | 130 | 在 sysvinit 和 systemd 之间进行转换的帮助工具 |
initscripts | V:36, I:143 | 198 | 用于初始化和关闭系统的脚本 |
sysvinit-core | V:5, I:6 | 373 | 类 System V 的 init (8) 工具 |
sysv-rc | V:72, I:155 | 88 | 类 System V 的运行级别修改机制 |
sysvinit-utils | V:898, I:999 | 102 | 类 System V 的实用工具(startpar (8),bootlogd (8),……) |
lsb-base | V:686, I:729 | 12 | Linux 标准规范 3.2 版的 init 脚本功能 |
insserv | V:85, I:154 | 153 | 利用 LSB init.d 脚本依赖性来组织启动步骤的工具 |
kexec-tools | V:1, I:6 | 316 | 用于 kexec (8) 重启(热启动)的 kexec 工具 |
systemd-bootchart | V:0, I:0 | 131 | 启动流程性能分析器 |
mingetty | V:0, I:2 | 36 | 仅包含控制台的 getty (8) |
mgetty | V:0, I:0 | 315 | 可智能调制解调的 getty (8) 替代品 |