0

我有一个在单个硬盘驱动器上安装了多个 Red Hat 的系统。我想在运行时自动选择默认安装启动。Red Hat 执行此操作的方式(与 Grub 文档略有不同)是进入 grub shell 并说

savedefault --stage2=<Stage 2 File> --default=<default>

保存到指定的。

我使用链式加载,所以磁盘上有几个 grub.conf 文件。我只想更改与 /boot 中与 MBR 相关联的 stage2 文件,而不是与安装本身相关联的单个文件。在 grub 中,如果我说

find /boot/grub/stage2

或者

find /grub/stage2

我返回了所涉及的分区和文件的完整路径名的有效列表。在前一种情况下,类似

(hd0,1)
(hd0,2)

而在后者

(hd0,0)

我想改变的是后一种情况。但是,如果我接着说

根 (hd0,0)

savedefault --stage2=/grub/stage2 --default=1

或变体,如

savedefault --stage2=(hd0,0)/grub/stage2
savedefault --stage2=(hd0,0)/boot/grub/stage2

或类似的,我得到

Error 15: File not found

我隐约怀疑我没有正确安装分区,并且它可能是我做事的只读方式,但我所做的似乎没有改变正确的 stage2 文件。请注意,如果我只是说

savedefault --stage2=/boot/grub/stage2 --default=1

或完全关闭“--stage2=...”选项,该命令会成功,但会更改当前运行的操作系统从其引导的分区上的 stage2 文件 - 而不是与实际控制的 MBR grub.conf 关联的文件初始启动。

我在这里想念什么?

4

1 回答 1

1

因此,看来答案是蛮力覆盖 stage2 grub 文件。这是保存的菜单条目的存储位置。

Grub legacy 保证某些变量被硬编码到这个文件中的特定位置(见这里)。请注意,在 stage2 的情况下,这些偏移量是相对于 512 字节的偏移量给出的。在我们的特殊情况下,我们想要更改保存的条目号,偏移量为 0x200 + 0xC。要将其更改为 1,我们说

printf '\x01' | dd conv-notrunc of=/boot/grub/stage2 bs=1 seek=$((0x20c))

并且在下次重新启动时,grub 将自动选择菜单项 1。

这是 grub-set-default 命令应该做的,但在 Redhat 发行版中没有它,并且上面描述的替代“修复”不起作用。

于 2015-03-28T22:56:04.103 回答