我使用 Windows/ArchLinux 双启动已有几年了,几天前我决定完全放弃 Windows(因为我只使用它 1% 的时间)并将其放入 VM 中。
我将 Fedora 刻录到 USB 驱动器上(选择该发行版没有什么特别的原因,我只是想要一个可以工作的桌面环境,以避免使用命令行进行分区操作)并从中启动。我安装了分区然后就去上班了。
我先安装了 Windows,因此所有 Microsoft 分区都位于我的单个 SSD(512GB NVMe 驱动器)的开头,Linux 分区(一个用于/
,一个用于/home
)紧随其后。我擦除了 Windows 分区(但不是 EFI 分区),调整了 Linux/home
分区的大小以占用尽可能多的空间,然后将它们都移动到磁盘空间的开头,就在 EFI 分区之后,后者也移动了几 MB。
然后我重新启动,完全以为我的系统会死机,但一切正常。我只需要更新我的 GRUB 配置并从我的 EFI 分区中删除 Windows。
后来我问自己:尽管每个分区都已移动,GRUB 为何仍知道我的 Linux 映像在哪里,让我能够顺利启动它??
这个问题很可能源于对 GRUB 和 EFI 分区缺乏了解(我认为 GRUB 至少在某种程度上依赖它们来找出 Linux/Windows 启动文件的位置)。尽管如此,我对此还是很好奇,而且我无法从搜索引擎中得到直接的答案,因为我认为当您更多地了解这里的内部工作原理时,答案是显而易见的。
答案1
没有任何启动组件会跟踪内核映像的物理位置。这是几十年前 LILO 所做的事情,但即使是 PC BIOS 引导加载程序也大多不再这样做了。
相反,GRUB 2 和 EFI 固件实际上都理解分区表和文件系统。分区通常由其 GPT“分区 GUID”或其“文件系统 UUID”指示,而不是由其索引或物理位置指示 - 并且文件是通过文件系统中的路径访问的。
这适用于启动过程的所有阶段:
所有 EFI 固件都支持 FAT、MBR 和 GPT;它根据 GPT“分区 GUID”和存储在 EFI NVRAM 中的 FAT 文件路径在您的 EFI 系统分区中找到 GRUB。
GRUB 核心映像包含嵌入其中的必要分区和文件系统驱动程序,并根据直接嵌入到 grubx64.efi 文件中的“文件系统 GUID”找到 grub.cfg。(此映像由“grub-install”构建,包含访问 /boot/grub 所需的一切,无论是 GPT、Ext4 还是 ZFS。)
grub.cfg 文件(由“grub-mkconfig”构建)同样通过文件系统 UUID 和文件路径的组合指定内核和 initramfs 的路径。此时可以将其他驱动程序加载到 GRUB 中(例如,如果您的内核位于使用 LUKS 加密的 Btrfs 文件系统上)。
最后,一旦 Linux 内核运行,其命令行(同样来自 grub-mkconfig)也会通过其 UUID(通常是文件系统 UUID,但也可以使用 GPT 分区 GUID)引用
/
或root=
文件系统。initramfs 映像具有挂载 rootfs 所需的驱动程序。
答案2
为了完成 u1686_grawity 的回答,它是关于分区 UUID 以及用于移动分区的工具如何处理它们。
我遇到了相反的情况,这让我来到这里:我移动了留在 /dev/sda4 上的 EFI 分区,想知道 Linux 是如何启动但找不到 /boot/efi 的。然后我意识到 /etc/fstab 中的 UUID 与 blkid 告诉我的不匹配。
因此,这意味着,对于你的情况,你用来移动分区的 GParted 并没有改变分区 ID。而对于我的情况,移动工具(Windows 下的 MiniTool 分区向导)确实改变了我的启动分区的分区 ID。