将 4Kn Windows 迁移到 512 字节扇区磁盘
背景
笔者很久以前在 Mac 上通过 Boot Camp 安装了 Windows 系统,最近计划将这个系统迁移到 ESXi 虚拟机中使用。笔者首先使用同一机器上 macOS 系统安装的 VMware Fusion 来将 Boot Camp 的 Windows 转化为虚拟机,这一步转化是成功的,虚拟机可以启动。但是进一步导出 OVF 模板并在 ESXi 上导入时,结果发现虚拟机无法启动。经过分析,发现问题的根源在于磁盘扇区大小不匹配。
Mac 上通过 Boot Camp 安装的 Windows,磁盘默认使用 4Kn(4K Native) 扇区格式 —— 物理扇区和逻辑扇区均为 4096 字节。这种格式的磁盘在正常使用时是无感的,但是在需要迁移系统到其他磁盘(比如转成 ESXi 虚拟机)时,就会碰到麻烦:大多数虚拟化平台的虚拟磁盘只支持 512 字节扇区(512n 或 512e)。
这个问题其实并不好解决。扇区大小不匹配,那么直接克隆必然失败,很多常见的硬盘分区、数据恢复工具,包括声称支持不同扇区大小之间的克隆转换的 Clonezilla,都无法解决这个问题。
真正可行的方案:DISM
经过测试,微软自带的 DISM(Deployment Image Servicing and Management) 工具可以完美解决这个问题。
原因很简单 ——DISM 的工作方式是文件级别的:
- 备份时:把系统分区的所有文件打包成一个
.wim镜像 - 还原时:把
.wim镜像中的文件逐个释放到目标分区
整个过程完全不涉及扇区结构。它不关心源盘是 4Kn 还是 512,也不关心目标盘是什么格式。扇区大小的差异在文件级操作面前根本不是问题。
大致流程:
- 在 WinPE 环境下,用 DISM 将 Boot Camp 的 Windows 系统捕获为
.wim文件 - 在虚拟机中创建一个 512 扇区的虚拟磁盘,手动建好 ESP 分区和系统分区
- 用 DISM 将
.wim释放到虚拟磁盘的系统分区 - 写入引导,完成
Dism++ 同样可以
如果你不喜欢敲命令行,Dism++ 是 DISM 的图形化前端,底层调用的是同样的 API,同样是文件级操作。用它来备份和还原效果完全一样,只是操作更直观。
唯一需要注意的是:无论用 DISM 还是 Dism++,都需要你事先在目标磁盘上手动建好分区(包括 ESP 分区),它们只负责释放文件和写入引导,不会自动帮你分区。
小结
在 4Kn 到 512 的系统迁移场景下,凡是涉及扇区级操作的工具都可能翻车。而 DISM / Dism++ 因为是纯文件级的备份还原,天然绕过了扇区大小的问题,是目前最简单可靠的方案。