2008年12月11日 星期四

Virtualbox瘦身--釋放未使用的硬碟空間

今天跟鍾老師聊起了虛擬機器,老師跟我提到在vbox下,日積月累的資料新增與刪除,雖然在guest下空間有被釋放,不過在host上卻未見vdi檔案變小;我一直沒有真的遇到過這個問題,原因在於我為求執行的速率,我總是將硬碟設定成pre-allocate而非dynamic;那麼遇到硬碟空間不還給host時,大檔案在guest下增增減減之後,很快硬碟就會不夠用了。

那麼,該怎麼辦呢?

首先再次界定情況:guest為windows,虛擬硬碟以dynamic配置的情況下,並且是使用VirtualBox建立的虛擬機器,你才需要關注這個主題。

釋放VirtualBox未使用的硬碟空間基本上需要透過兩個步驟:

  1. 在guest下使用sdelete來刪除硬碟資料表(類似ext3格式的inode)的內容並且釋放未使用空間;或是使用nullfile進行磁碟重組(defrag)並將空閒空間整合(consolidation)在一起。
  2. sdelete或是nullfile可以自行選一個。
  3. 在host下使用VBoxManage modifyvdi來壓縮vdi檔。

首先,請到Microsoft TechNet參考這篇文章。

SDelete 實作了國防部的清除和清理標準 DOD 5220.22-M,讓您在使用 SDelete 刪除後,對於檔案資料永遠不見了有信心。請注意,SDelete 會安全地刪除檔案資料,但不會刪除位於可用磁碟空間的檔案名稱。

SDelete 可在 Windows 95、98、NT 4.0 和 Win2K 上執行。

SDelete就是Secure Delete的簡稱,他可以讓已經刪除的資料無法透過第三方軟體復原,也可以達成釋放未使用空間的功能。使用方法如下:

sdelete [-p passes] [-s] [-q] <檔案或目錄>
sdelete [-p passes] -z [磁碟機代號]

-p passes
指定覆寫次數。硬碟在同樣位置複寫次數越多,資料被還原的機會越小。一般而言三次是非常足夠的了,隨身碟建議不要這樣操。

-s
遞迴子目錄:就是指定一個資料夾做sdelete

-q
不要列印訊息--verbose的相反啦~

-z
清理可用空間

-c
Zero free space適用於虛擬機器。
下載了這個sdelete.exe之後,放到system32的資料夾下,此時命令提示字元可以找得到這個指令:
sdelete -c

請注意:下這個指令前請先看看guest內硬碟的剩餘空間。
sdelete雖然是為了要釋放空間而下的命令,不過在sdelete的過程中是會消耗大量guest的剩餘空間!也就是說假設配置8g給c磁碟機,現在只剩1g的空間,想要透過這個程式來釋放空間會有相當悲慘的下場 -- 你的guest硬碟會被塞爆,guest系統當機而且無法還原。
這是一個矛盾的動作--為了要釋放空間卻害得空間被塞爆,實在是很無辜!

解決的方法只有兩個,一是使用pre-allocate的方式新增硬碟,二是可以配置大一點的dynamic虛擬硬碟,自己控制安裝後的大小,日後再利用這個指令清除空間。我的經驗裡,要釋放3g的空間,大致上也需要3g的空間讓sdelete來暫用,其釋放與暫用比約為1:1;因此如果你安裝了很多程式,現在只剩下1~2g的空間,奉勸你還是別做這個步驟了!硬碟狂轉完成後,你會發現guest xp的硬碟空間真的變更多了!但是無奈的是,host的空間還被佔據。

如果使用nullfile的話,請將下載後的檔案放到system32下,並將名稱下的版本號去掉,改成nullfile.exe就好。接著直接執行nullfile即可。執行nullfile時系統空間一樣會佔用很多空間做置換用,剩餘空間的問題仍然需要留意。如果執行途中想要中止,需注意windows下使用者家目錄(例如 c:\Document and Setting\maxsolar\) 下會有一個dummy.000(000是三位變數數字),把他刪除後下次進行nullfile才不會失敗。如果印象沒錯的話,nullfile執行起來較久,不過暫用的空間較少;硬碟空間比較小的可以試試看nullfile。

最後一步就是在host裡使用VBoxManage的指令。請各位注意一下,假設您的host系統是UNIX-base的話,請記得一定要讓vdi存放的位置是預設值($HOME/.VirtualBox/VDI/)。這算是vbox的一個bug,大部份人都會自訂vdi存放位置;如果你不是放在預設的位置,會顯示錯誤訊息說找不到vdi。假設我自訂的vdi檔放在~/storage/vm/下,你只要做一個軟連結給他就好:

ln -s ~/storage/vm ~/.VirtualBox/VDI
如此一來,執行就不會出錯:
VBoxManage modifyvdi xp.vdi compact
等著他緩慢的跑到100%,再看看host內xp.vdi的大小,看看是不是真的瘦身成功了呢?

後記:

  1. modifyvdi,顧名思義就是只能修改vdi檔,如果是由vmware建立的dynamic硬碟,可就沒辦法這麼做了。
  2. 假設不做sdelete/nullfile,直接做第二個步驟,是完全沒有用的。(連1 byte都沒有減少@_@)
  3. 爬文的結果發現早期可以利用vditool來把guest windows上的未佔用的位置zero space free掉,不過現在這個連結已經失效,否則這隻程式甚至可以做到qemu與vbox映像檔的互換!

1 則留言:

孫守真 提到...

感恩反饋 詳我此貼 阿彌陀佛
用「CloneVDI tool」(目前版本 CloneVDI-exe-2.51 ),更快更便!
http://oscarsun72.blogspot.tw/2016/10/virtual-box-vdi.html