我有一个系统,在一个硬盘驱动器上安装了几个Red Hat。我想在运行时自动选择要启动的默认安装。Red Hat的方法(与Grub文档略有不同)是输入Grub shell并说
savedefault --stage2=<Stage 2 File> --default=<default>
其保存到指定的。
我使用链加载,所以磁盘上有几个grub.conf文件。我只想更改与/boot中绑定到MBR的stage2文件相关联的stage2,而不是与安装本身相关联的单个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相关联的文件。
我在这里错过了什么?
因此,答案似乎是暴力覆盖stage2 grub文件。这是保存的菜单项的存储位置。
Grub legacy保证将某些变量硬编码到此文件中的特定位置(请参阅此处)。注意,在阶段2的情况下,这些偏移是相对于512字节的偏移给出的。在我们的特殊情况下,我们希望更改保存的条目编号,偏移量为0x200+0xC。要将其更改为1,我们称之为
printf 'x01' | dd conv-notrunc of=/boot/grub/stage2 bs=1 seek=$((0x20c))
在下一次重新启动时,grub将自动选择菜单项1。
这就是grub set default命令应该做的,但Redhat发行版中缺少它,而且上面描述的替代"修复"也不起作用。