在我家的实验室中运行 RHEL7 虚拟机。/boot 与“/”分开。
root@localhost ~# grep part anaconda-ks.cfg -A4
clearpart --none --initlabel
# Disk partitioning information
part pv.251 --fstype="lvmpv" --ondisk=sda --size=12808
part /boot --fstype="xfs" --ondisk=sda --size=512
volgroup rhel --pesize=4096 pv.251
logvol swap --fstype="swap" --size=512 --name=swap --vgname=rhel
logvol /home --fstype="xfs" --size=1024 --name=home --vgname=rhel
logvol / --fstype="xfs" --size=11264 --name=root --vgname=rhel
我从 /etc/fstab 中删除了“/boot”条目,想看看会发生什么(我预计会出现有关缺少 grub2 或 initramfs 的错误)。但什么也没发生!RHEL7 启动并显示登录提示,我可以登录系统。我不明白 grub2、initramfs 和内核如何在没有 /boot 的情况下加载?
答案1
我不明白在没有 /boot 的情况下,grub2、initramfs 和内核是如何加载的?
因为所有这些事情在读取 /etc/fstab 之前就已经发生了。
- 固件加载 GRUB
- GRUB 加载内核和 initramfs;
- 内核启动init;
- init 读取 /etc/fstab。
因此,固件和 GRUB 都不能依赖 /etc/fstab – 它们使用自己的机制:
BIOS 固件始终从磁盘的第 0 扇区(MBR 所在的位置)运行引导代码。就您而言,该第 0 扇区将包含 GRUB stage1。
UEFI 固件将启动配置保存在 NVRAM 中 – RHEL 安装程序将其配置为
grubx64.efi
在“EFI 系统分区”中查找,该分区由 UUID 检测。一旦 GRUB 启动,它就已经知道它自己的分区,
grub.cfg
在其中找到并根据那里定义的 UUID 搜索 Linux 内核。(当然,grub.cfg
通常是生成基于安装过程中的 fstab 内容。
(GRUB 有自己的 ext4 甚至 LVM 驱动程序。一些引导加载程序(例如 systemd-boot)使用 UEFI 访问“EFI 系统分区”中的文件。我认为 LILO 曾经记住内核在磁盘上的扇区位置。)
另一个原因是 /etc/fstab 是特定于操作系统的配置,因此让 GRUB 直接依赖它会阻止它正确启动没有此类 fstab 的操作系统。
(对于第一步(固件加载 GRUB)来说,这一点更为重要。试想一下 - 如果这一步需要 /etc/fstab,那么固件如何启动 Windows?)
但请注意,这/boot
需要在 fstab 中 – 或以其他方式安装 –内核更新才能正常工作。如果您忘记挂载 /boot,下次升级将安装新模块,但不会安装内核本身。由于您不能混合使用不同的内核和模块版本,因此系统将无法正确启动。