如何将 VirtualBox VDI 内容复制到分区并从中双引导操作系统?

Cal*_*ius 13 linux virtualbox virtualization grub multi-boot

我是 Linux 用户,但我将压缩的 Windows XP ISO 保存在笔式驱动器上,以防万一我绝对需要 Windows 来做某事。大多数情况下,这在 VirtualBox 中有效。

但是现在我想玩一些游戏,所以我想本地运行Windows映像。我的电脑没有光驱,所以不能只刻录ISO并正常安装。

我想要做的是将安装的 Windows 映像移动到我的硬盘上的物理 NTFS 分区,并设置 GRUB 以让我双启动它。

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

我还尝试了 VMDK 技巧来使用该空分区并在其上安装 Windows。尽管安装的文本模式阶段顺利完成,但 VM 将无法工作,要么崩溃并不断重启,要么立即冻结(取决于我如何创建 VMDK,使用-rawdisk /dev/sda3-rawdisk /dev/sda -partition 3)。

Cal*_*ius 5

我昨天花了一整天的时间研究,终于能够使 Windows XP 启动。其他操作系统也应该有点相似。但操作是一切,但并非微不足道。

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

以下是步骤:

准备

在 Windows XP 的情况下,您需要让它忘记当前的磁盘号和分区设置,因此您需要在迁移之前擦除虚拟机上 HKEY_LOCAL_MACHINE/MountedDevices 键中的所有值。内核将在下次重新启动时重建它。在 Linux 虚拟机上,这意味着在迁移后修复 fstab。

挂载 VDI 映像

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

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

首先加载nbd驱动:

# modprobe nbd
Run Code Online (Sandbox Code Playgroud)

这应该使一些nbd设备在/dev.

然后挂载 VDI:

# qemu-nbd -c /dev/nbd0 path_to.vdi
Run Code Online (Sandbox Code Playgroud)

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

迁移分区

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

# dd -if=<nbd_device> -of=<real_partition>
Run Code Online (Sandbox Code Playgroud)

例如。:

# dd -if=/dev/nbd0p3 -of=/dev/sda4
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

$ VBoxManage internalcommands createrawvmdk -filename physical.vmdk -rawdisk /dev/sda
Run Code Online (Sandbox Code Playgroud)

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

修复 NTFS 分区的引导扇区

这是黑客部分。

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

打开分区hexedit,像这样:

# hexedit /dev/sda4
Run Code Online (Sandbox Code Playgroud)

然后在1C偏移量处以小端顺序写入隐藏扇区的数量。小字节序的意思是:0xABCDEFGH将是GH EF CD AB。如果十六进制数少于 8 位数字,则在它前面加上零。

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

设置 GRUB

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

title       Microsoft Windows XP Professional
root        (hd0,3)
savedefault
makeactive
chainloader +1
Run Code Online (Sandbox Code Playgroud)

其中(hdX, Y)标识分区。X 为 0 表示默认硬盘,1 表示/dev/sda,2 表示/dev/sdb等。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
Run Code Online (Sandbox Code Playgroud)

相应地设置分区号。我将它安装在 /dev/sda4 上。所以分区号应该是3。

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

注册表在<path to windows>/system32/config/system您可以查看它chntpw。如果您的系统驱动器号不是 C,这可能是一个问题。由于chntpw的注册表写入能力非常有限,您需要回退并使用 hexeditor,如 ghex2 来修复它。你需要找到\DosDevices\C:并用不同的驱动器盘符替换C,F在我的情况。

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

来源

将 Windows XP 移动到不同的分区

linux下挂载VDI