我是一名 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 -ul
。start
输出的字段指出给定分区从哪个扇区开始,这基本上是分区前的扇区数。因此从那里获取数字,例如使用 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
。
完成这些之后,您应该能够进入桌面,现在您需要搜索所有驱动程序,但这超出了本教程的范围。
来源
答案2
您可以尝试使用 partimage 和 gdisk 来执行此操作。使用 gdisk 或其他分区程序并调整当前磁盘的大小/在磁盘上的某个位置设置分区。理想情况下,它将是一个主分区。我通常将分区 1 保留用于 Windows,将分区 2+ 保留用于 Linux 数据。
一旦设置了分区,您就可以使用 gdisk 或其他 ghost 克隆来制作备份文件或直接将映像复制到另一个驱动器。如果您需要以这种方式删除文件,则可以设置到主机的网络连接,或者您可以制作 img 文件,然后将其从 vmdk 文件复制到主机系统...然后使用映像软件将分区还原到您在主机系统上创建的位置
根据需要配置 grub 以将启动添加到该 ntfs 分区。