目标:想要缩小 Hyper-V 里面使用动态扩展的 VHD 在实体硬盘中的大小
观念:缩小 VHD 档的底线就是 VHD 档内最后有记载资料的位置,譬如一颗标示容量有
120GB的 VHD 档,里面记载有资料的位置到 80GB 处,就只能重新压缩成一个实体
占用 80GB 的 VHD 档,但里面也许实际有资料的部分只有 30GB。
讨论:上述“观念”中提到的状态,若能将记载于 80GB 处的资料移动到 30GB 附近,就
可以再压缩这个 VHD 档的大小到 30GB,而不用真的在实体硬盘中占用到 80GB。
使用各类 disk defragment 的工具,都可能在过程中因为临时使用到后方的硬盘
空间,造成 VHD 档变得更加肥大而无法复原。
我试过 Windows 内建的磁盘整理工具,也下载过 UltraDefrag、Defraggler等重
组工具,都无法把存在硬盘后方的资料主动往前面移。这类软件的目标似乎仅是将
同一档案在硬盘中置放成连续空间,但并不在乎这个档案放在硬盘何处,只要没有
fragment 状态就好。就 defragment 这个动作来说,这些软件都做到了没错,而
且这样也比较省时间,但是对于想要缩小 VHD 档这个目标来说,就造成障碍。
我试过在 guest 里面进行 defragment,也试过将 guest 关机后,将此 VHD 档挂
在 host 上然后 defragment,都没有明显改善。
所以想请问大家,有没有哪一个 disk defragment 类的软件,可以做到尽量把资
料往硬盘前方堆放的目标?这样再来缩小 VHD 档就变得很可观的?或是说在我用
过的这些 defragment 软件中,其实有某些选项勾起来就是这个效果的?
自问自答:
感谢朋友Dino9021的提供,不用搞这么复杂,在有 Hyper-V 管理工具的机器上,guest
OS 关机的情况下,执行:
mount-vhd -path xxx.vhd -readonly
optimize-vhd -path xxx.vhd -mode full
dismount-vhd -path xxx.vhd
optimize-vhd -path xxx.vhd -mode full
我对不同的 VHD 做过以上指令,发现有的 VHD 在第一次 optimieze 时就已经大幅度
缩小,第二次 optimize 时没有变化;有的是第一次大幅度缩小,第二次还可以再缩小
一点。
如果不先 mount 起来做一次,直接就 optimize 则好像没有明显效果。