配置 GRUB 以在虚拟机内选择不同的操作系统

配置 GRUB 以在虚拟机内选择不同的操作系统

在我的笔记本电脑上,我安装了 Windows 7 和 Linux 操作系统的双启动配置。

在 Windows 中工作时,我也通过 Oracle VirtualBox(通过原始 VMDK 文件)使用 Linux。

由于我只有一个硬盘,所以在所有这些情况下都使用相同的引导加载程序 (GRUB) 实例。是否可以以某种方式让 GRUB 在 VM 内选择 Linux 作为默认设置,否则选择 Windows 7?

我们也欢迎有关如何实现相同行为的其他选项。

答案1

嗯。。我认为您没有使用硬盘上的 grub 来启动虚拟机。是我搞混了还是您搞混了?

无论如何.. grub 中有一个默认指令:

# grep default /boot/grub/menu.lst 
default 3

如果 Windows 是第二个,则您应将其设置为 1,因为 0 是第一个操作系统条目。

您可以使用 sed (或者当然是交互式编辑器)来更改该值:

# sed 's/default 3/default 2/' -i /boot/grub/menu.lst 

更改值。有一些实验性的驱动程序可以在 Windows 中挂载 ext3,老实说,我不会推荐其中任何一个,不确定 ext4。也许有适用于 Windows 的良好驱动程序。

答案2

您可能应该在虚拟机中使用不同的启动设备。您可以简单地创建一个 5mb 的磁盘映像,并将其用作虚拟机中的启动“驱动器”。然后,您可以在那里安装 grub(或任何其他启动加载程序)以从虚拟机启动 Windows。

顺便说一句,我不得不怀疑 Windows 7 在虚拟机和物理硬件上的同一块硬盘上运行时会有多顺畅……每次更改时,Windows 是否都会经历一些严重的身份危机?

答案3

我认为,答案说,方法是将 grub 安装在单独的虚拟分区中。一开始我并不清楚如何做到这一点,所以我将根据以下信息分享我所采取的步骤问题。

  1. 我创建了一个大小为 20MB 的新虚拟磁盘,允许它动态增长(当我选择 5MB 固定大小时,正如链接问题所建议的那样,它不够大)。
  2. 我将磁盘连接到虚拟机,暂时将其放在已经启动的现有硬盘驱动器后面的 SATA 端口中,这样它就不会尝试从空驱动器启动。
  3. 我启动了Linux虚拟机。
  4. 我在新的 20MB 虚拟磁盘上安装了 grub。以下是我用来执行此操作的命令:

    sudo fdisk /dev/sdb 使用 n 命令创建一个新分区,选择主分区和其他默认选项,然后退出 fdisk。

    sudo mkfs.ext3 /dev/sdb1

    sudo mkdir /media/new_drive/

    sudo mount /dev/sdb1 /media/new_drive/

    sudo grub-install /dev/sdb --root-directory=/media/new_drive/

    另外,就我而言,我希望 grub 立即启动 Linux,因为它是唯一可以启动的东西。为此,我编辑了/etc/default/grub设置

    GRUB_TIMEOUT=0

    GRUB_RECORDFAIL_TIMEOUT=0

    我不确定为什么GRUB_RECORDFAIL_TIMEOUT在我的情况下需要这个,但这可能与它是虚拟机这一事实有关。

    然后我跑了:

    sudo grub-mkconfig -o /media/new_drive/boot/grub/grub.cfg

  5. 关闭虚拟机。

  6. 切换虚拟机中的硬盘,以便安装了 grub 的新硬盘现在位于第一个 SATA 端口,以便它首先启动。

编辑:我注意到使用此方法,在软件更新期间,它有时会根据 /etc/default/grub 中的配置重新生成 grub.cfg。如果您的 VM grub 的文件版本与非 VM grub 的文件版本不同,则可能会出现问题。您可能必须在每个设置中手动重新生成它。我不确定是否有更好的方法可以解决这个问题。

相关内容