RHEL7 /boot 从 fstab 中删除

RHEL7 /boot 从 fstab 中删除

在我家的实验室中运行 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 之前就已经发生了。

  1. 固件加载 GRUB
  2. GRUB 加载内核和 initramfs;
  3. 内核启动init;
  4. 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,下次升级将安装新模块,但不会安装内核本身。由于您不能混合使用不同的内核和模块版本,因此系统将无法正确启动。

相关内容