准备

准备

我是一名 Linux 用户,但我随身携带一个压缩的 Windows XP ISO 放在 U 盘中,以备万一需要 Windows 执行某些操作时使用。这在 VirtualBox 中大多数情况下都有效。

但现在我想玩一些游戏,所以我想本地运行 Windows 映像。我的电脑没有 CD 驱动器,所以无法直接刻录 ISO 并正常安装。

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

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

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

答案1

我昨天花了一整天时间研究,终于能够让 Windows XP 启动。其他操作系统应该也差不多。但操作一点也不简单。

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

步骤如下:

准备

如果是 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 失败。而且下一次尝试会立即失败。您还可以尝试使用此命令(在 Linux 下)创建原始磁盘 VMDK:

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

您需要加入该disk组才能使其工作。然后将此 vmdk 作为辅助硬盘添加到虚拟机,然后使用 Live Linux ISO 进行dd分区。

修复 NTFS 分区的引导扇区

这是比较 hack 的部分。

我们几乎已经准备好了,但 Windows XP 无法启动,因为我们需要设置偏移量处的文件系统隐藏扇区数0x1C。这基本上是 NTFS 分区前的扇区数。我们可以从命令中获取这个数字fdisk -ulstart输出的字段指出给定分区从哪个扇区开始,这基本上是分区前的扇区数。因此从那里获取数字,例如使用 gcalctool 将其转换为十六进制。

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

# hexedit /dev/sda4

然后在偏移处以小端顺序写入隐藏扇区的数量1C。小端表示:0xABCDEFGH将是GH 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,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

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

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

注册表位于,<path to windows>/system32/config/system您可以通过 来查看chntpw。如果您的系统驱动器号不是 C,则可能会出现问题。由于chntpw的注册表写入功能非常有限,因此您需要回退并使用十六进制编辑器(如 ghex2)来修复它。在我的情况下,您需要找到\DosDevices\C:C 并将其替换为其他驱动器号F

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

来源

将 Windows XP 移至其他分区

在 Linux 下挂载 VDI

答案2

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

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

根据需要配置 grub 以将启动添加到该 ntfs 分区。

相关内容