如何将VirtualBox VDI内容复制到分区并从中双重引导OS?


12

我是Linux用户,但是我绝对需要Windows来做某事,所以我随身携带一个压缩的Windows XP ISO。大多数情况下,这在VirtualBox中有效。

但是现在我想玩一些游戏,所以我想在本地运行Windows映像。我的计算机没有CD驱动器,因此不能仅刻录ISO并正常安装。

我要做的是将已安装的Windows映像移至HDD上的物理NTFS分区,并设置GRUB以使其双重引导。

我找到了许多有关将VDI制作为物理驱动器的教程。但是他们认为我要覆盖整个驱动器。将原始磁盘映像dd移至分区会导致分区损坏。

我还尝试了VMDK技巧来使用该空分区并在其上安装Windows。尽管安装的文本模式阶段没有问题,但VM无法正常工作,崩溃并继续重新引导或只是立即冻结(取决于使用-rawdisk /dev/sda3或创建VMDK的方式-rawdisk /dev/sda -partition 3)。

Answers:


4

我昨天花了所有的时间进行研究,终于能够启动Windows XP。对于其他OS,它也应该有点相似。但是操作是一切,但并非无关紧要。

因为这是一项危险的操作,所以我建议备份您的宝贵数据。

步骤如下:

制备

如果是Windows XP,则需要使其忘记当前磁盘号和分区设置,因此在迁移之前,需要从虚拟机上的HKEY_LOCAL_MACHINE / MountedDevices项中删除所有值。内核将在下次重启时重建它。在Linux虚拟机上,这意味着在迁移后修复fstab。

挂载VDI映像

您不能仅将整个VDI复制到分区,因为它也包含MBR。您只需要复制虚拟分区,因此首先需要找到一种挂载VDI的方法。

您需要nbd驱动程序和qemu-nbd命令。在Ubuntu上,它在qemu-kvm软件包中。

首先加载nbd驱动程序:

# modprobe nbd

这应该使中的一些nbd设备/dev

然后挂载VDI:

# qemu-nbd -c /dev/nbd0 path_to.vdi

对于所有虚拟分区,应为/dev/nbd0p1,等等。这些可以像任何普通设备一样安装。/dev/nbd0p2/dev/nbd0p3

迁移分区

使用dd该,卸载操作前两个分区:

# dd -if=<nbd_device> -of=<real_partition>

例如。:

# dd -if=/dev/nbd0p3 -of=/dev/sda4

操作dd是无声的,这可能需要几分钟,甚至半个小时。在操作过程中,您可以打开终端并使用fdisk -l以查看所有操作是否正常。

更新:

显然,nbd不是万无一失的解决方案。这可能会导致I / O错误,并使dd失败。而且下一次尝试立即失败。您也可以尝试使用以下命令制作原始磁盘VMDK(在Linux下):

$ VBoxManage internalcommands createrawvmdk -filename physical.vmdk -rawdisk /dev/sda

您需要加入disk小组才能使其正常工作。然后将此vmdk作为辅助硬盘驱动器添加到虚拟机,然后dd对分区使用Live Linux ISO 。

修复NTFS分区的启动扇区

这是朴实的部分。

我们已经准备好了,但是Windows XP无法启动,因为我们需要将文件系统的隐藏扇区数设置为offset 0x1C。这基本上是NTFS分区之前的多个扇区。我们可以从fdisk -ul命令中获取此号码。所述start的输出状态的给定的分区开始处的扇区字段,它基本上是分区之前的扇区数。因此,从那里获取数字,例如使用gcalctool将其转换为十六进制。

使用打开分区hexedit,如下所示:

# hexedit /dev/sda4

然后在1C偏移处以小端顺序写入隐藏扇区的数量。小远方意味着:0xABCDEFGHGH EF CD AB。如果十六进制数字短于8位数字,则在其前面加上零。

完成后,保存并退出(Ctrl + X)。

设置GRUB

您必须告诉GRUB直接启动该分区,为GRUB添加以下菜单项:

title       Microsoft Windows XP Professional
root        (hd0,3)
savedefault
makeactive
chainloader +1

哪里(hdX, Y)标识分区。对于默认硬盘,X为0,对于默认硬盘为1 /dev/sda,对于其他为/dev/sdb2。Y是分区号。0代表/dev/sda1,1代表/dev/sda2,依此类推。

对于GRUB2,这也应该类似,但是它对菜单项使用的语法略有不同。

最后的润色

新的NTFS分区已准备好启动。但是您仍然需要进行一些黑客操作才能访问Windows XP桌面。其他系统可能需要不同的技巧。首先,需要修复boot.ini。

[boot loader]
timeout=1
default=multi(0)disk(0)rdisk(0)partition(3)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(3)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect

相应地设置分区号。我将其安装在/ dev / sda4上。因此分区号应为3。

如果Windows在登录屏幕之前冻结,则可能需要在注册表中修复MountedDevices条目。

<path to windows>/system32/config/system您可以通过来查看注册表chntpw。如果您的系统驱动器号不是C,这可能是一个问题。由于chntpw的注册表写入功能非常有限,因此您需要进行回退并使用ghex2之类的hexeditor进行修复。在我的情况下\DosDevices\C:,您需要查找C并用其他驱动器号替换F

完成这些之后,您应该能够访问桌面,现在您需要寻找所有驱动程序,但这超出了本教程的范围。

资料来源

将Windows XP移至其他分区

在Linux下挂载VDI


0

您可以尝试使用partimage和gdisk进行操作。使用gdisk或其他分区程序,并调整当前磁盘的大小/在某个位置的磁盘上设置分区。理想情况下,它将是一个主分区。我通常将分区1用于Windows,将2+用于Linux数据。

一旦建立了分区,就可以使用gdisk或另一个ghost克隆将备份文件或直接映像制作到另一个驱动器。如果您需要以这种方式删除文件,则可以建立到主机的网络连接;或者可以制作img文件,然后将其从vmdk文件复制到主机系统中……然后使用映像软件还原分区到您在主机系统上创建的位置

根据需要配置grub,以将引导添加到该ntfs分区。


您可能还可以通过一种方式来使vmdk失效,这将允许图像软件直接从主机jsut读取它,具体取决于图像软件的方式。
肯德里克2012年

我昨天花了所有的时间进行研究,终于能够启动Windows XP。我将详细记录下来。这不是小事。
Calmarius 2012年

具有讽刺意味的是,但我将需要尽快执行此过程。我有一台由于某种原因不喜欢安装solaris的电脑,因此我不得不将数据从我需要的虚拟机拉到新机器上。
肯德里克(Kendrick)2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.