縮減 Linux guest OS vmdk 大小

image.png

1 前情提要

前陣子因為需要協助客戶的雲端主機建立以 Rocky Linux 8 系統為底的虛擬平台,但不知為什麼客戶端的虛擬平台「無法」上傳 Rocky Linux 8 的安裝 ISO (用慣了 PVE 後,其它虛擬平台真的不是太想用呀),結果必需先使用 VMWare Workstation 建立一組 VM,再將其匯出成 ova 格式後提供給對方的工程師匯入平台中。

結果因為客戶的系統太舊,不支援 VM 上的 NVMe Device,結果要整個重做,後來又因為測試的過程中,把大量的測試檔案寫入 guest OS 的系統中,後續雖然把 Linux guest OS 的空間都清空了,但是在 Host 裡面的硬碟檔案(.vmdk)空間卻無法釋戶,造成當匯出成 ova 或是 ovf 檔案時,檔案異常的大,明明只用到 3 GB 的空間,但匯出的 ova 卻有 15 GB!所以在網路上找到作法後,直接將空間降為 4GB,變成合理的大小後才順利完成這個任務。

2 在 Linux Guest OS 系統進行空間釋出作業

在 Linux 的 Guest OS 系統中的做法其實很簡單,但是要抓一下竅門,網路上都只說在 console 下執行以下指令,把空間填滿後刪除,自然就會把沒用到的硬碟空間釋放出來了,指令如下:

方式 1:

$ sudo dd if=/dev/zero of=zero.dat ; rm -f zero.dat

方式 2(個人覺得比較簡單):

$ cat /dev/zero > zero.dat; rm -f zero.dat

視實際你的硬碟大小會決定執行的時間長短,但是,請特別注意,執行此指令的時候,務必確定在「每一個分割區」都執行一次,因為我第一次執行時,只降了約 300 MB 的空間,後來才發現我有某一個分割區高達 800GB,結果我預設是在 root 分割區執行,自然沒有釋放出最大的空間。

$ df
檔案系統         1K-區段         已用         可用            已用%           掛載點
devtmpfs         3951096        0              3951096      0%                /dev
tmpfs               3968180        0              3968180      0%                /dev/shm
tmpfs               3968180        9228        3958952      1%                /run
tmpfs               3968180        0              3968180      0%                /sys/fs/cgroup
/dev/sda2        102687672    4201836  93226572    5%                /
/dev/sda3        102687672    71528      97356880    1%                /var/log
/dev/sda1        841158408    476916    797883312  1%                /data
tmpfs               793636          0              793636        0%               /run/user/1000

所以,要去這 3 個分割區各執行一次上面的指令後,才會在每個分割區計算出,可以釋出的空間。完成之後請將 Linux guest OS 關機。

3 在 Host 執行 vmware-vdiskmanager -k 指令

最後在 Host 上(我的環境是 Windows 10),開啟 cmd 視窗,然後切換到 VMWare 的安裝目錄中,指令大概如下,每台電腦會有所不用:

c:\> cd "c:\Program Files (x86)\VMware\VMware Workstation"

然後執行以下指令壓縮 .vmdk 的空間。

> vmware-vdiskmanager -k 你的 .vmdk 路徑
Shrink: 100% done.
Shrink completed successfully.

當跑到 100% 時,即完成 .vmdk 的壓縮作業。

4 匯出 ova/ovf 檔案

最後,請在 VM 機器關機的狀態下,先選擇 VM 的名稱,再點選選單中的「File」->「Export to OVF」,並設定輸出的名稱及路徑(記得決定副檔名是 .ova 或是 .ovf)即完成匯出作業啦!


Revision #6
Created 11 August 2022 10:30:16 by kevin
Updated 11 August 2022 11:09:02 by kevin