縮小 Hyper-V 中 Ubuntu Linux 的虛擬硬碟 VHDX 占用的實體空間
因為歷史的包袱加上一時沒注意,被大量的圖檔和 MySQL 的 BINLOG 給塞爆了虛擬硬碟。清除問題後,雖然整個 Linux 只使用了 13GB 左右的空間,但還是在實體硬碟中佔用了 128GB。
從 Linux 系統內來看硬碟使用狀況,sda1 使用了 13GB:
root@UbuntuLinux:~# df -Bg Filesystem 1G-blocks Used Available Use% Mounted on udev 21G 0G 21G 0% /dev tmpfs 5G 1G 5G 1% /run /dev/sda1 123G 13G 105G 11% / tmpfs 21G 0G 21G 0% /dev/shm tmpfs 1G 0G 1G 0% /run/lock tmpfs 21G 0G 21G 0% /sys/fs/cgroup
但占用的實際硬碟空間是這樣:
Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2022/8/1 上午 11:13 134591021056 Ubuntu.vhdx -a---- 2022/8/1 上午 11:13 77824 Ubuntu.vhdx.mrt -a---- 2022/8/1 上午 11:13 9998336 Ubuntu.vhdx.rct
所以對實體 VHDX 檔的瘦身是有必要的了。
參考了各方文件加上親身使用後做出如下的筆記:
觀念:要減少 VHDX 虛擬硬碟檔內已經無用的空間,要先在 Linux 環境下把檔案系統給清乾淨,再到外面做虛擬硬碟檔的瘦身(compact / shrink / 壓縮)
第一種方法是 fstrim -a -v 但我發現瞬間做完,而且畫面上說只有釋放出 1.7GB 左右的空間,這表示沒啥用。
root@UbuntuLinux:~# fstrim -a -v /: 1.7 GiB (1759866880 bytes) trimmed on /dev/sda1
第二種方法法用 dd 工具把檔案系統剩下的空間全部填上 0,但是請先評估自己系統內是否有什麼服務是會因為硬碟爆掉而不正常暫停且會有不良影響的。以我來說,我有網站 (Nginx) 和資料庫 (MySQL),我覺得這兩個服務在硬碟滿時還在運作是有不良影響的,所以我先把這兩個給停掉(以下我都是在 root 身分下做的,所以 sudo 那些事情就沒寫出來):
service nginx stop service mysql stop
接著做:
dd if=/dev/zero of=~/zeroes sync rm ~/zeroes
上述這個步驟看你整個虛擬硬碟剩下的空間有多少而定,但不會增加你實體硬碟的佔用量,以我 128G 虛擬硬碟還剩下 105G 的情況下,此動作大概耗費十幾分鐘。
接著把 Linux 虛擬機關機。
可以先嘗試用 Hyper-V 管理工具的磁碟->壓縮,但我做了完全沒效果:
如果你做了以後有明顯效果,那可以做到這邊就停,否則可以參考看看以下這個做法,因為對我有用:
在 Hyper-V 的主機下開 PowerShell,找到你虛擬硬碟的位置與檔名,然後:
Optimize-VHD (你的虛擬硬碟檔名).vhdx -Mode Full
做一陣子後我的 VHDX 檔從 128GB 左右縮小到 50GB,雖然不如預期只要占用虛擬硬碟內回報的 13GB,但這個縮小程度也還算是不錯,畢竟使用很多年,檔案系統的零碎狀況大概還是比較複雜一點。
做之後:
Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2022/8/1 上午 11:49 51342475264 Ubuntu.vhdx -a---- 2022/8/1 上午 11:13 77824 Ubuntu.vhdx.mrt -a---- 2022/8/1 上午 11:49 9998336 Ubuntu.vhdx.rct歷史上的今天...
- A3D 2.22 驅動程式 - 1999
- YAMAHA YMF724 PCI 音效卡 - 1998
最新留言