我在一个硬盘上安装了多个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关联的文件。
我在这里缺少什么?
答案 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发行版中缺少它,并且上面描述的替代“修复”不起作用。