當在 ESXi 主機上的虛擬機器持續運行一段時間之後,由於檔案資料不斷的進行新增、刪除以及修改的動作,過程中如果磁碟內曾經儲存過大量的檔案資料,便會使虛擬硬碟檔案的實體大小擴增,後續即使又刪除了大量檔案資料,虛擬硬碟檔案的實體大小也不會隨之縮小,想想看這是甚麼原因呢?

這是因為在 Windows 的作業系統中,預設對於完全未使用過的磁區會標記 0 來作為識別,可是一旦存放過資料後即使後來這些資料又被刪除了,其標記也不會是原來的 0,因此對於 Windows 的客體作業系統來說,就不會認為這一些磁區是未被使用的。在這個階段中即使您去使用任何可以縮減虛擬硬碟的工具,也不會產生任何的縮減效果。

為甚麼呢?很簡單!首先我們必對於已經清除許多檔案資料的虛擬硬碟之磁區,在填上 0 的標記之後,再來透過 ESXi 系統內建的 vmkfstools 命令工具完成實體虛擬硬碟大小的縮減即可。請到以下 Microsoft 官方網站上,下載一個名為 SDelete 的命令工具。然後將此命令工具解壓縮之後,存放至 Windows 的作業系統磁碟之中,如圖 1 所示執行 sdelete -z C: 命令,此命令參數代表我們要將 0(Zero)的標示值,寫入至指定磁碟的所有未使用磁區之中。

SDelete 官方下載網址:
https://technet.microsoft.com/en-us/sysinternals/bb897443.aspx


圖 1 標記磁碟未使用空間

接著您可以選擇透過 ESXi 伺服端的命令主控台,或是以 SSH 用戶端工具連線到 ESXi 主機來進行以下操作。如圖 2 所示便是在 ESXi 伺服端的命令主控台所進行的命令操作範例。首先我們以 cd 命令切換到虛擬機器的所在路徑,一般來說通常會是在 /vmfs/volumes 路徑下。值得注意的是如果您的虛擬機器名稱是以中文命名,那麼在此便會出現亂碼的顯示問題,但一樣是可以進行路徑切換的。

完成路徑切換之後請下達 ls -lh *.vmdk 命令,便可以查看到每一個虛擬硬碟檔案的佈建大小,進一步下達 du -h *.vmdk 命令,則可以查看到所有 vmdk 檔案的實體大小。在這個範例中,您會發現佈建大小為 20.0GB,但實體大小則只有 17.8GB,這意味著多餘的未使用空間是可以進行截斷的。但為了讓佈建大小和實體大小差距更大,筆者決定在該作業系統中,刪除更多檔案資料並完成執行 SDelete 命令工具。


圖2 檢視佈建與實體檔案大小

在我們開始進行正式虛擬硬碟檔案的縮減之前,我們先來解決上述中文亂碼的問題。這次我們改用許多系統管理人員都熱愛使用的 PieTTY 工具,來進行 SSH 的連線至 ESXi 主機。成功連線後只要在如圖 3 所示的[選項]下拉選單中,選取[字元編碼]的[Unicode]設定,即可解決命令列中文亂碼的顯示問題。


圖 3 解決中文顯示問題

再次回到縮減虛擬硬碟的操作講解。以本次範例的虛擬硬碟來說,您可以選擇下達 vmkfstools –punchzero ERP 用戶端 2015.01.07.11.57.37_201517_121843.vmdk 命令,或是 vmkfstools -K ERP 用戶端 2015.01.07.11.57.37_201517_121843.vmdk,其中如果使用的是 -K 的參數就要記得輸入大寫的字母。成功完成縮減之後,如圖 4 所示便可以再次輸入 du -h *.vmdk 命令來查看縮減後的實體檔案大小。此範例原有的實體大小為 17.8G,縮減後則變成了 8.3GB。


圖 4 檢視縮減後的實體大小

想要查看實體的虛擬硬碟檔案大小,您也可以從 vSphere Client 的[資料存放區瀏覽器]介面中來檢視。如圖 5 所示在此筆者點選至所在虛擬機器的資料夾中,便可以看到這個檔案的目前實體大小。


圖 5 資料存放區瀏覽器

關於使用 vmkfstools 這個工具來進行虛擬硬碟的實體大小縮減,IT 人員最常犯的錯誤,除了會將 -k 參數輸入為小寫字母之外,另一個易犯的錯誤就是 —punchzero 參數會輸入成 -punchzero,也就是少輸入了一個 – 字元,導致出現了如圖 6 所示的" Invalid block length specifier: unchzero"錯誤訊息。


圖 6 可能犯的錯誤

待續……

相關文章:

虛擬平台管理術:學習 vSphere ESXi 6.0 重點在於能領悟多少?
虛擬平台管理術:如何縮小 ESXi 虛擬硬碟實體檔案大小 (.vmdk)


 虛擬平台管理術:如何縮小 ESXi 虛擬硬碟實體檔案大小 (.vmdk)

 https://www.facebook.com/hkitblog