似乎我总是必须--boot-directory
在使用grub-install
.
如果我/boot
的分区上已经有现有的 grub 文件怎么办?我不应该只需要安装 grub 的 MBR 部分并将其指向我现有的分区之一/boot/grub
吗?我找不到这样的选择。
我已将 GPT 降级为 MBR 并删除了我的 BIOS 引导分区,这意味着如果我没有误解任何内容,我需要将 Grub 重新安装到我的 MBR。如果不这样做,我会留下一个 grub 救援提示,在执行ls
. 我意识到在将 grub 重新安装到 MBR 后,我的菜单条目可能仍然无法工作,因为它们引用了类似的分区hd0,gpt5
,但是有一个可用的提示就足够了,它可以让我更容易地确认我对 grub 的理解。
每当我想安装 grub 时,我是否必须写入 a --boot-directory
,即使目录已经存在?
当 GRUB 从 MBR 引导时,它在引导过程开始时需要执行的遗留 BIOS 兼容性步骤的数量意味着实际在 MBR 中的代码只能加载一个磁盘块,其 LBA 编号已修补到 MBR安装时的代码。该块通常是GRUB 核心映像的第一个块。它包含加载更多块的代码,以及定义其余 GRUB 核心映像所在位置的块编号列表。
在 MBR 分区的磁盘上,在 MBR 和第一个分区的开头之间通常有未使用的空间。对于 MS-DOS,最初的约定是在下一个磁盘磁道的开始处启动第一个分区,这通常意味着在第一个分区之前至少有 63 个磁盘块,包括 MBR。在现代系统上,第一个 MBR 分区现在更常见地放置在距磁盘开头正好 1MiB 的位置,即块 #2048,以优化可能在内部使用块的磁盘、SSD 和 SAN 存储系统的数据对齐大小大于 512 字节。
因此,在 MBR 分区的磁盘上,磁盘的开头通常是这样排列的:
请注意,GRUB 核心映像的加载仅通过预先确定的块编号进行:在完全加载和提取 GRUB 核心映像之前,GRUB 将不知道分区表或任何类型的文件系统。
在 GPT 分区磁盘上,块 #0 之后的块被 GPT 分区表占用,因此 GRUB 核心映像嵌入到“BIOS 引导分区”中。这只是意味着嵌入到 MBR 中的块编号不会是 1,而是 BIOS 引导分区的第一个块的编号,并且属于核心映像的其余块将同样移动。因此,在带有 BIOS 样式 GRUB 的 GPT 分区磁盘上,物理布局将是这样的,假设 BIOS 引导分区是磁盘上的第一个分区:
您仍然可以进入 GRUB 救援模式的事实表明,尽管您说您删除了 BIOS 引导分区,但您还没有覆盖它的块;尽管 BIOS 引导分区占用的空间现在可能是分区之间的未分配空间,或者是另一个调整大小的分区中的未使用空间,但它仍然有它的旧内容,GRUB 仍然可以加载这些块并找到它的核心映像。但是现在没有什么特别能保护这些块不被覆盖:无论出于何种原因,一旦发生这种情况,GRUB 核心映像将被破坏,并且 GRUB 将无法到达救援模式。
GRUB 核心映像的内容
GRUB 核心映像包含以下内容:
/boot/grub/grub.cfg
出现。/boot/grub/i386-pc
memdisk
SYSLINUX 引导加载程序系列的工具使用的那些所有这些都是 LZMA 压缩以最小化其大小,因此无法轻松读取或手动修改。
由于您现在进入救援模式并且无法列出您的分区,这表明 GRUB 核心映像包含 GPT (
part_gpt.mod
) 的分区模块,但不包含 MBR (part_msdos.mod
) 的分区模块。如果没有 MBR 分区模块,即使 GRUB 核心映像包含适用于它的文件系统驱动程序模块,它也无法访问包含/boot/grub/i386-pc
目录的分区......因此 GRUB 无法加载normal.mod
这将使您继续超越救援模式。现在需要做什么
/usr/lib/grub/i386-pc
或类似目录)在手边,因此最简单的方法是获取所有适当的未压缩组件,从中构建一个新的核心映像并对其进行压缩。解压旧代码并对其进行修改是不值得的麻烦:为什么在重用最初从头安装 GRUB 时使用的代码时编写另一段代码就可以了?grub-install
命令需要以某种方式确保normal.mod
位于其中的其他 GRUB 模块/boot/grub/i386-pc
与新的 GRUB 核心映像具有相同的版本。当然,它可以将现有文件与用于重建核心映像的文件集进行比较,但是再次......为什么在简单地/boot/grub/i386-pc
用已经存在的 GRUB 安装例程覆盖现有内容时为另一种特殊情况编写和调试代码工作得好吗?所有 GRUB 组件的总未压缩大小
i386-pc
肯定小于 4 MiB。没什么。如果它已经存在,试图避免重写根本不值得麻烦,除非你正在使用一些特殊的东西,比如旧的第一代 PATA SSD,可用的写入周期数非常有限。原生 UEFI 如何做到这一点?
由于 UEFI 固件包括标准的 FAT32 文件系统支持,因此可以将本机 UEFI 版本的 GRUB 引导加载程序打包为
grubx64.efi
包含所有必要模块的单个文件,包括normal.mod
如果您愿意的话。它作为常规文件加载:根本不需要在固定磁盘位置摆弄块编号或嵌入代码。