libérer de l'espace non utilisé sur un fichier image qcow2 sur kvm / qemu

23

nous utilisons kvm / qemu avec des images qcow2 pour nos machines virtuelles.

qcow2 a cette fonctionnalité intéressante où le fichier image alloue uniquement l'espace réellement nécessaire par la machine virtuelle. mais comment puis-je réduire le fichier image, si l'espace alloué de la machine virtuelle devient plus petit?

Exemple:

1.) je crée une nouvelle image au format qcow2, taille 100 Go

2.) J'utilise cette image pour installer Ubuntu. l'installation nécessite environ 10 Go, le fichier image atteint environ 10 Go. rien d'inattendu jusqu'à présent.

3.) je remplis l'image avec environ 40 Go de données supplémentaires. le fichier image atteint 50 Go. je suis d'accord avec ça :-)

4.) c'est là que ça devient étrange: je supprime toutes les données de 40 Go sur l'image, mais la taille de l'image mange toujours 50 Go.

question: comment puis-je libérer ces 40 Go de données et réduire l'image aux 10 Go nécessaires?

merci d'avance, berni

bmaeser
la source

Réponses:

26

L'image ne rétrécira pas automatiquement, car lorsque vous supprimez des fichiers, vous ne supprimez pas réellement les données (c'est pourquoi la restauration fonctionne). Qemu a la possibilité de réduire les images qcow2, mais ce que l'utilitaire fait est vraiment de dédupliquer les zéros du disque, laissant toutes les autres informations intactes. L'idée serait donc de:

  1. Remplissez le lecteur à zéro ( dd if=/dev/zero of=/some/filejusqu'à ce que vous manquiez d'espace)
  2. supprimer / certains / fichiers
  3. arrêtez la machine virtuelle
  4. cd où les images de la VM sont conservées et exécutées qemu-img convert -O qcow2 original_image.qcow2 deduplicated_image.qcow2
  5. modifier les paramètres de la machine virtuelle pour utiliser le nouveau deduplicated_image.qcow2, tester le fonctionnement de la machine virtuelle et supprimer l'ancienne image

Cela, afaik, ne fonctionnera qu'avec des images qcow2, je n'ai pas testé d'autres formats.

Dyasny
la source
3
Si vous avez un invité Windows, exécutez SDelete -z pour mettre à zéro tout l'espace libre (étapes 1,2 ci-dessus)
ndemou
17

virt-sparsify peut faire tout cela avec moins de tracas de votre part: http://libguestfs.org/virt-sparsify.1.html

Eric Blake
la source
Pas si sûr qu'il était là en 2011
dyasny
2
@dyasny Si les réponses existantes aux anciennes questions sont devenues obsolètes avec le temps, il vaut la peine d'écrire une nouvelle réponse. Cette nouvelle réponse particulière pourrait cependant ne pas être conforme aux normes de ce site.
kasperd
4
@dyasny Si quelqu'un veut consacrer l'effort à écrire une nouvelle réponse de qualité, chaque fois que l'ancienne est obsolète, il convient de l'encourager. Une discussion plus approfondie sur la façon de traiter les réponses obsolètes est mieux adaptée à la méta.
kasperd
1

virt-sparsify fileA fileBfera tout cela, mais ne réduira pas réellement la taille de l'image. Pour cela, vous devez ajouter --compress.

cmyster
la source