目標:想要縮小 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 則好像沒有明顯效果。