如何在VirtualBox虚拟机中使用已安装Windows 7的真实分区?

我的Ubuntu 12.04安装在/dev/sda5上,Windows 7安装在/dev/sda1上。当我运行Ubuntu时,我想使用Virtualbox在虚拟机中运行Windows 7。Windows 7分区有1TB大小,已经使用了一半的空间,所以我不想将其复制到虚拟硬盘中。
我听说可以使用真实的硬盘作为Virtualbox虚拟机的存储设备,但是我找到的各种教程互相有所不同,而且似乎无法让它正常工作。有人知道在Ubuntu 12.04和Virtualbox 2.1.12_Ubuntu r77245(最新版本)下如何使其工作吗?
请分享您成功的方法,我想尝试任何可能有效的方法。

为什么你的MSWIN分区是1TiB?虽然这不是一个完整的解决方案:如果可能的话,将不需要放在那里的所有内容(数据...媒体文件?)移动出去,然后调整分区大小,这样任何方法都会更容易。如果你想选择镜像的方式,清理并缩小该分区将为你留下足够的空间来创建较小、新分区的完整镜像。 :-) - Alastair
相关链接:在 VirtualBox 中使用物理硬盘 - kenorb
6个回答

你想要的命令是:
VBoxManage internalcommands createrawvmdk -filename Win7.vmdk -rawdisk /dev/sda -partitions 1

这将创建一个特殊的VMDK虚拟磁盘文件(Win7.vmdk),实际上它是指向主机磁盘分区/dev/sda1的指针。
理论上,您可以将其用作虚拟机的磁盘文件,直接从实际磁盘分区运行,但是...
  • (a) 我从未尝试过这个,所以不知道它有多可靠
  • (b) 根据您的许可证密钥和Windows是否认为检测到的“硬件”发生了重大变化,您可能会遇到Windows激活问题。

谢谢。我甚至没有考虑到激活的问题。这肯定会阻止我的计划。 - Jazz
1此外,即使它能够运行(我对此表示怀疑),你在同时从启动项和虚拟机中运行时可能会严重损坏你的Windows系统。 - Takkat
@ubnewbie2:我可能只会将此视为实验,并且仅在使用某种批量授权密钥时尝试。而且,我可能认为这是一个单向操作;即反转它可能更加困难。实际上,我在运行Windows 7,并在VirtualBox虚拟机中使用Ubuntu,通常全屏模式下,因此电脑似乎只运行Linux,并且更有信心在原始磁盘分区上运行Ubuntu。 - StarNamer
FYI,我现在尝试了相反的操作。我需要将运行Ubuntu的机器改为Win 7,所以通过调整分区和创建新分区来释放一些空间,并安装了Win 7。这将grub2替换为Windows引导程序,所以我随后安装了VirtualBox并创建了一个新的虚拟机,使用最小的虚拟磁盘进行引导,然后从现有的“原始”分区中运行。它的效果还可以,尽管由于内存减少和只能看到1个CPU核心(而不是4个),速度有点慢。 - StarNamer
在列表的末尾,列出你希望虚拟机中的 VirtualBox "看到" 的分区(而不是你想要使用的分区号)。VBoxManage internalcommands --help 将展示其他你可以使用内部命令完成的操作,以及选项的含义。 - boatcoder
我只是想在这里值得注意的是,对于那些担心的人来说,多年来我一直成功地使用这种方法。没有任何数据或操作系统完整性问题可报告,这是我经常在第三个系统上使用的。在Windows 10上,我偶尔会看到一个微弱且半透明的“您需要激活Windows”水印出现在右下角,但它是间歇性的,并且从未阻止我实际使用Windows。它会在正常启动时消失,这似乎会使消息休眠一段时间。Windows更新也可以在虚拟机会话中无缝运行! - CauselessEffect

是的,你可以使用内部的createrawvmdk命令来实现这一点,它不会创建整个磁盘镜像,而是创建一个指向实际硬件的指针。
有两种方法可以做到这一点。
  • A. 完整磁盘映像(/dev/sdb)

    sudo VBoxManage internalcommands createrawvmdk -filename sdb.vmdk -rawdisk /dev/sdb
    
  • B. 分区映像

    正如@StarNamer所示,您可以只使用一个或几个分区。

    要创建仅包含一个(/dev/sda1)分区的映像:

    sudo VBoxManage internalcommands createrawvmdk -filename sda1.vmdk -rawdisk /dev/sda -partitions 1
    

    要创建自定义分区表,其中按顺序映射/dev/sda2和/dev/sda1:

    sudo VBoxManage internalcommands createrawvmdk -filename sda2_1.vmdk -rawdisk /dev/sda -partitions 2,1
    

最显著的区别将是完整磁盘镜像将使用与您的磁盘完全相同的引导加载程序和分区表,因此理论上来说(我之前只在qemu中做过这样的尝试),您将能够从虚拟机设置操作系统。根据我的有限经验,可以说完整磁盘镜像将与qemu -hda /dev/sdb完全相同。

注意:如果您使用用户访问磁盘,您需要将其添加到diskvboxusers组中,例如:

sudo usermod -aG disk,vboxusers ubuntu

然后确保您重新登录或重新启动计算机。
进一步阅读:
VirtualBox文档:从客户机使用原始主机硬盘 VirtualBox仅在UEFI交互式shell中启动(仅包含UEFI安装的ESP将不起作用) 从Ubuntu内部(12)安装Windows MBR引导程序(临时)。 更好的方法是,您可以将MBR安装到文件中,并在创建VMDK时使用-mbr选项(参见1)。 如果出现VERR_ACCESS_DENIED错误,请检查:Virtualbox无法与真实分区配合使用

“完整磁盘映像将使用引导加载程序和分区表,正如它们在您的磁盘中所处的状态” - 在第一种(/dev/sdb)或第二种方案(指定分区)下? - naught101
1此外,VirtualBox需要以root身份运行,否则会出现“访问'/home/naught101/sda2_windows.vmdk'文件的权限问题”。 - naught101
3另外,VirtualBox 需要以 root 用户身份运行。实际上,不是的,你只需要成为 disk 组的成员即可。这比以 root 身份运行 VirtualBox 更安全。 - user193006
3这是我在Ubuntu 16.04作为主机系统,Windows 10作为客户机时的解决方案:我使用sudo VBoxManage internalcommands createrawvmdk -filename sda1_2_3.vmdk -rawdisk /dev/sda -partitions 1, 2, 3命令创建了.vmdk文件。这样我就包括了Windows分区和EFI引导加载器分区。然后,我按照shilka在https://www.virtualbox.org/ticket/7702上的指示添加了cloverefiboot。效果非常好! - dzmanto
您还可以在VirutalBox(和VBoxManage)命令前加上sudo -g disk,以仅授予对VirtualBox的访问权限,而不是您的所有其他进程。 - Jan Hudec

有一个称为“不可变”的磁盘选项,理论上,如果您为链接到原始磁盘的vmdk选择此选项,则不应更改原始分区。

要这样做,请打开“虚拟媒体管理器”(在“文件”下找到),选择您的映像并单击“修改”(您必须确保此映像未连接到任何计算机,否则会出错)。现在您可以将媒体类型设置为“不可变”。

我尚未测试过这一点。如果有人这样做了(当然是在测试环境下),请在此处回报一下。

有没有考虑反对这个想法的意见?


经过多次尝试,我最终得到了一个整洁而干净的解决方案:

  1. 启动您想要虚拟化的Windows分区
  2. 从Sysinternals下载Disk2VHD实用程序
  3. 如果您有UEFI分区按照这些说明操作
  4. 创建一个C:分区、恢复、UEFI(如果有)和其他您想要的内容的VHD(不是VHDX)镜像
  5. 回到Linux,打开VirtualBox,并根据您的Windows操作系统规格创建一个虚拟机
  6. 将在第4步创建的VHD磁盘附加到该虚拟机上
  7. 就这样
  8. 获利

UEFI情况下的故障排除:

  1. 在VirtualBox的VM设置中,在系统选项卡下勾选"启用EFI"
  2. 如果你在EFI Shell卡住了,请运行以下命令:

    fs0:\EFI\Boot\bkpbootx64.efi
    

对于这个负评有什么评论吗? - garlix
我知道这事发生在几天前,但我不记得给你投过反对票,至少不是故意的。如果可以的话,我愿意取消投票,非常抱歉。 - userfuser

多年来,我一直在运行双启动的Windows和Ubuntu系统,其中Ubuntu分区还能通过Windows VirtualBox引导,以利用Linux尚未掌握的触摸屏功能。
我按照以下类似的说明进行设置; 新的机器可以比旧机器上的单个系统更好地同时处理两个操作系统。
缺点是:您需要保存用于设置的说明,以防更新禁用VirtualBox连接(这是我目前遇到的问题)。

VirtualBox有很多缺点。我几年前就放弃了它。现在我使用qemu-kvm,除了其他很好的功能外,它还可以配置为与磁盘设备以相同的方式使用磁盘映像。诀窍是配置虚拟"-drive if=sd,id=sda,format=raw,file=/dev/sda"。
但是!在尝试虚拟化之前,您必须先在裸机上运行MSW时进行一些更改:查看“驱动程序”文件夹,确保正确的驱动程序存在,并且“注册表”树中启用了这些驱动程序,并设置为在系统启动之前运行,例如:
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\msahci] "Start"=dword:00000000

你必须针对虚拟机寻找合适的驱动程序,如果你不想看到蓝屏错误。
很难说要激活哪些驱动程序。最好的方法是先安装一个测试系统,然后在其中搜索注册表键值为"Start"=dword:00000000的注册表键,并将这些键设置在裸机上。还建议检查裸机的MAC地址并将其放入qemu配置中。这样可以防止系统要求重新激活。