是否有可能以某种方式让 VirtualBox 直接使用原始分区映像用于虚拟机?
原始分区映像是指包含以下文件的逐字节副本的文件:分割我想从这里启动。
我不想从原始启动磁盘图像,我也没有寻找从 VHD(它不是原始的,因为它包含其他元数据)启动的方法。
答案1
通过循环设备访问磁盘映像
(在此处找到:http://blog.mybox.ro/2010/11/03/how-to-use-a-raw-disk-image-file-in-virtualbox/)
步骤1:将磁盘映像与循环设备关联。
$ losetup /dev/loop0 /path/to/usb.img
第2步:创建一个虚拟磁盘并用 VirtualBox 注册它。
$ VBoxManage internalcommands createrawvmdk -filename /path/to/usb.vmdk -rawdisk /dev/loop0
步骤3:将虚拟磁盘连接到虚拟机并启动它。虚拟机将访问虚拟磁盘,该虚拟磁盘现在链接到 /dev/loop0,而 /dev/loop0 又链接到磁盘映像文件。
警告:为了实现这一点,VirtualBox 需要能够访问您创建的循环设备。这意味着要么将您的用户添加到有权访问磁盘的组(在我的 Ubuntu 机器上,这是组“磁盘”),要么您需要以 root 身份运行 VirtualBox。由于我经常摆弄磁盘,所以我使用了第一个选项(这就是为什么我的命令以 $ 而不是 # 开头),但我认为仅以 root 身份运行 VirtualBox 对大多数用户来说是更安全/更好的解决方案。
答案2
这里的两个答案都可以帮助你解决大部分问题,但我最终发现以下答案很有帮助:
首先,请注意,固定大小的 VHD 文件在结尾文件的开头比以元数据开头的文件更容易处理。对于启动 Linux 分区映像,VHD 就足够了。过去
VHDTool
微软称之为的一个工具它可以立即附加额外的元数据扇区,将原始图像转换为 VHD,但它现在很难在网上找到副本。 然而,我找到了源代码和二进制文件的副本执照显然允许重新分配,所以如果您正在寻找它,请告诉我。或者,可能还有其他工具可以做同样的事情,或者您可以制作相同大小的不同图像并传输附加的扇区(浪费,但可以完成工作)。否则,VMDK 文件就可以满足您的需要,因为它只是一个文本文件(至少在我的情况下是 LF 行尾,但 CRLF 可能也可以),可以引用其他文件作为块。这是我的一个 VMDK 文件的格式(阅读更多这里):
# Disk DescriptorFile version=1 CID=YYYYYYYY parentCID=ffffffff createType="partitionedDevice" # Extent description RW 1234 FLAT "\\.\C:\Path\To\Image.raw" 5678 # The disk Data Base #DDB ddb.virtualHWVersion = "4" ddb.adapterType="ide" ddb.geometry.cylinders="16383" ddb.geometry.heads="16" ddb.geometry.sectors="63" ddb.uuid.image="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" ddb.uuid.parent="00000000-0000-0000-0000-000000000000" ddb.uuid.modification="00000000-0000-0000-0000-000000000000" ddb.uuid.parentmodification="00000000-0000-0000-0000-000000000000" ddb.geometry.biosCylinders="1024" ddb.geometry.biosHeads="255" ddb.geometry.biosSectors="63"
需要填写的重要信息如下:
YYYYYYYY
:这是内容 ID。虚拟磁盘创建时,它是一个随机的十六进制 32 位值。有关详细信息,请参阅 VMDK 规范。XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
是磁盘的 ID。据我所知,它可以是任何随机 GUID,但我不确定。1234
是部门Image.raw
在要映射到磁盘的文件中5678
是个部门文件内部Image.raw
希望映射开始的偏移量
据我所知,有关磁盘几何形状的其他部分似乎无关紧要。
请注意,您不需要任何特殊命令来创建 VMDK,但正如其他人所说,VBoxManage internalcommands createrawvmdk
也可以为您创建一个,您可能会发现这更容易或更难,具体取决于您要做的事情。
还要注意,VMDK 也可以指向实际的分区或磁盘(\\.\PhysicalDriveN
在 Windows 等上),但需要注意的是,VirtualBox 不会锁定使用这些磁盘的卷,因此您会遇到写入错误和/或损坏,具体取决于您的操作系统以及卷是否已安装。
答案3
这可能不是您正在寻找的完整解决方案,但您可以启动到原始物理磁盘 - 如果您可以将分区文件挂载/伪装成磁盘,我可以看到它有效。否则,如果可以选择启动到物理磁盘,则在 Windows 7 主机上执行以下步骤:
- 创建一个“模拟”VMDK 文件,指向您希望在虚拟机中启动的物理磁盘(http://www.virtualbox.org/manual/ch09.html#rawdisk)。请注意,如果您运行的是 Windows,则需要以管理员身份运行 VirtualBox 管理界面和命令提示符才能使此命令成功执行。
- 将模拟 VMDK 附加到 VM。
- 在磁盘管理中将磁盘脱机,然后使用 DISKPART 清除其只读标志(https://forums.virtualbox.org/viewtopic.php?f=6&t=38914)。这可确保 VirtualBox 可以读取/写入该磁盘,但主机上的其他设备则无法读取/写入该磁盘。
然后,您就能够使用物理驱动器作为客户操作系统。超级方便。
答案4
在 Linux 中:创建 mbr 文件:
sudo install-mbr --force WinXP.mbr
之后创建一个 vmdk 文件,如下所示:
sudo VBoxManage internalcommands createrawvmdk -filename myUSB.vmdk -rawdisk /dev/sdc -partitions 1 -relative -mbr WinXP.mbr
/dev/sdc 应该是原始 .img 所取自的设备/usb 的分区。因此,我们将创建一个具有正确配置的 .vmdk conf 文件。
打开创建的 myUSB.vmdk。将 /dev/sdc 替换为 img 文件的路径。删除ralative
行
需要看起来像这样:
# Disk DescriptorFile
version=1
CID=557ec7f5
parentCID=ffffffff
createType="partitionedDevice"
# Extent description
RW 1 FLAT "myUSB-pt.vmdk" 0
RW 7812500 FLAT "new.img" 0
RW 22497899 ZERO
# The disk Data Base
#DDB
ddb.virtualHWVersion = "4"
ddb.adapterType="ide"
ddb.geometry.cylinders="16383"
ddb.geometry.heads="16"
ddb.geometry.sectors="63"
ddb.uuid.image="76bb94c9-64f5-4602-a65a-2aca02ce814f"
ddb.uuid.parent="00000000-0000-0000-0000-000000000000"
ddb.uuid.modification="00000000-0000-0000-0000-000000000000"
ddb.uuid.parentmodification="00000000-0000-0000-0000-000000000000"
ddb.geometry.biosCylinders="1024"
ddb.geometry.biosHeads="255"
ddb.geometry.biosSectors="63"