格式转换与磁盘调整——flat sparse VMDK VHDX 互转
各格式的元数据和 bochsrc 差异
| 格式 | 有元数据 | bochsrc 需 C/H/S | 可撤销 | 典型用途 |
|---|---|---|---|---|
flat | ❌ 无 | 必须手动指定 | ❌ | OS 开发、纯原始数据 |
sparse | ✅ 有 | 自动推断 | ✅ 可以套 undoable | 实验环境 |
vmware3 / vmware4(VMDK) | ✅ 有 | 自动推断 | ✅ VMware 快照 | VMware 导入 |
vhdx | ✅ 有 | 自动推断 | ✅ Hyper-V 快照 | Hyper-V 导入 |
undone | ✅ 有(红日志) | 自动推断 | ✅ 天然可回滚 | Bochs 特有的 undoable |
从格式复杂度来看:flat(最简单)< sparse < vmware4(最复杂)< vhdx。
bximage 格式转换
flat → sparse
bximage -q -convert flat-to-sparse -filename flat.img -target sparse.img
转换后 bochsrc 里 C/H/S 不再需要:
ata0-master: type=disk, path="sparse.img", mode=sparse
flat → VMDK(给 VMware)
bximage -q -convert flat-to-vmware4 -filename flat.img -target disk.vmdk
然后在 VMware 里用"使用现有虚拟磁盘"打开 disk.vmdk。注意:转换后的 VMDK 是单文件、非拆分的——VMware 默认喜欢拆分成多个 2GB 片段,可能需要后续处理。
VMDK → flat(从 VMware 镜像转回 Bochs)
bximage -q -convert vmware4-to-flat -filename disk.vmdk -target bochs.img
转换后 bochsrc 里要重新手动指定 C/H/S——bximage 转换时不会输出这些参数,你需要自己算:文件大小 ÷ 512 = 总扇区数,然后选一组合理的 C/H/S。
VHDX → flat(Hyper-V 转回 Bochs)
bximage -q -convert vhdx-to-flat -filename disk.vhdx -target bochs.img
同样,转换后需要手动指定 C/H/S。
磁盘大小调整
扩大磁盘
bximage -q -resize -filename hd60M.img -size 120M
磁盘文件会被扩大到新大小(追加零填充)。但磁盘上的分区表不会自动更新——扩大后需要:
- 在 Bochs 里用 fdisk 重新分区
- 或者导出后在宿主用 GParted 调整分区
缩小磁盘
bximage -q -resize -filename hd60M.img -size 20M
警告:缩小会直接截断文件——如果磁盘上的数据超过新大小,数据会被物理切掉!务必先备份。
缩小后同样需要更新分区表(通常是用 fdisk 删除旧分区、重建新分区)。
其他调整工具
Bochs 的 bximage 做格式转换够用,但对于更复杂的场景可以用专门的工具:
| 工具 | 平台 | 优势 |
|---|---|---|
| qemu-img | 跨平台 | 支持所有 Bochs 格式 + qcow2 + 更多;可以直接用 |
| VBoxManage(VirtualBox) | 跨平台 | 支持 VDI/VMDK/VHD |
| OSFMount | Windows | 可以挂载后在资源管理器里操作 |
| HxD | Windows | 十六进制编辑磁盘(OS 开发调试) |
| ddrescue / dd | Linux | 原始复制 |
示例:用 qemu-img 把 flat 转 qcow2(更高效的压缩格式):
qemu-img convert -f raw flat.img -O qcow2 bochs.qcow2
qcow2 格式有内建压缩,节省空间——但 Bochs 不直接支持 qcow2(bochsrc 没有 qcow2 mode),所以转完还得转回来。
undoable:Bochs 特有的可撤销格式
bximage -q -create -mode undoable -size 60M -filename base.img
undoable 格式会在基映像旁边自动生成一个红日志文件(base.img.redolog)。所有对磁盘的修改都写在红日志里,基映像永远不变。如果想"撤销"所有修改:
bximage -q -commit -filename base.img -redolog base.img.redolog
或者直接删掉红日志重新来——就像 VMware 的快照一样。
bochsrc 里用 undoable:
ata0-master: type=disk, path="base.img", mode=undoable
OS 开发实验(反复启动、每次想回到干净状态)这个模式非常方便——删红日志比每次都重建 flat 磁盘快得多。