我在 128GB SSD 上執行 Windows VM。我為虛擬機器分配了一個 127GB 的虛擬磁碟,認為它可以佔用磁碟機上的所有空間。我忘記考慮的是我拍攝的 3 個虛擬機器快照儲存在同一實體磁碟機上所需的磁碟空間。現在磁碟機上剩餘空間為 0,虛擬機器將無法運作。
我想做的是透過刪除所有快照來釋放實體磁碟機上的空間。不幸的是,當我嘗試刪除快照時出現錯誤:
Failed to perform an online medium merge (VERR_DISK_FULL)
此時虛擬機器已開啟但已暫停。如果我強制關閉虛擬機器並嘗試合併,我會得到:
Failed to delete the snapshot SomeSnapshot of the virtual machine somevm.
Could not merge the medium '/var/vms/somevm/Snapshots/{58220add-b745-4d38-874b-c788f0e31560}.vdi' to '/var/vms/somevm/Snapshots/{181dd674-a65a-44af-afa4-d7ee00cf6c21}.vdi' (VERR_DISK_FULL).
擺脫困境最簡單的方法是什麼?主機作業系統正在運行 Linux Mint。
答案1
我討厭、討厭、討厭搞亂 VirtualBox 的神秘媒體註冊表系統...釋放磁碟並嘗試重新附加快照和所有這些廢話,所以我用我能想到的最簡單的方式做到了:將 VM 磁碟映像複製到更大的驅動器,安裝驅動器在虛擬機器的原始路徑下,重新運行快照刪除命令,然後最後將最終的較小磁碟映像複製回原始磁碟機。所有血淋淋的細節如下:
由於我使用 LVM,因此我首先建立一個新的 LV 來儲存檔案:
sudo lvcreate -l 100%FREE -n vm-resize somevg sudo cryptsetup create vm-resize /dev/mapper/somevg-vm--resize --key-file /dev/urandom sudo mkfs.ext4 -m 1 /dev/mapper/vm-resize
接下來,我將 VM 磁碟映像複製到新 LV:
cd /var/vms sudo mkdir vm-resize sudo mount /dev/mapper/vm-resize vm-resize/ sudo cp -a somevm/* vm-resize/
然後我將新的 LV 安裝在 SSD 安裝的相同路徑上:
umount somevm/ vm-resize/ sudo mount /dev/mapper/vm-resize somevm/
最後我可以“刪除”所有快照(將它們合併到當前磁碟映像中):
snapshots=( $(VBoxManage snapshot somevm list | sed -E 's/.*(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}).*/\1/') ) for uuid in "${snapshots[@]}"; do VBoxManage snapshot somevm delete "$uuid" done
但我們還沒完成:接下來我將兩個 LV 重新安裝到原來的位置:
sudo umount somevm/ sudo mount somevm/ sudo mount /dev/mapper/vm-resize vm-resize/
然後我們需要將新的、較小的磁碟映像移回原始磁碟機:
sudo rm somevm/Snapshots/*.vdi sudo cp -a vm-resize/somevm.vdi somevm/somevm.vdi
此時,您想要測試虛擬機器以確保其正常運作。
最後(這次是真正的)執行清理:
sudo umount vm-resize sudo cryptsetup remove vm-resize sudo lvremove somevg/vm-resize
這麼簡單,對吧?