Avec VirtualBox, les images disques de taille allouée dynamiquement sont créées avec une taille minimale et grandissent automatiquement au fur et à mesure que des données sont écrites. En revanche, lorsque des données sont supprimées du disque virtuel, l'espace ainsi libéré n'est pas restitué à la machine hôte.
Ces images ne font donc que grossir jusqu'à atteindre leur taille maximale. Cela peut être embêtant si, par exemple, vous copiez temporairement un très gros fichier sur le disque virtuel puis que vous le supprimez. L'image disque aura alors grossi dans le pire des cas de la taille de votre fichier, sans que la suppression de ce dernier ne permette à l'hôte de disposer de cet espace libéré.
Pour récupérer cet espace inutilisé dans le disque virtuel au niveau du disque physique, vous devez alors compacter manuellement l'image disque en appliquant la méthode suivante.
Attention : cette opération ne peut pas être réalisée sur un disque virtuel possédant des instantanés (ou snapshots). Le cas échéant, vous devez donc restaurer l'instantané que vous souhaitez conserver et, au choix, soit cloner le disque virtuel dans cet état et travailler sur le clone, soit supprimer tous les autres instantanés.
Préparation du disque virtuel
Tout d'abord, pour que l'opération soit réellement efficace, vous devez préparer le disque virtuel que vous souhaitez compacter. En effet, le compactage fonctionne en supprimant de l'image les blocs ne contenant que des zéros. Or, lorsque des fichiers sont supprimés sur le disque virtuel, le système de fichiers ne met pas automatiquement à zéro la zone de stockage associée, et VirtualBox ne peut donc pas récupérer cet espace. Il faut donc au préalable mettre à zéro manuellement l'espace libre du disque virtuel à partir de la VM.
Depuis une machine virtuelle sous Windows
Pour faire cela sur une machine virtuelle Windows, l'idéal est de commencer par défragmenter le disque virtuel. Ensuite, téléchargez SDelete de Sysinternals puis lancez la commande suivante depuis le dossier de téléchargement :
sdelete -z
Depuis une machine virtuelle sous Linux
Sous Linux, je vous conseille d'utiliser la commande zerofree
, que vous pouvez obtenir en installant le paquet du même nom.
Avant tout, vous devez passer en mode mono-utilisateur (ou maintenance) avec la commande ci-dessous, à lancer en super-utilisateur :
telinit 1
Ensuite, il faut remonter la partition en lecture seule (bien évidemment, remplacez sda1 dans les commandes suivantes par le nom de votre partition) :
mount -o remount,ro /dev/sda1
Lancez enfin la commande zerofree
de cette manière :
zerofree -v /dev/sda1
Le cas échéant, vous pouvez ensuite répéter ces deux dernières commandes pour chacune des partitions du disque virtuel à compacter.
Il existe également une autre méthode pour remettre l'espace libre à zéro, qui consiste à le remplir avec un gros fichier ne contenant que des zéros à l'aide de la commande dd
puis à supprimer ce fichier. Personnellement, je vous déconseille cette méthode, car elle est très lente et surtout elle va obligatoirement remplir le disque et donc faire gonfler temporairement l'image disque à sa taille maximale, ce qui est un peu le contraire de l'effet recherché... Et si vous avez provisionné plus d'espace virtuel à vos VMs que vous ne disposez d'espace physique, vous risquez en plus de saturer votre espace physique !
Compactage de l'image disque
Assurez-vous d'avoir arrêté toutes les machines virtuelles utilisant le disque cible. Ensuite, lancez la commande suivante :
VBoxManage modifyhd [chemin-du-disque.vdi] --compact
Si le chemin d'installation de VirtualBox n'est pas dans votre PATH, vous devrez bien sûr indiquer le chemin complet de l'exécutable (par exemple, "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" par défaut sous Windows x64).
Notez que cette commande ne fonctionne pour le moment que sur les images disques au format VDI. Si votre image est dans un autre format, notamment VDMK, vous pouvez toutefois obtenir le même résultat en clonant l'image (avec l'option clonehd
). Évidemment, vous devrez dans ce cas remplacer le disque original par son clone dans chacune des machines virtuelles qui l'utilisent.
De manière générale, la commande VBoxManage est vraiment très pratique et permet de réaliser de très nombreuses opérations en ligne de commande, dont certaines qui n'ont même pas d'équivalence dans l'interface graphique. On peut ainsi par exemple convertir une image de taille fixe à dynamique et inversement. Je vous conseille de parcourir la page de manuel associée pour découvrir toutes ces fonctionnalités.
La commande de compactage ne fonctionne chez moi que si j'indique l'UUID du disque.
VBoxManage modifyhd [UUID du disque VDI] --compact
Cordialement
Enfin un article clair pour compacter un disque ".vdi" qui n’arrête pas de grossir.
J'ai utilisé (sous Windows) avec succès la procédure décrite.
Remarque : la commande "sdelete -z" doit indiquer aussi le disque qui contient le disque virtuel (ex: "sdelete -z C:").
Merci pour la publication de ce document.