Estou executando uma VM do Windows em um SSD de 128 GB. Aloquei um disco virtual de 127 GB para a VM, pensando que ele poderia ocupar todo o espaço da unidade. O que esqueci de levar em conta é o espaço em disco exigido pelos três instantâneos de VM que tirei e que estão armazenados na mesma unidade física. Agora resta 0 espaço na unidade e a VM não será executada.
O que eu gostaria de fazer é liberar espaço na unidade física excluindo todos os instantâneos. Infelizmente, quando tento excluir o instantâneo, recebo um erro:
Failed to perform an online medium merge (VERR_DISK_FULL)
É quando a VM está ligada, mas pausada. Se eu forçar o desligamento da VM e tentar mesclar, recebo:
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).
Qual é a maneira mais fácil de sair dessa bagunça? O sistema operacional host está executando o Linux Mint.
Responder1
Eu odeio, odeio, odeio mexer com o misterioso sistema de registro de mídia do VirtualBox... liberar discos e tentar reanexar snapshots e todas essas bobagens, então fiz isso da maneira mais simples que pude imaginar: copie as imagens de disco da VM para uma unidade maior, monte a unidadeno caminho original da VM, execute novamente os comandos de exclusão de instantâneo e, finalmente, copie a imagem de disco menor e final de volta para a unidade original. Todos os detalhes sangrentos seguem:
Como uso o LVM, primeiro crio um novo LV para armazenar os arquivos:
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
Em seguida, copio as imagens de disco da VM para o novo LV:
cd /var/vms sudo mkdir vm-resize sudo mount /dev/mapper/vm-resize vm-resize/ sudo cp -a somevm/* vm-resize/
Então eu monto o novo LV no mesmo caminho em que meu SSD foi montado:
umount somevm/ vm-resize/ sudo mount /dev/mapper/vm-resize somevm/
Finalmente posso "excluir" todos os instantâneos (que os mescla na imagem de disco atual):
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
Mas ainda não terminamos: em seguida, remonto meus dois LVs em seus locais originais:
sudo umount somevm/ sudo mount somevm/ sudo mount /dev/mapper/vm-resize vm-resize/
Em seguida, precisamos mover a nova imagem de disco menor de volta para a unidade original:
sudo rm somevm/Snapshots/*.vdi sudo cp -a vm-resize/somevm.vdi somevm/somevm.vdi
Neste ponto, você deseja testar a VM para ter certeza de que funciona.
Então, finalmente (desta vez de verdade), execute a limpeza:
sudo umount vm-resize sudo cryptsetup remove vm-resize sudo lvremove somevg/vm-resize
Tão fácil, certo?