VirtualBox VM 空间瘦身记(vmdk)
本文地址:https://www.ebpf.top/post/shrink_vbox_vmdk_size
在使用 VirtualBox( VMDK 模式)管理虛擬機(jī)的時(shí)候,我們經(jīng)常會(huì)遇到一些編譯安裝場(chǎng)景(比如編譯 Linux 內(nèi)核),會(huì)導(dǎo)致磁盤(pán)空間急劇膨脹,但是在編譯完成后即使我們刪除了相關(guān)的文件,在 VM 虛擬機(jī)占用主機(jī)的空間卻并沒(méi)有減少,這時(shí)候?yàn)榱蓑v出磁盤(pán)空間或者更方便與他人分享,我們需要給 VM 的磁盤(pán)進(jìn)行瘦身操作。
1.1 虛擬磁盤(pán)格式介紹
VirtualBox 主要支持下列虛擬磁盤(pán)格式為 VMDK 和 VDI:
- VMDK(Virtual Machine Disk) 最初是由 VMware 為其產(chǎn)品研發(fā)的格式。該格式技術(shù)設(shè)計(jì)文檔最初是閉源的,而現(xiàn)在已經(jīng)開(kāi)源,在 VirtualBox 里完全可用。這種格式有個(gè)功能是:把一個(gè)虛擬機(jī)的鏡像分割成多個(gè) 2GB 大小的文件。如果你要把虛擬機(jī)鏡像放在不支持大文件的文件系統(tǒng)(例如 FAT32)上,那么這個(gè)功能就非常有用。在其他的虛擬磁盤(pán)格式里,能做到同樣功能的只有 Parallels 的 HDD。
- VDI(Virtual Disk Image) 格式是 VirtualBox 新建虛擬機(jī)時(shí)默認(rèn)選用的格式。也是 VirtualBox 的自有開(kāi)放格式。
VirtualBox 支持的虛擬磁盤(pán)格式還有 VHDX 和 HDD 等多種格式,詳細(xì)信息請(qǐng)參考 VirtualBox 簡(jiǎn)體中文 。
1.2 用零字節(jié)填充空閑空間
VirtualBox 只有在空間被設(shè)置為零的情況下才知道這是磁盤(pán)中真正的空閑空間,這與我們?cè)谝话銠C(jī)器上通過(guò)標(biāo)準(zhǔn)的 rm 命令刪除即可釋放空間有很大不同。
為了實(shí)現(xiàn)這個(gè)效果,我們需要登錄到 VM 主機(jī)中登錄到虛擬機(jī)中,使用零字節(jié)空間填充掉空閑空間,然后再把填充的文件進(jìn)行刪除,即可達(dá)到效果。
$ cat /dev/zero > zero.fill; sync; sleep 1; sync; rm -f zero.fill
cat: write error: No space left on device
在命令執(zhí)行完成后,會(huì)出先一個(gè) “cat: write error: No space left on device” 的錯(cuò)誤,這個(gè)錯(cuò)誤恰恰表明我們使用零字節(jié)填充了所有的空閑空間。
至此,我們已經(jīng)在 VM 虛擬機(jī)中成功地將空閑的空間進(jìn)行了零字節(jié)填充,是時(shí)候進(jìn)行真正的 “ 減肥 ” 操作了。
1.3 定位 VM 虛擬磁盤(pán)文件
在 VirtualBox 運(yùn)行的主界面上,我們可以通過(guò)在虛擬機(jī)上點(diǎn)擊右鍵,在彈出的菜單上選擇 “Setting“ 選項(xiàng),會(huì)彈出本虛擬相關(guān)的設(shè)置,切換到 ”Storage“ 選項(xiàng)卡。
圖 1-1 進(jìn)入 VM 的設(shè)置頁(yè)面
在 ”Storage“ 選項(xiàng)卡的主界面中我們可以看到 VM 掛載的虛擬磁盤(pán),點(diǎn)擊虛擬磁盤(pán)選項(xiàng),在右側(cè)的 ”Attributes“ 信息欄中就可以在 ”Location“ 項(xiàng)中查詢(xún)到選擇虛擬磁盤(pán)所在的目錄和文件名。
目錄默認(rèn)保存位置為 ~/VirtualBox VMs/ 目錄下以 VM 名稱(chēng)命名的子目錄下,如本例中的 ~/VirtualBox VMs/ubuntu_21_04_default_1632463892989_42055,其中 ubuntu_21_04_default_1632463892989_42055 為 VM 主機(jī)名。
圖 1-2 進(jìn)入 VM 的設(shè)置頁(yè)面中的存儲(chǔ)項(xiàng)詳情
確定 VM 的虛擬磁盤(pán)所在目錄后,我們通過(guò)終端進(jìn)入到對(duì)應(yīng)的目錄,進(jìn)行查看:
$ cd ~/VirtualBox\ VMs/ubuntu_21_04_default_1632463892989_42055/
$ ls -lh
-rw------- 1 dwh0403 staff 35G Sep 28 13:37 ubuntu-hirsute-21.04-cloudimg.vmdk
...
這里我們可以看到該該虛擬磁盤(pán)占用了 35G 的磁盤(pán)大小。我們可以通過(guò) vboxmanage showhdinfo 命令查看 vmdk 文件的詳情(如果后續(xù)需要繼續(xù)使用 vmdk 格式需要):
$ vboxmanage showhdinfo ubuntu-hirsute-21.04-cloudimg.vmdk
UUID: 6a00f1e1-a53f-4a48-9f41-4f2a96248286
Parent UUID: base
State: created
Type: normal (base)
Location: /Users/dwh0403/VirtualBox VMs/ubuntu_21_04_default_1632463892989_42055/ubuntu-hirsute-21.04-cloudimg.vmdk
Storage format: VMDK
Format variant: dynamic default
Capacity: 40960 MBytes
Size on disk: 35717 MBytes
Encryption: disabled
為了壓縮虛擬磁盤(pán)的空間,我們需要將 vmdk 格式轉(zhuǎn)換成 vdi 格式。如果本機(jī)安裝了 Vmware 產(chǎn)品,可以直接使用其提供的工具直接進(jìn)行瘦身,參見(jiàn) Vmware 磁盤(pán)管理樣例 。
$ vboxmanage clonehd --format vdi ubuntu-hirsute-21.04-cloudimg.vmdk ubuntu-hirsute-21.04-cloudimg.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'vdi'. UUID: 46de9fce-0055-472b-aee2-128509e3685$ ls -hl
-rw------- 1 dwh0403 staff 11G Sep 28 13:41 ubuntu-hirsute-21.04-cloudimg.vdi
...$ vboxmanage modifyhd ubuntu-hirsute-21.04-cloudimg.vdi --compact
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
待轉(zhuǎn)換完成后,我們可以在當(dāng)前目錄進(jìn)行查看可以發(fā)現(xiàn) vdi 的文件大小已經(jīng)降低至 11G(原始 vmdk 文件為 35G 大小),表明在轉(zhuǎn)換過(guò)程中已經(jīng)完成了磁盤(pán)空間的縮容。
1.4 將 VDI 格式的磁盤(pán)掛載(方案一,驗(yàn)證,推薦)
在轉(zhuǎn)換 vdi 格式后,已經(jīng)完成了空間的調(diào)整,如果我們并去強(qiáng)烈使用 vmdk 格式,我們可以直接將原來(lái)的 vmdk 格式虛擬磁盤(pán)從 VM 中卸載,然后將 vdi 格式的磁盤(pán)掛載即可。同時(shí)記得刪除 vmdk 格式的虛擬磁盤(pán)。
在保持 VM 虛擬機(jī)關(guān)閉的情況下,進(jìn)入到 VM 的存儲(chǔ)設(shè)置頁(yè)面,步驟與圖 1-2 一致。
首先,在移除老的 vmdk 格式的虛擬磁盤(pán)上點(diǎn)擊右鍵,在右鍵菜單屬性中選擇 ”Remove Attachment“:
然后鼠標(biāo)選擇磁盤(pán)控制器,選擇添加磁盤(pán)按鈕:
]
在彈出的添加磁盤(pán)文件的窗口中選擇 ”Add“ 按鈕,進(jìn)入到選擇文件窗口,選擇我們新的 vdi 格式文件即可。
然后將 VM 虛擬機(jī)啟動(dòng)驗(yàn)證,如果一切順利則完成了整個(gè)瘦身過(guò)程。
這里推薦使用 vdi 格式的虛擬磁盤(pán)格式,后續(xù)在磁盤(pán)空間吃緊的情況還可以使用下述命令調(diào)整大小:
$ VBoxManage modifyhd xxx.vdi --resize the_new_size
1.5 使用 VMDK 格式的磁盤(pán)掛載(方案二,未驗(yàn)證)
如果由于特殊原因必須使用 vmdk 格式的虛擬磁盤(pán),我們需要將瘦身后的 vdi 格式文件重新轉(zhuǎn)換為 vmdk 格式:
$ VBoxManage clonehd ubuntu-hirsute-21.04-cloudimg.vdi ubuntu-hirsute-21.04-cloudimg_new.vmdk --format vmdk
這里可以選擇如上述方案相同的方式,通過(guò)去除虛擬磁盤(pán)再添加新的磁盤(pán),如果使用原有的文件名字覆蓋的話(huà),由于轉(zhuǎn)換過(guò)程中生成了新的 UUID,則會(huì)導(dǎo)致 VirtualBox 不能夠識(shí)別新的虛擬磁盤(pán),這里需要重新設(shè)置 UUID。
$ vboxmanage internalcommands sethduuid ./ubuntu-hirsute-21.04-cloudimg <原 UUID 在此>
1.5.1 錯(cuò)誤解決:
$ VBoxManage clonehd ubuntu_21_04_default_1632463892989_42055/ubuntu-hirsute-21.04-cloudimg.vdi ubuntu-hirsute-21.04-cloudimg.vmdk --format vmdk
VBoxManage: error: UUID {6438d068-ae7b-467d-ab30-6e1228c30bd9} of the medium '/Users/dwh0403/VirtualBox VMs/ubuntu_21_04_default_1632463892989_42055/ubuntu-hirsute-21.04-cloudimg.vdi' does not match the value {46de9fce-0055-472b-aee2-128509e3685d} stored in the media registry ('/Users/dwh0403/Library/VirtualBox/VirtualBox.xml')
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component MediumWrap, interface IMedium, callee nsISupports
VBoxManage: error: Context: "CloneTo(pDstMedium, ComSafeArrayAsInParam(l_variants), NULL, pProgress.asOutParam())" at line 1068 of file VBoxManageDisk.cpp
如果有上述報(bào)錯(cuò),建議修改 vmdk 生成的文件名重試。
1.6 總結(jié)
最后,我們可以已經(jīng)成功完成了 VM 虛擬空間的瘦身,這對(duì)于我們?cè)谀承﹫?chǎng)景下進(jìn)行功能測(cè)試還是非常有幫助。
1.7 參考
-
How to compact VirtualBox’s VDMK file size
-
VirtualBox ( 簡(jiǎn)體中文 )
-
VM VirtualBox? User Manual
總結(jié)
以上是生活随笔為你收集整理的VirtualBox VM 空间瘦身记(vmdk)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2019年第十届蓝桥杯国赛B组试题D-求
- 下一篇: 专访格灵深瞳CTO赵勇:为 计算机视觉