重置默认Grub引导

时间:2015-03-27 12:48:12

标签: linux boot grub

我在一个硬盘上安装了多个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)

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

root(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

或离开&#39; - stage2 = ...&#39;完全关闭选项,命令成功,但更改当前运行的操作系统启动的分区上的stage2文件 - 而不是与实际控制初始启动的MBR grub.conf关联的文件。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

所以,似乎答案是暴力破坏stage2 grub文件。这是保存的菜单条目的存储位置。

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

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

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

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