原料:运行带有 LinuxMint(主系统)和其他操作系统的系统,其中包括旧的 Windows 7 映像。系统通过 GRUB2 引导至 Ubuntu、Windows,没有任何问题。
这是系统的分区图:
(parted) print
Modell: ATA HGST HTS721010A9 (scsi)
Festplatte /dev/sda: 1000GB
Sektorgröße (logisch/physisch): 512B/4096B
Partitionstabelle: msdos
Disk-Flags:
Nummer Anfang Ende Größe Typ Dateisystem Flags
1 1049kB 252GB 252GB primary ntfs boot
4 252GB 306GB 54,6GB extended
6 252GB 273GB 21,0GB logical ext4
5 273GB 306GB 33,6GB logical linux-swap(v1)
2 306GB 359GB 52,4GB primary ext4
3 359GB 983GB 624GB primary ext4
分区 1 保存要转换为虚拟卷的旧 W7 映像。
设想:
- 在 Windows 下使用 disk2vhd 工具将现有的旧 W7 系统转换为 VM 映像。结果 w7.vhdx 镜像文件 ✓ (注意:该镜像已经可以通过 QEMU 和 Super Grub2 Disk 启动。)
- 使用 qemu-image 将 w7.vhdx 转换为 qcow2 格式 ✓
- 使用
qemu-system-x86_64 -enable-kvm -m 4096M -hda 'w7.qcow2' -vga virtio -usb -device usb-tablet -device usb-host,bus=usb-bus.0,hostbus=1,hostport=1.2 -cdrom /dev/sr0
❌ => 启动 w7.qcow2 => 系统启动至 grub rescue - 重新启动
qemu-system-x86_64 -enable-kvm -m 4096M -hda 'w7.qcow2' -vga virtio -usb -device usb-tablet -device usb-host,bus=usb-bus.0,hostbus=1,hostport=1.2 -cdrom /dev/sr0 -boot menu=on
- 按 Esc 并从 DVD 驱动器中的 Super Grub2 Disk 启动 ✓ => 我能够启动 Windows 系统,一切正常。
- 尝试从 Live Stick 或 Ubuntu DVD 启动❌ => 系统挂起(我试图重新安装 GRUB2 以设法直接启动到 w7.qcow2 上的 W7 系统)
观察结果:
显然,disk2vhd 再现了磁盘的分区布局。 Super Grub 列出了驱动器的原始分区(见上文),其中“未检测到文件系统”是唯一的例外是复制的 W7 分区,具有正确的文件系统类型 NTFS 和正确的大小。
分手:
(parted) print disk
Fehler: W7.VHDX: unbekannte Partitionstabelle
磁盘:
Festplatte W7.VHDX: 226,3 GiB, 242934087680 Bytes, 474480640 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
问题: 如何修复 w7.qcow2 的启动,使 QEMU 直接启动到 Windows 系统或以 Windows 作为默认系统的 GRUB 启动菜单?
评论:我尝试了使用 kpartx、losetup 和 /dev/loop0 的方法来修复此问题,但没有效果。
答案1
以下是为 QEMU/KVM 生成可启动 VM 的步骤,该 VM 可直接启动到虚拟化 Windows 7 系统。我的系统使用 GRUB2 作为引导管理器(如果您的系统不同,您可能需要采用以下内容来满足您的需求)。
先决条件:Windows 7 DVD(如果手头没有,请从 Microsoft 下载 ISO 映像)、Windows 许可证密钥、CD 上的 SuperGRUB2 磁盘(从 www.supergrubdisk.org 下载)。
- 从 GRUB2 菜单启动现有的旧 W7 系统。
- 下载 DISK2VHD 工具。在开始转换之前,最好确保 Windows 中安装了 7Zip 或类似软件。
- 使用 DISK2VHD 转换现有系统(您可能需要预先清理常见的 Windows 混乱)。这会生成一个文件 .VHDX(在我的例子中为 w7.vhdx)。 (注意:该映像已经可以使用 QEMU 和 SuperGrub2 磁盘启动。)
- 使用 qemu-image 将 w7.vhdx 转换为 qcow2 格式(或您喜欢的其他格式)。
- 使用 DVD 驱动器中的 SuperGRUB2 磁盘,使用命令启动 w7.qcow2
qemu-system-x86_64 -enable-kvm -m 4096M -drive file=w7.qcow2 -vga virtio -cdrom /dev/sr0 -boot menu=on
(这假设从 w7.qcow2 所在的目录发出命令;否则提供完整路径,例如在我的情况下为 /home/W7/w7.qcow2。您的 cdrom 设备也可能有另一个名字,以防你不知道 lsblk 会告诉你。)。系统启动时按 ESC 进入启动菜单。如果系统启动进入 grub rescue,请重新启动(好旧的 Ctrl-Alt-Del)并按 ESC 进入启动菜单。 - 选择从 DVD 启动。 SuperGRUB 菜单将出现,并在发现后列出您的 Windows(在我的情况下是两个)。选择任意 Windows 系统并启动。现在一切都应该正常了。然而,首次启动速度较慢,Windows 会安装多个设备驱动程序。确保在重新启动之前完成此操作!
- QEMU Windows 系统中的屏幕分辨率很可能会很糟糕,因此请根据您的需要进行调整。接下来打开命令提示符并键入
bootrec.exe /?
。 Windows 很可能会告诉您它没有可用的命令 bootrec。如果情况并非如此并且显示了 bootrec 的帮助,请继续执行下面的步骤 10。 - 现在我们需要 Windows DVD(bootrec.exe 无法从 Microsoft 下载,但可以从 Windows 7 ISO 获得): 在 QEMU 监视器中弹出 SuperGRUB 磁盘并更改为 Windows DVD。
- 使用 7Zip(或其他能够读取 WIM 文件的工具)打开 :\sources\boot.wim。 Bootrec.exe 位于 \1\Windows\System32 - 解压并存储在 C: 驱动器上。
- 从 Windows 命令提示符发出
bootrec /fixmbr
后跟bootrec /fixboot
.确保设备驱动程序安装已完成,并最终shutdown /s /t 0
在命令提示符下关闭系统(否则您可能会遇到休眠系统)。
就是这个。最好使用 QEMU 覆盖图像启动虚拟 W7 以保留原始设置。