2015年1月30日 星期五

縮小 VirtualBox 「虛擬機」的硬碟映像檔

一般在建立 VirtualBox 虛擬機時,所使用的『硬碟映像檔』多直接使用預設的『VDI (VirtualBox 磁碟映像)』。這個映像檔格式若同時設為『動態配置』,則其實際所佔硬碟空間將隨虛擬機的系統使用而增加,也就是說「虛擬機」新建立時在「實體主機」的硬碟映像檔較小,而會隨著「虛擬機」的使用漸漸增加。
  但是,隨著刪刪改改,「虛擬機」中所存的資料並未實際增加多少,可是已經增大的映像檔卻不會縮小。使用 VirtualBox 提供的『VBoxManage modifyhd ... --compact』這個『緊縮』命令,也不能回復到實際大小。這是因為:
  • 「虛擬機」的硬碟資料被刪除時,並未實際被清空,只在 FAT(檔案配置表)中註記為『該空間可再使用於儲存新資料』。
  • VirtualBox 的命令只將內容為0值之位置回收,而被註記為『空』的位置但內容不為0值,故並未回收。
當需要『減少實際硬碟映像檔大小』及『匯出「虛擬機」』時,上述的機制並不能滿足要求。網路上有許多『VDI 廋身』分享,以下是整理出來適合目前工作環境的方法:

一、安裝 Windows 系統的「虛擬機」

若「虛擬機」內安裝 Windows 作業系統,將硬碟映像檔的『已刪除資料』清空為0,可借助 Microsoft 提供的工具 SDelete:
  • 下 載 點:SDelete v1.61
  • 適用系統,Client : Windows XP 及以上版本
         Server : Windows Server 2003 及以上版本
  • 下載後安裝備用。
接著就可開始「清空已刪除資料」的步驟:
  1. 刪除不再需要或暫存的資料,或移除(反安裝)不需要的程式。
  2. 整理「虛擬機」的硬碟資料:從《所有程式》→《附屬應用程式》→《系統工具》點選「磁碟重組工具」,將硬碟資料整理一翻,使得每個檔案資料都為連續空間。此舉有助於之後的「硬碟映像檔」縮小。
  3. 將「已刪除資料」填入0值:在「命令提示字元」的「終端機」視窗中,將『工作目錄』切換到 SDelete 所在的目錄,再下這個命令
    C:\Program Files> SDelete -z c:
    其中『-z』是將『已刪除資料』皆填入0值,『c:』是指定欲清除資料的硬碟編號。等完成度到達 100% 就已經將『已刪除資料』皆清為0。若有數個硬碟,需更換硬碟編號再下一次命令。
接下來,再執行步驟三,將「虛擬機」的『硬碟映像檔』瘦身。

二、安裝 Fedora 系統的「虛擬機」

當「虛擬機」中所安裝的系統是 Fedora 時,所需要的準備工作大致上與 Windows 類似,只是所使用的程式不同,或下達命令的方式不同。
  將『已刪除資料』填入0值的程式,可以在平時先安裝備用,
[root@VM-test ~]# yum install zerofree
其它的過程,以最近有再測試過的系統(Fedora 20 及 21)為例,分述如下:

Fedora 21

因為要將『已刪除資料清為0值』,該硬碟就不能掛載使用。Fedora 21 Workstation 提供 Live 光碟,供使用者試用、安裝,完全不會用到原有的硬碟,很適合進行接下來的處理。在 VirtualBox 虛擬機中,加入『Live 光碟映像檔』並切換至『由光碟機開機』。
點選『Try Fedora』(即『試用 Fedora』),使用「Live 光碟」中的 Fedora 系統。等桌面環境出現後開啟「終端機」,在「終端機」中輸入以下命令:
[root@VM-test ~]# yum install zerofree
 . . . . .
[root@VM-test ~]# parted /dev/sda print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  StartEndSizeTypeFile systemFlags
11049KB  525MB524MBprimary  ext4boot
2525MB2673MB  2147MB  primarylinux-swap(v1)  
32673MB21.5GB18.8GBprimaryext4

[root@VM-test ~]# zerofree /dev/sda1
[root@VM-test ~]# zerofree /dev/sda3
[root@VM-test ~]# shutdow -h now
上圖中共下了 5 個命令,分別說明如下:
命 令說 明
yum install zerofree若「虛擬機」系統未安裝將『已刪除資料填入0值』套件,可在這裏補安裝。(注意:此為暫時性安裝,未實際安裝在「虛擬機」中)
parted /dev/sda print列出硬碟裝置(/dev/sda)的分割情形。Number 1~3 表分割區編號,
編號 1 為開機時的啟動分割區,
編號 2 為『虛擬記憶體』的置換分割,而
編號 3 為根目錄、家目錄等目錄所在之分割區。
zerofree /dev/sda1將『已刪除資料』以0值取代之,則 VirtualBox 會將其視為未使用的磁碟空間,之後可執行『緊縮(compact)』命令,縮小硬碟映像檔的大小。(注意:除了 swap 之外的分割區,都要重覆此命令;若有多個硬碟,其裝置名稱可能為 /dev/sdbx)
zerofree /dev/sda3
shutdow -h now關閉「虛擬機」,以執行 VirtualBox 的『緊縮(compact)』命令。

Fedora 20

如果使用『Live 光碟映像檔』,操作的步驟類似 Fedora 21 所述。但是,一般在安裝 Fedora 20 時多使用『DVD 光碟映像檔』不能直接當『Live 光碟』用,所以要用不一樣的方式。
  在 VirtualBox 虛擬機中,加入『DVD 光碟映像檔』並切換至『由光碟機開機』。等開機安裝選項時
選擇《Troubleshooting》→《Rescue a Fedora system》,繼續開機程序。接下來有數個視窗,依序說明如下:
  • 出現一個名為『Rescue』的文字型式的選擇視窗,點選《Read-Only》。
  • 接著出現另一個視窗(亦為文字型式),說明將開啟一個『命令解譯層』。並指示使用者可以『chroot /mnt/sysimage』命令,切換到「虛擬機」原系統。直接按【OK】繼續。
若這時候要補安裝 zerofree 套件,要執行這幾個命令:
sh-4.2# mount -o remount,rw -t ext4 /dev/sda3 /mnt/sysimage/
sh-4.2# chroot /mnt/sysimage/
bash-4.2# yum install zerofree
 . . . . .
bash-4.2# exit
exit
sh-4.2# mount -o remount,ro -t ext4 /dev/sda3 /mnt/sysimage/
上圖中共下了 5 個命令,分別說明如下:
命 令說 明
mount -o remount,rw ...將「虛擬機」硬碟的根目錄,重新掛載為『可讀寫』。
chroot /mnt/sysimage/將「DVD 光碟」急救模式的根目錄,切換為「虛擬機」硬碟的根目錄,可安裝套件在「虛擬機」的硬碟中。
yum install zerofree安裝 zerofree 套件,因已將「虛擬機」的根目錄重新掛載為『可讀寫』,將如同在「虛擬機」正常開機狀態一般,所安裝的套件會永久存在。
exit回到「DVD 光碟」急救模式。
mount -o remount,ro ...將「虛擬機」硬碟的根目錄,重新掛載為『唯讀』。
:圖中的提示字串為『sh-4.2#』為「DVD 光碟」的急救模式,而『bash-4.2#』為暫時性切換到「虛擬機」硬碟的模式。

  若是 zerofree 套件已安裝妥,就可繼續進行接下來的步驟:
sh-4.2# df
Filesystem1K-blocksUsedAvailableUse%Mounted on
/dev/mapper/live-rw2030995741999128490037%/
devtmpfs49047204904720%/dev
  . . . . .
/dev/sda31790953235448361343188421%/mnt/sysimage
/dev/sda14876529926335869322%/mnt/sysimage/boot
  . . . . .
sh-4.2# mount -n -o remount,ro -t ext4 /dev/sda1 /mnt/sysimage/boot/
sh-4.2# mount -n -o remount,ro -t ext4 /dev/sda3 /mnt/sysimage/
sh-4.2# zerofree /dev/sda1
sh-4.2# zerofree /dev/sda3
sh-4.2# shutdow -h now
上圖中共下了 6 個命令,分別說明如下:
命 令說 明
df列出硬碟裝置的分割情形。其中列首為
/dev/sda3 為根目錄、家目錄等目錄所在之分割區,
/dev/sda1 為開機時的啟動分割區。
mount ...-o remount,ro ...將原「虛擬機」系統的硬碟分割區,重新掛載為唯讀。使其為『不可改變』,才可用 zerofree 清除『已刪除資料』。(注意:欲清除資料的分割區,都要重覆此命令;若有多個硬碟,其裝置名稱可能為 /dev/sdbx)
mount ...-o remount,ro ...
zerofree /dev/sda1將『已刪除資料』以0值取代之,則 VirtualBox 會將其視為未使用的磁碟空間,之後可執行『緊縮(compact)』命令,縮小硬碟映像檔的大小。(注意:除了 swap 之外的分割區,都要重覆此命令;若有多個硬碟,其裝置名稱可能為 /dev/sdbx)
zerofree /dev/sda3
shutdow -h now關閉「虛擬機」,以執行 VirtualBox 的『緊縮(compact)』命令。

三、將「虛擬機」的「硬碟映像檔」縮小

當「虛擬機」的硬碟映像檔中的『已刪除資料』都已清除為0值,就可以用 VirtualBox 的工具將硬碟映像檔縮小,命令如下:
[SiB@Core-i7 ~]$ cd VirtualBox\ VMs\VM-test
[SiB@Core-i7 VM-test]$ VBoxManage modifyhd --compact VM-test.vdi
其中,第一個命令是將『工作目錄』切換到該「虛擬機」所在的目錄,第二個命令才是將「虛擬機」的硬碟映像檔縮小。

已測試版本:

  • 主 機:Fedora 21 + VirtualBox 4.3.20
  • 虛擬機:Fedora 20, 21

參考資料:

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)