我即将安装 Linux Mint 17.1 (Cinnamon) 作为我的主要操作系统。我还希望能够偶尔启动 Windows 7。我还想在 Linux 中运行 Windows 7 虚拟机。理想情况下,我希望有一个 Windows 7 安装,我可以从 Linux 内部启动或从虚拟机运行。这可能吗?哪种虚拟机软件支持这一点?理想情况下,我希望先安装 Linux 和 Windows,而不涉及虚拟机,然后再安装一个只适用于该 Windows 7 安装的虚拟机。
我相信很多人都想知道我为什么要这样做。我更喜欢尽可能多地在 Linux 中工作。但是,偶尔我需要运行一些在模拟环境中运行良好的 Windows 软件。在其他时候,我可能想在 Windows 7 上玩游戏,并通过直接启动 Windows 来充分利用我的显卡和其他硬件的功能。我不想处理多个 Windows 安装,我不想购买另一份 Windows 副本,也不想让它占用两个安装那么多的空间。我不确定我制作的 Windows 7 恢复 DVD 是否可以以任何其他方式工作,而不仅仅是正常安装而不涉及虚拟机。
我越想越觉得这似乎行不通。Windows 可能需要单独安装驱动程序,具体取决于它是作为虚拟机运行还是我直接启动它。Windows 可能会认为它是在单独的计算机上运行,并且需要在两台不同的计算机上注册两次,这是不允许的。
更新
我现在知道我更愿意使用 KVM、VirtualBox 或其他免费开源选项。我可以用 KVM 或 VirtualBox 实现我想要的功能吗?
答案1
警告:这是一项高度敏感的操作。您很容易损坏系统并丢失数据。对我有用的方法可能对您不起作用。在继续操作之前,最好先进行必要的备份。
我的经历和本网站是这些信息的来源:http://fds-team.de/cms/articles/2013-12/use-a-real-windows-7-partition-in-virtualbox-kvm-vmware-player-u.html该网站还包含其他可能有用的详细信息。
这些说明适用于 Linux Mint 17.1,但对于其他 Linux 发行版(尤其是基于 Ubuntu 的发行版),步骤应该类似。我建议使用 KVM,而不是 VirtualBox 或 VMware Player 或其他 VMware 产品。有关如何在 KVM 以外的环境中运行此操作的说明,请参阅链接。
为什么是 KVM?根据我的研究,目前这个类别似乎有三个主要参与者。KVM、VirutalBox 和一些不同的 VMware 产品。VMware 产品不是开源的,而且它们都不是免费用于商业用途的。VirtualBox 是免费的开源产品,但如果您需要添加 USB 2.0 支持,则需要安装一个扩展包,而您不应该将其用于商业用途。尽管在没有该扩展包的情况下支持 USB 3.0,但 VirtualBox 中的 USB 支持比 VMware 产品或 KVM 中的 USB 支持更成问题。KVM 是开源的,可以免费用于个人和商业用途。KVM 通过使用添加到 Linux 的内核模块来避免开销,从而提高性能和兼容性:http://blog.scalecomputing.com/kvm-or-vmware-why-kvm-is-right-for-the-times-part-1-of-2/
在下面的说明中,我将解释如何使用 virt-manager,它将在后台使用 KVM,这样您就可以使用 GUI,而不必通过终端在 KVM 中设置所有内容。
如果您尚未安装 Linux 和 Windows 7,请将它们安装在同一个硬盘的不同分区上。如果您将它们安装在不同的驱动器上,请参考链接中的说明。将它们设置为可以在它们之间进行双启动的位置。在继续之前,请按照您的需要设置分区。注意:某些 Windows 安装会为休眠创建单独的分区。如果您想删除此分区,现在是时候了。您必须查找有关此操作的说明,但我知道您可以在 Windows 内部执行此操作。如果您没有正确/完整地执行此操作,分区可能会自行重新创建。因此,如果您选择删除此分区,请重新启动计算机并再次启动 Windows,以查看它是否会重新创建分区。
启动进入 Linux。
找出包含 Linux 和 Windows 的硬盘路径。通常这是
/dev/sda
在 Linux Mint 17.1 上,您可以从主菜单启动磁盘以查看硬盘路径。从磁盘驱动器列表中选择您的硬盘。现在有关您的硬盘的信息将占据窗口的其余部分。在此信息的顶部,它应该以粗体显示您的硬盘大小,并在其下方以小文本显示您需要的路径。注意:从现在开始,我将使用
/dev/sda
来指代包含 Windows 7 和 Linux 分区的硬盘路径。您需要用正确的路径替换它。运行
sudo fdisk -l /dev/sda
以获取有关 Windows 7 硬盘分区的一些必要信息。您可能会看到 Windows 7 使用的两个 NTFS 分区。第一个分区相当小。它包含引导加载程序和恢复系统。另一个 NTFS 分区应该大得多,因为它包含实际的 Windows 7 安装。VM 需要这两个 NTFS 分区。目标:现在,您的目标是创建一个虚拟硬盘。这将允许您设置 MBR 并使其保持正确,无论您是从 VM 还是直接启动 Windows 7。这将防止您每次在直接启动 Windows 7 和从 VM 启动之间切换时运行修复实用程序。我使用设备映射器创建一个线性映射的虚拟硬盘,该虚拟硬盘映射到环回设备和我的两个 Windows 7 分区。我从中获得这些步骤的大部分网站都要求您使用 RAID,但是,我遇到了让它正常工作的问题。使用 RAID 时,由于块大小舍入,虚拟磁盘太小。https://unix.stackexchange.com/questions/217078/raid-mdadm-virtual-disk-too-small设置设备映射器线性映射似乎更合适,并且避免了块大小舍入问题。我使用设备映射器取得了成功。
检查上一步的 fdisk 输出。确定单个扇区占用多少字节。如果您的扇区像我的一样是 512 字节,这将使事情变得更容易。
再次检查 fdisk 输出。确定在第一个分区开始之前有多少个扇区未被使用。在我的例子中,第一个分区从扇区 2048 开始,这意味着前 2048 个扇区未被任何分区使用(0-2047)。这包含 GRUB 引导加载程序。
使用以下命令创建上一步中的字节映像。您需要将 2048 替换为正确的扇区数。如果您的扇区不是 512 字节,您还需要指定 bs=bytes_per_sector 参数:
dd if=/dev/zero of=boot.mbr count=2048
现在,您应该在当前目录中有一个名为 boot.mbr 的映像文件。
再次检查 fdisk 输出。确定 Windows 7 分区的路径。对我来说,它们是列出的前两个分区,它们都使用 NTFS。我的两个路径是
/dev/sda1
和/dev/sda2
笔记:从现在开始,我将使用
/dev/sda1
和/dev/sda2
来指代 Windows 7 分区。您需要将它们更改为系统上的正确路径。从图像文件创建环回设备:
sudo losetup /dev/loop0 boot.mbr
这将使您能够将 loop0 设备映射到虚拟磁盘。
在某处创建一个文件,定义映射到虚拟磁盘的内容。此文件将由设备映射器使用。我将我的文件放在 ~/vm/virtual_windows_disk_def。
在 ~/vm/virtual_windows_disk_def 中,为每个映射创建一行。每行应采用“logical_start_sector num_sectors linear destination_device 0”的形式。linear 只是表示我们正在进行线性映射。destination_device 应该是设备路径。0 表示映射将从目标设备的第一个扇区开始。第一行需要将 boot.mbr 映射到虚拟磁盘的开头。每个 Windows 7 分区都需要一个额外的行。这些是我的文件的内容:
0 2048 线性 /dev/loop0 0
2048 3072000 线性 /dev/sda1 0
3074048 447886719 线性 /dev/sda2 0
这就是我获得每行正确扇区数的方法:
blockdev --getsize /dev/loop0
blockdev --getsize /dev/sda1
blockdev --getsize /dev/sda2
检查 /dev/mapper/control 是否存在。如果不存在,请尝试加载 dm_mod 内核模块:
modprobe dm_mod
sudo dmsetup create virtual_windows_disk ~/vm/virtual_windows_disk_def
确保 /dev/mapper/virtual_windows_disk 的大小正确。
以交互模式启动 fdisk,在 /dev/mapper/virtual_windows_disk 磁盘上设置两个分区,以完美且精确地匹配 /dev/sda 磁盘上的两个 Windows 分区。您可以使用屏幕上的帮助和说明来完成此过程。如果您无法完美设置分区,退出而不是写入/保存这些分区据我所知,每个分区都需要匹配以下信息:起始扇区、结束扇区、是否可引导以及文件系统类型。将 512 替换为 /dev/sda 磁盘的每个扇区的字节数(这将以交互模式启动 fdisk):
sudo fdisk -b 512 /dev/mapper/virtual_windows_disk
sudo chown your_username:group /dev/mapper/virtual_windows_disk
- 从主菜单启动虚拟机管理器(即 virt-manager)。
- 在 virt-manager 内部,选择文件->添加连接。
- 确保 Hypervisor 设置为 QEMU/KVM。
- 确保“连接到远程主机”复选框未被选中。
- 确保已选中自动连接。
- 单击“连接”以创建连接。
- 右键单击连接(localhost(QEMU))并选择新建。
- 输入名称。
- 对于“选择如何安装操作系统”,请选择“导入现有磁盘映像”。
- 点击“转发”按钮。
- 在“提供现有存储路径”下单击浏览并选择 /dev/md-0(在我的系统上,它自动设置为 /dev/mapper/virtual_windows_disk 的别名)
- 继续前进,直到虚拟机启动。它应该会显示需要修复的问题。Windows 应该会因为这个问题而无法启动,但至少如果你得到了这些结果,你就走在了正确的轨道上。
- 强制关闭虚拟机。
- 将 Windows 安装/修复 DVD/映像附加到 VM。我的计算机已安装 Windows,但东芝提供了一种创建安装/修复 DVD 的方法。对我来说,我需要使用磁盘 4,因为这是带有 Windows 恢复环境的磁盘。我能够从 Linux 内部创建此磁盘的 ISO。我更喜欢将 ISO 作为 CD 驱动器附加到 VM,而不是将磁盘放在驱动器中,但无论哪种方式都可以。
- 在虚拟机详细信息区域,选择“启动选项”。确保选中“启用启动菜单”。确保选中硬盘和 CDROM,表明它们将成为启动选项。使用箭头按钮将硬盘移到顶部,将 CDROM 移到其下方。单击“应用”按钮保存更改。现在,当虚拟机启动时,它应该等待一段时间,让您有机会按 F12 键选择从哪个设备启动。
- 启动虚拟机并按 F12 进入启动菜单。
- 从 DVD/CDROM 驱动器启动。这将启动您的 Windows 安装/修复磁盘。
- 其他网站的说明说按 shift + F10 来访问命令提示符,但这对我来说毫无用处。我不得不选择系统恢复选项(而不是东芝恢复选项)。下一步。
- 在我的系统上,诊断程序会自动运行,计算机会主动修复它发现的问题。不要让它进行修复,选择其他选项。
- 确保选择“使用恢复工具...”而不是“使用系统映像恢复计算机...”。您应该在操作系统列表中看到 Windows 7。确保已选择并按“下一步”。单击“查看高级选项...”链接
- 选择打开命令提示符。
在提示符中输入此命令:
bootrec /FixMbr
现在你的虚拟机应该可以启动了,但是不要急着这么做。
通过在提示符中输入以下命令来确定为您的 Windows 安装分配了哪个驱动器号:
dir C:
dir D:
其中一个应该表明驱动器号不为空并且包含您的文件。这是您下一步所需的正确驱动器号。对我来说,它是驱动器 C。现在您需要在注册表中找到驱动器签名。在提示符中输入以下命令:
reg load HKLM\Computer_System D:\Windows\system32\config\system
regedit
- 导航到 HKEY_LOCAL_MACHINE\Computer_System\MountedDevices。找到 \DosDevices\X: 条目,其中 X 与两步之前的驱动器号匹配。您需要在下一步中引用该条目中的数据。
不要关闭注册表编辑器,激活命令提示符窗口。输入以下命令:
diskpart
磁盘部分>
select disk 0
下一步,您需要将末尾的字母替换为注册表编辑器中该条目值中当前显示的前四组字符。但是,您需要反转这些字符的顺序。例如,如果您看到 ab cd ef gh,则需要在命令末尾添加 ghefcdab:
磁盘部分>
uniqueid disk id=ghefcdab
- 输入此命令:
exit
。diskpart 程序应退出,让您进入正常命令提示符。 - 关闭注册表编辑器。
- 在命令提示符中输入:
reg unload HKLM\Computer_System
- 关闭命令提示符。
- 如果您看到重新启动或关闭选项,请立即执行此操作。否则,指示虚拟机关闭。如果这不起作用,请强制关闭虚拟机。如果您的虚拟机已关闭,请保持原样。如果它重新启动,请手动关闭它,或者如果这不可能,请强制关闭它。
- 在您的虚拟机详细信息中,选中“配置”箭头以显示更多选项。单击“复制主机 CPU 配置”按钮。单击“应用”按钮。您已完成!接下来的步骤将帮助您确认一切正常。
- 启动虚拟机。它应该可以正常启动 Windows,不会出现任何问题或需要修复。关闭虚拟机。
- 在执行下一步时,请勿将视线从屏幕上移开。选择休眠以关闭系统(否则,再次启动 Linux 时,您将不得不重复某些步骤)。启动计算机,然后直接启动 Windows。仔细观察屏幕,查看是否发生或需要修复。如果一切正常,则应该可以启动 Windows,而无需进行或不需要任何修复。在我的系统上,当设置不正确时,它会自动修复 Windows,然后启动 Windows,就像没有发生任何不好的事情一样,这就是为什么您应该仔细观察屏幕的原因。如果需要修复,则您在 diskpart 中所做的签名更改出了问题。启动 Linux 并重复相关步骤,小心确保签名正确。
建议
每次启动 Linux 时,都必须重复创建回送设备以及使用设备映射器设置 /dev/dm-0 虚拟驱动器的步骤。您应该编写此脚本,以便在启动 virt-manager 之前运行该脚本。目前,该脚本超出了本回答的范围,但我可能会在为我的系统创建一个脚本后添加它。
尖端
- 当您尝试让一切正常运行时,如果您需要在 Linux 运行时重新启动计算机以便直接启动 Windows,我建议您先休眠,然后再启动计算机。这样,当您最终再次启动 Linux 时,您就不会丢失所做的工作。这会对您有所帮助,直到您获得脚本设置,但这不是一个永久的解决方案,因为您最终需要真正完全重新启动 Linux。
- 如果您因为 virt-manager 或 KVM 的问题而陷入困境,您可以尝试其他选项,例如 VirtualBox 或 VMware Player。由于此解决方案创建了一个虚拟驱动器,您可以在不同的虚拟机程序之间切换而不会丢失进度。即使一切正常,这也是此解决方案的妙处之一。您可以随时从正常的 Windows 启动或您选择的任何虚拟机程序运行相同的 Windows 安装。只是不要一次运行多个虚拟机。
- 这些信息大部分来自一个网站,该网站建议,如果在 Windows 安装中安装 VirtIO 驱动程序,您可能会获得更好的 KVM 性能。我还没有尝试过。