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
)。
我昨天花了一整天的时间研究,终于能够使 Windows XP 启动。其他操作系统也应该有点相似。但操作是一切,但并非微不足道。
因为这是一个危险的操作,我建议备份您的宝贵数据。
以下是步骤:
在 Windows XP 的情况下,您需要让它忘记当前的磁盘号和分区设置,因此您需要在迁移之前擦除虚拟机上 HKEY_LOCAL_MACHINE/MountedDevices 键中的所有值。内核将在下次重新启动时重建它。在 Linux 虚拟机上,这意味着在迁移后修复 fstab。
您不能只是将整个 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
分区。
这是黑客部分。
我们几乎准备好了,但 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 添加以下菜单项:
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
在我的情况。
在这些之后,您应该能够到达桌面,现在您需要寻找所有驱动程序,但这超出了本教程的范围。
归档时间: |
|
查看次数: |
7192 次 |
最近记录: |