当同一台计算机上有多个 Linux 操作系统时,每个安装都有自己的 GRUB 安装,并且通常在启动时使用最新的安装。当我记不清哪个是最新安装并且我想修改 GRUB 菜单时,就会出现此问题。如果不单独检查每个安装,如何确定正在使用哪一个?是否有一种更干净的设置可以通过仅安装一次 GRUB 来从一开始就避免该问题?
答案1
听起来您正在将 GRUB 安装在主硬盘的主引导记录中。由于硬盘只有一个MBR,因此一次只能有一个引导加载程序驻留在其中。您似乎还告诉所有操作系统安装引导加载程序。
处理此问题的正确方法(假设您要使用 MBR)是在您不想安装 GRUB 的任何操作系统上阻止 GRUB 将自身安装到 MBR。最简单的方法可能是删除 grub 软件包。
另一种方法是将引导加载程序安装在分区上并从那里引导,但这并不常见。
答案2
理想情况下,您应该只安装grub
一次,并为您安装的每个新发行版手动添加条目。
一种解决方法是在计算机启动时查看监视器,通常会有一条特定于发行版的消息。
即使情况并非如此,您也可以在当前使用的任何发行版中进行更改,然后更新 grub,这将更新 grub 菜单,然后您可以grub-install
对mbr
.
还这答案告诉您如何找到不同的 grub 阶段的位置。
答案3
理想情况下,正如 Nikhil 所说,“您应该只安装 grub 一次”,然后“为您安装的每个新发行版手动添加条目”,或者更理想的是,让全新安装提示您的 grub 文件的位置并添加自己的条目;我认为一些发行版可以做到这一点。
不幸的是,事情并不总是那么简单,特别是当您尝试不熟悉的新发行版时,等等,一旦您膜生物反应器被覆盖后,您必须处理重新安装旧 grub 的繁琐任务。 MBR 是磁盘的物理前半千字节(又名。引导扇区),由 PC BIOS 加载并执行(阅读更多),这就是 grub 开始的地方,但它随后会从分区加载更多内容(例如,您可能在 中找到的内容/boot/grub2/i386-pc
)。
因此,这里有一个处理整个问题的快速技巧/捷径:在安装发行版之前,将 MBR 复制出来。让安装程序毫不费力地做任何它想做的事情,然后,1) 将 MBR 副本放回引导扇区,2) 在相应的 grub 菜单中添加一个条目。
步骤1非常简单,事实上,每当您进行安装时,这都是一个好主意,以防万一出现问题而您只想回到开始的地方。 请注意,这不适用于新的 Windows 格式UEFI/GPT磁盘。 包含 MBR 的引导扇区正好是 512 字节:
dd if=/dev/sda of=mbr.copy bs=512 count=1
“/dev/sda”应该是 MBR 所在的物理磁盘。注意这是不是“/dev/sda1”,指的是/dev/sda上的第一个分区。
安装并启动进入新系统。然后,您可以在放置 MBR 备份的位置进行挂载,并且:
dd if=mbr.copy of=/dev/sda bs=512 count=1
急!重新启动,就像新安装从未发生过一样。但是,它仍然在其分区中,您所要做的就是第2步将其的 grub 菜单条目添加到旧的 grub 菜单中。
第 2 步比较困难,因为它需要您仔细检查/boot/grub2/grub.cfg
两个分区并决定如何添加新条目。第一的,按原样备份 grub.cfg。您应该能够直接剪切和粘贴条目,但要注意它们是否引用了文件中定义的某些函数,例如:
load_video
insmod part_msdos
看看 的其余部分grub.cfg
,隐含的是第二行是 grub 内置函数,但第一行load_video
是进一步定义的:
function load_video {
[...]
因此,如果您引用了该定义,请记住包含该定义。不要太害怕在这里进行实验,如果它不起作用,您仍然可以启动旧系统并开始询问更具体的问题;)。最糟糕的是,您完全搞砸了 grub.cfg,启动 Live CD 并用您制作的备份副本替换它。
答案4
我建议在引导扇区中安装单一版本的 Grub,即来自最稳定发行版的版本。如果您有其他操作系统,请将其引导加载程序安装在其自己分区的第一个扇区中,并从引导 Grub 进行链式加载。这样,您将始终拥有一个可启动的系统,并且所有升级机制都将按设计运行。
Grub 的安装脚本也能够检测其他 Linux 安装中的内核。这是一个很好的额外功能,但它很容易损坏,例如在升级内核但未启动主操作系统之后。因此,仅在链式加载之外使用该设施。
(但说实话,现在谁会双启动?使用虚拟机,您可以同时运行所有操作系统!)