??????? 當ESXi主機上的虛擬機(尤其是讀寫量相當頻繁的FTP服務器)持續運行一段時間后,Thin Provision模式的磁盤空間會變得越來越小,這與ESXi提供Thin Provision(精簡置備模式——按需分配以節約磁盤空間)的初衷南轅北轍。
??????? 原因:對于Windows系統來說,預設對于完全未使用過的磁盤會標記0來作為識別,而磁盤區域存放資料并刪除以后,這些釋放出來的磁盤空間的標記就不會是0了。對于ESXi系統來講,它無法判斷虛擬機系統中非0區域是否存有數據,因此也就不認為這些實際可用的磁盤空間是可回收的。
??????? 解決方案:Vmware workstation提供了Disk Cleanup功能來釋放磁盤未用空間,而ESXi5.0并未直接提供這個功能。我們已經知道ESXi中已用過的磁盤空間無法釋放的原因,那么就可以針對性的去將系統中實際空閑的空間全部填上0標記之后,再通過ESXi系統內置的vmkfstools命令去完成硬盤空間的釋放。
??????? 嘗試步驟:
??????? Notes:首先要注意的一點,VMWare官方推薦使用vMotion功能來完成磁盤空間的釋放,因而這個方法不是VMware官方最為推薦的,使用時要慎重并提前做好虛擬機備份!
??????? 1. 下載SDelete,SDelete是由微軟提供的,官方下載地址和軟件簡介:https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete,將SDelete拷貝到虛擬機系統中,cd到SDelete文件夾下,使用cmd打開sdelete,確定要釋放的磁盤(注意,磁盤清零過程中Thin Provision模式的磁盤會膨脹到設置的大小,直觀表現是虛擬機內相關的磁盤剩余容量大小會越來越小,因此我們要保證有足夠的存儲空間來進行這項操作),以D盤為例,如下圖:
??????? 等進度條走到 "Cleaning free space on D:\: 100%“時,這個界面會一直保持在100%的狀態,其實,軟件或者虛擬機并沒有死機,通過”start task manager -> Performance -> Resource Monitor -> Disk -> Processes with Disk Activity"下可以看到sdelete的進程一直在運行,寫速度只有8M/s左右,所以如果磁盤空間比較大的話,需要耐心等待,我的虛擬磁盤大小有1.5T,足足寫了六七十個小時才寫完,寫完以后cmd框中會出現類似“ 1 drive zeroed”相關的字樣,這時,sdelete已經把需要壓縮的磁盤內部的空閑空間都置0了。
??????? 2. 在vSphere Client中將虛擬機關機。
??????? 3. 在vSphere Client中開啟ESXi主機的SSH登錄(VC -> Configuration ->Software -> Security Profile ->Services -> Properties -> SSH -> Options -> Start),通過SSH登錄到ESXi主機命令行界面,在/vmfs/volumes下找到虛擬機的目錄,查看需要釋放的磁盤所對應的vmdk文件,對它執行 vmkfstools -K xxx.vmdk,耐心等待進度走完。完成之后記得把SSH服務關掉,保證ESXi主機的信息安全。
??????? 4. 再次開啟虛擬機,就會發現ESXi主機的剩余磁盤空間增加了。
參考資料:
? ? ? ? 1. "虛擬平臺管理術:如何縮小 ESXi 虛擬硬碟實體檔案大小 (.vmdk)", by Ku Jovi, https://www.hkitblog.com/?p=33576
? ? ? ? 2. "ESXi虛擬機vmdk壓縮瘦身", by SPADEQ, http://spadeq.com/esxi%E8%99%9A%E6%8B%9F%E6%9C%BAvmdk%E5%8E%8B%E7%BC%A9%E7%98%A6%E8%BA%AB/
? ? ? ? 3. "Reducing the size of a VM in ESXi?" , https://community.spiceworks.com/topic/376095-reducing-the-size-of-a-vm-in-esxi