在我的笔记本电脑上,我安装了 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 安装在单独的虚拟分区中。一开始我并不清楚如何做到这一点,所以我将根据以下信息分享我所采取的步骤这问题。
- 我创建了一个大小为 20MB 的新虚拟磁盘,允许它动态增长(当我选择 5MB 固定大小时,正如链接问题所建议的那样,它不够大)。
- 我将磁盘连接到虚拟机,暂时将其放在已经启动的现有硬盘驱动器后面的 SATA 端口中,这样它就不会尝试从空驱动器启动。
- 我启动了Linux虚拟机。
我在新的 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
关闭虚拟机。
- 切换虚拟机中的硬盘,以便安装了 grub 的新硬盘现在位于第一个 SATA 端口,以便它首先启动。
编辑:我注意到使用此方法,在软件更新期间,它有时会根据 /etc/default/grub 中的配置重新生成 grub.cfg。如果您的 VM grub 的文件版本与非 VM grub 的文件版本不同,则可能会出现问题。您可能必须在每个设置中手动重新生成它。我不确定是否有更好的方法可以解决这个问题。