# 縮減 Linux guest OS vmdk 大小

[![image.png](https://docs.ossii.com.tw/uploads/images/gallery/2022-08/scaled-1680-/image.png)](https://docs.ossii.com.tw/uploads/images/gallery/2022-08/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：

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

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

```shell
$ 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  
> <span style="color: rgb(224, 62, 45);">/dev/sda2 102687672 4201836 93226572 5% /</span>  
> <span style="color: rgb(224, 62, 45);">/dev/sda3 102687672 71528 97356880 1% /var/log</span>  
> <span style="color: rgb(224, 62, 45);">/dev/sda1 841158408 476916 797883312 1% /data</span>  
> tmpfs 793636 0 793636 0% /run/user/1000

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

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

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

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

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

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

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

##### **4 匯出 ova/ovf 檔案**

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