我在 128GB SSD 上运行 Windows VM。我为 VM 分配了一个 127GB 的虚拟磁盘,以为它可以占用驱动器上的所有空间。我忘记考虑的是存储在同一物理驱动器上我拍摄的 3 个 VM 快照所需的磁盘空间。现在驱动器上剩余空间为 0,VM 无法运行。
我想做的是通过删除所有快照来释放物理驱动器上的空间。不幸的是,当我尝试删除快照时,出现了错误:
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 神秘的媒体注册系统……释放磁盘并尝试重新连接快照和所有那些废话,所以我用我能想到的最简单的方法做了:将虚拟机磁盘映像复制到更大的驱动器上,安装驱动器在虚拟机的原始路径,重新运行快照删除命令,最后将最终的、较小的磁盘映像复制回原始驱动器。所有细节如下:
由于我使用 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
很简单,对吧?