[VirtualBox] 降低 VM 中 .vdi 硬碟檔案的大小
今天用 VirtualBox 建立好一個建置專案程式的 Windows VM,
想說最近硬碟空間吃緊,還是來將 VM 檔案瘦身一下~
1. 清理 VM 中不必要的檔案
先進到 Windows VM 裡面,把不必要的檔案都清除乾淨,
例如可以先用 dism 清理 Win7 上的 WinSxS 目錄,
接著對硬碟按右鍵 > Properties > Disk Cleanup,來執行系統的清理工作:
這邊有不同類型的檔案可以清除,預設並沒有全選,
這邊可以看自己的需求,像我檢查了一下,應該全選是沒有問題的,就全勾了:
切換到 More Options 頁面,這邊有兩個 Clean up 按鈕,先按下上面那個:
這個其實就是把新增/移除程式的控制台叫出來,在這邊把不需要的軟體移除掉吧:
另一個按鈕是清除掉系統還原點的檔案,基本上我都是使用 VirtualBox 本身的快照 (snapshot),
所以還原點對我來說沒什麼用,可以全刪 (其實它會保留最新的一個還原點啦):
最後按下 OK 後,就會開始清理工作了:
2. 執行磁碟重組 (defragment)
要讓 VM 檔案變小,除了釋放出不必要的檔案空間外,
還得讓檔案在磁碟中的分布集中,這樣才有機會把沒有儲存檔案的磁區移掉~
對硬碟按右鍵 > Properties > Tools 頁面,選擇 Defragment now:
對所有的硬碟都按下 Analyze disk 看看分散的程度:
雖然只有 6% 的零碎部分,不過還是可以按 Defragment disk 來整理一下:
3. 將未用到的磁區清除為零
這個動作是 VirtualBox 執行 compact 瘦身指令的必要條件,
只有全都為零的磁區,VirtualBox 才有機會把它從 VM 的 VDI 磁碟檔案中移除~
這邊我們可以利用 SysInternals 提供的 SDelete 工具來做~
如果有用 Chocolatey 的話,可以先用 choco install sysinternals 安裝,
接著進到 C:ProgramDatachocolateylibsysinternalstools 目錄,
就可以看到 sdelete.exe,用 cmd.exe 來執行下面的指令將 C: 未用到的磁區清為零:
sdelete.exe -z c:
所有的磁碟都要執行上面的指令,把 C: 換成對應的槽就行了~
下面是我執行的結果 (這個動作很花時間,可能要好幾個小時,看硬碟大小):
C:ProgramDatachocolateylibsysinternalstools>sdelete.exe -z c: SDelete v2.0 - Secure file delete Copyright (C) 1999-2016 Mark Russinovich Sysinternals - www.sysinternals.com SDelete is set for 1 pass. Free space cleaned on C: 1 drive cleaned.
4. 執行 VirtualBox 的 modifymedium 指令將 VDI 檔案瘦身
進到 VM 的目錄裡,執行 modifymedium (或 modifyhd) 指令,加上 –compact 參數,
就可以將 VDI 硬碟檔中的零磁區移除掉:
VBoxManage modifymedium disk disk1.vdi --compact
這個動作也挺花時間的,要耐心等一下…
要注意的是,目前 VirtualBox 只支援對 .vdi 檔案執行 –compact 瘦身動作,
其他的檔案格式 (如 .vmdk) 是還不支援的喔 (只能透過 clonemedium 的方式來達到)~
執行前後,可以看到 disk1.vdi 大約減少了 1.9 GB 的大小:
testuser@localhost ~/VirtualBox VMs/Win7 $ ll *.vdi -rw------- 1 testuser staff 20640169984 Jul 16 15:06 disk1.vdi testuser@localhost ~/VirtualBox VMs/Win7 $ ll *.vdi -rw------- 1 testuser staff 18559795200 Jul 16 15:22 disk1.vdi
雖然看起來只減少了 1.9 GB 的大小,不過對於用網路傳輸 VM 檔案 (或是做成 OVA) 來說,
這個做法也是可以降低不少傳輸的時間,可以參考看看囉~
參考資料:How to compact VirtualBox’s VDI file size?