我在硬盘上安装了 Windows XP 的副本,我想用 QEMU 运行它。
当我直接从 HDD 启动它时,它运行良好:
qemu -m 256 -hda /dev/sdc
Starting Windows...etc...etc...
虽然硬盘容量是320GB,但我的系统实际上位于磁盘开头的4GB分区中:
/sbin/fdisk -l /dev/sdc
Disk /dev/sdc: 320 GB, 320070320640 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdc1 * 1 510 4096543 b FAT32
Warning: Partition 1 does not end on cylinder boundary.
因此我认为我只能将分区表和第一个分区(8192000 个扇区)复制到原始映像中以供 QEMU 使用:
dd if=/dev/sdc of=winxp.img count=8192000
当然,由于winxp.img
是的副本/dev/sdc
,因此它具有完全相同的分区布局:
/sbin/fdisk -l winxp.img
Disk /mnt/windata/winxp.raw: 4 GB, 4186667520 bytes
255 heads, 63 sectors/track, 509 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/mnt/windata/winxp.raw1 * 1 510 4096543 b FAT32
Warning: Partition 1 does not end on cylinder boundary.
然而,当我尝试将原始图像与 QEMU 一起使用时,客户系统无法启动:
qemu -m 256 -hda winxp.img
Booting from hard disk...
NTLDR is missing
我可以更改哪些设置来使我的映像文件与 QEMU 兼容?我是否应该更改分区表中或分区本身中的某些内容以使其正常工作?是否有 QEMU 选项可以提供帮助?
或者是否可以使用/dev/sdc1
QEMU 的副本而不是的副本/dev/sdc
?
答案1
如果您可以将映像文件“安装”到 Windows 机器(最好是 XP),则可以使用 Microsoft 工具来查看问题可能是什么。分区必须处于“活动”状态,必须是 MBR(而非 GPT)格式的磁盘,并且必须具有正确的启动扇区。
过去,diskpart 和 bootsect /nt52 /mbr 等工具对我很有用。我不熟悉如何从 Linux 分区启动 Windows。
答案2
只是猜测:您没有获得 MBR,我想您已经知道了。整个磁盘太大了。所以......
1) grab a USB drive with enough space
get a working disk image;
convert to qcow2;
shrink it.
2) use gparted or parted to shrink the original.
e2fsck and tune2fs *may* be helpful, also resize2fs.
答案3
看来 SeaBIOS(QEMU 在模拟 PC 目标时使用)无需手动配置并且始终自动确定驱动器几何形状。由于我的部分映像非常小,因此其 CHS 几何形状被检测为8129 * 16 * 63
而不是510 * 255 * 63
。这样做是为了与不理解 LBA 的旧驱动器兼容,因此仅限于 16 个磁头。
由于 MBR 和 BIOS 中的驱动器几何结构不匹配,引导加载程序无法正确启动 Windows。
理论上,8GB 以上的映像不会受到影响(我知道我的 320GB 映像可以正常工作),因为 8GB 以上的驱动器必须支持 LBA。不幸的是,我不再有该映像来测试这个假设。