(好久没写东西,博客也一直没时间迁移,实在是很丢人,谢谢大家还没取关。)

一般来讲迁移硬盘数据都是小硬盘到大硬盘,很多硬盘对拷软件也只支持源盘小于目标盘的数据迁移。有的支持从大到小迁移的软件也是按文件复制。对于一些隐藏分区或者特殊格式的分区来说,这种复制方式可能丢失数据。我研究了半天摸索了以下方法,作个备忘与参考。

思路是:
新建一个 vhdx 虚拟硬盘→大盘拷进虚拟盘→虚拟盘缩容→虚拟盘拷进小硬盘

关键节点在于虚拟盘缩容,这样可以保证每一步对拷都是逻辑上的小盘到大盘。注意大盘上的实际数据量不能超过小盘容量。

这个思路很绕,我暂时没有想出更好的方式。如果有更好的思路或者工具请一定不吝赐教。

1 新建虚拟盘

这个很简单,Windows 的磁盘管理就可以。注意新建 vhdx 格式的,否则后面缩容的时候还要花时间转换。虚拟盘最大容量要大于大盘一点,选择动态容量即可。

image-0

2 大盘拷进虚拟盘

在 Windows 的磁盘管理里先把虚拟盘挂载上,一般新建之后会自动挂载。盘符分不分都行。然后随便找个硬盘对拷软件,比如 DiskGenius,把大盘对拷到虚拟盘上。对拷的时候不要选择创建新的硬盘 ID。这一步就不放图了,时间会比较久。

3 虚拟盘缩容

3.1 分区调整

在分区软件里把虚拟盘里的数据分区调整到一起,压缩数据分区到刚好够用,把多出来的空间设置为未分配,使未分配空间全在盘的最后。注意必须保证前面的数据区总容量不超过小盘容量。

image-20210421181211292

3.2 虚拟盘容量调整

首先你要装有 Hyper-V 工具,没有的话到控制面板→添加删除程序→添加删除 Windows 组件里面,把 Hyper-V 相关的都勾上。装好之后要重启。注意,装了 Hyper-V 之后你的 VirtualBox 之类的虚拟机就不能用了,如果要用的话待会儿再卸掉 Hyper-V。

image-20210421181347514

装好之后用管理员权限打开 Powershell。在开始菜单输入 Powershell 然后按 Ctrl + Shift + Enter 就是管理员权限。

执行 :

1
Resize-VHD -Path "E:\sysbk.vhdx" -ToMinimumSize

注意把 vhdx 的路径换掉。应该很快就完事儿了,然后执行:

1
Get-VHD -Path "E:\sysbk.vhdx"

就可以看到虚拟盘容量已经减小到和实际数据量差不多了。这个时候虚拟盘的容量应该是小于目标小盘的容量的,否则后面会失败。

image-20210421181459770

4 虚拟盘拷进小硬盘

很简单的,在磁盘管理里面把缩小之后的 vhdx 挂上,然后在分区软件里对拷到小硬盘上就可以了。

但是!

我在这一步遇到了各种疑难杂症。

首先我的目标盘是一个 nvme 盘,没法通过 USB 挂到其他电脑上对拷,所以只能在本机上从U盘启动 PE 对拷。但这个 PE 是似乎不能挂载 vhd 的,挂载的选项是灰色。

所幸 DiskGenius 里是可以直接挂虚拟硬盘文件的。然而似乎对 vhdx 兼容性不好,挂载之后始终显示整个盘都是未分配。

vhd 转 vhdx 是单向的,不能从 vhdx 转为 vhd。我只能新建了一个比缩容后的 vhdx 大一丁点的 vhd,然后在正常的系统内通过磁盘管理挂载了 vhdx,再在 DiskGenius 里从 vhdx 到 vhd 又对拷了一遍。

image-20210421181543316

真的需要很长很长的时间,长到等它对拷完成之后我已经快忘了这件事了。
然后我就有了一个缩容之后的 vhd 文件。重新启动 PE 之后发现,

发现这 PE 又能在磁盘管理里挂载 vhd 了!

image-20210421181617712

好气啊。按照常规操作再来一遍,挂载 vhd,对拷。

拷完之后,由于我们之前把虚拟硬盘的容量设置成小于小硬盘的实际容量了,所以小硬盘尾部会出现未分配空间。根据需要把这部分空间合并到前面的分区中。

这样就保留了分区结构和分区表等等的同时,从大盘到小盘完成了系统迁移。