Kévin Subileau

Espace personnel

Virtualbox

VirtualBox - Convertir une image disque de taille fixe en dynamique

VirtualBox propose deux modes pour la gestion de la taille des images disques : allocation dynamique ou taille fixe. Dans le premier cas, le fichier image est initialement créé avec une taille minimale et grossit au fur et à mesure que des données sont écrites jusqu'à atteindre la taille maximale configurée. En revanche, une image fixe, comme son nom l'indique, est créée dès le départ avec la taille demandée et occupe donc immédiatement sa capacité maximale sur le disque physique de l'hôte.

Le choix entre ces deux options peut-être délicat. En effet, chacune à ses propres avantages et inconvénients. L'utilisation d'images de taille dynamique permet d'allouer aux machines virtuelles plus d'espace que ce qui est physiquement disponible, mais cela peut ralentir les opérations de lecture/écriture. Les images de taille fixe ne souffrent pas de ces ralentissements, mais monopolisent souvent beaucoup d'espace disque inutilisé.

Ainsi, que se soit pour récupérer de l'espace disque virtuel inutilisé ou optimiser les I/O, il peut parfois être intéressant de convertir une image de taille fixe en dynamique ou inversement. Malheureusement, VirtualBox ne permet pas à ce jour de changer le mode de gestion de la taille d'un disque virtuel. Cela reste tout de même possible, mais il faut cloner l'image vers une nouvelle.

Pour cela, vous devez utiliser la commande suivante en choisissant pour le paramètre --variant la valeur correspondante au type de disque souhaité (Standard pour une image dynamique ou Fixed pour une taille fixe) :

VBoxManage clonehd [ancienne-image] [nouvelle-image] --variant [Standard|Fixed]

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). Cette commande fonctionne pour tous les formats d'images supportés par VirtualBox (VDI, VMDK, VHD, ...). Vous pouvez d'ailleurs la compléter avec l'option --format [VDI|VMDK|VHD] pour changer le format de l'image de sortie.

De plus, si vous convertissez votre disque virtuel vers le format VDI en mode dynamique, vous pouvez ensuite optimiser la taille de l'image disque pour tenter de récupérer de l'espace supplémentaire sur la machine hôte, ou encore augmenter (mais pas réduire) sa capacité maximale en utilisant la commande suivante :

VBoxManage modifyhd [image] --resize [megaoctets]

Pour terminer, il ne vous reste plus qu'à reconfigurer les machines virtuelles connectées à l'ancienne image pour qu'elles utilisent désormais l'image clonée (via le panneau Configuration/Stockage de VirtualBox), puis à supprimer le disque virtuel original après avoir vérifié que tout fonctionne correctement.

Virtualbox

VirtualBox - Compacter une image disque VDI dynamique

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.