Réduire un VMDK

Rédigé par Alexandre le 2014-03-14

#travail

Suite à la migration en vSphere 5.5, je me suis aperçu que l'infrastructure de stockage était en sur-allocation. Même si la sur-allocation ne présente pas de problème, puisque représentant uniquement un espace disque alloué plus grand que celui disponible, je me suis lancé dans l'optimisation de l'espace de stockage.

vSphere 5.5 : sur-allocation d'un datastore

La suite vSphere, en version 4.1 du moins, ne permettait pas de réduire les disques virtuels (VMDK) sauf en passant par VMware Converter (fastidieux et austère). Depuis la version 5, il est possible de réduire un VMDK via la ligne de commande.

Identification

Avant toute chose, il faut bien faire attention sur quelle machine virtuelle on travaille et sur quel disque.
Pour les besoins de cet article, j'ai créé une machine virtuelle sous Debian 7 disposant de trois disques virtuels :

VM de démonstration

Ici, nous allons réduire le disque virtuel du système, il faut alors l'identifier ;quer sur Modifier les paramètres....

VMDK cible

Après avoir déroulé les détails du disque que l'on souhaite, il est nécessaire de noter, sur un papier par exemple, les choses suivantes :

  1. La taille du disque : valeur en face de Disque dur 1
  2. L'emplacement du disque : valeur de la section Disk file
  3. L'adresse du disque : la partie Virtual Device Node

Voilà ce que ça donne dans notre exemple :

  1. 10 Go
  2. [datastore_demo] vm-demo/vm-demo.vmdk
  3. SCSI(0:0) Disque dur 1

Préparatifs

Maintenant que ces informations ont été relevées, il faut préparer la machine virtuelle et plus particulièrement son système de fichiers. Cette étape dépend grandement du système d'exploitation invité, mais grosso-modo, pour Windows, il faut utiliser la console Computer Management, et pour Linux, personnellement, j'utilise SysRecueCD.
Si on souhaite réduire le VMDK de 10 Gio à 5, je recommande de réduire le système de fichier de l'invité à 4 Gio. Il sera possible de l'agrandir à 5 Gio une fois le VMDK réduit.

Bon, passons aux choses sérieuses :

  • Se connecter en SSH à l'hyperviseur
  • Se rendre dans le dossier regroupant les fichiers de la machine virtuelle
cd /vmfs/volumes/datastore_demo/vm-demo
  • Afficher le contenu
ls -la
total 14686224
drwxr-xr-x    1 root     root          2240 Feb 19 09:53 .
drwxr-xr-t    1 root     root          2240 Feb 19 09:54 ..
-rw------  -  1 root     root        655872 Feb 19 09:53 vm-demo-ctk.vmdk
-rw------  -  1 root     root     10737418240 Feb 19 09:53 vm-demo-flat.vmdk
-rw------  -  1 root     root          8684 Feb 19 09:53 vm-demo.nvram
-rw------  -  1 root     root           583 Feb 19 08:42 vm-demo.vmdk
-rw-r--r-  -  1 root     root             0 Feb 19 08:15 vm-demo.vmsd
-rwxr-xr-x    1 root     root          3267 Feb 19 09:53 vm-demo.vmx
-rw-r--r-  -  1 root     root           262 Feb 19 08:15 vm-demo.vmxf
-rw------  -  1 root     root         66048 Feb 19 09:53 vm-demo_1-ctk.vmdk
-rw------  -  1 root     root     1073741824 Feb 19 08:15 vm-demo_1-flat.vmdk
-rw------  -  1 root     root           530 Feb 19 08:15 vm-demo_1.vmdk
-rw------  -  1 root     root        197120 Feb 19 09:53 vm-demo_2-ctk.vmdk
-rw------  -  1 root     root     3221225472 Feb 19 08:15 vm-demo_2-flat.vmdk
-rw------  -  1 root     root           530 Feb 19 08:16 vm-demo_2.vmdk
-rw-r--r-  -  1 root     root        172570 Feb 19 09:53 vmware.log

Si vous avez un fichier vm-demo.vmx~, c'est que la machine virtuelle est en cours de fonctionnement ; il faut l'arrêter avant de continuer.
Bien que la liste soit assez conséquente, seulement deux fichiers nous intéressent :

  • vm-demo.vmdk (identifier sur nos notes de tout à l'heure) : contient la définition des propriétés du disque de la machine virtuelle
  • vm-demo-flat.vmdk : le disque qui contient les données de la machine virtuelle

Avant de commencer à bricoler, on va mettre les disques actuels au chaud ; encore une fois, la machine virtuelle doit être arrêtée !

mkdir origine
mv vm-demo.vmdk origine/vm-demo.vmdk
mv vm-demo-flat.vmdk origine/vm-demo-flat.vmdk

Tout ce qui est d'origine est maintenant dans le dossier éponyme. Nous allons cloner le descripteur avant de le modifier, afin de toujours pouvoir revenir en arrière :

cp origine/vm-demo.vmdk origine/vm-demo-new.vmdk

Réduire

La réduction passe tout d'abord par la modification du fichier de description du disque virtuel :

vi origine/vm-demo-new.vmdk

Le fichier ne contient pas énormément de lignes, et en plus, une seule est à modifier :

# Extent description
RW 20971520 VMFS "vm-demo-flat.vmdk"

La valeur 20971520 est la taille du disque de la VM que l'on obtient en Gio, soit en allant dans les propriétés de la machine virtuelle, soit en utilisant cette simple formule : taille = (valeur * 512) / (1024 * 1024 * 1024). Ok, mais nous on veut passer du Gigaoctet à cette valeur, heureusement les maths sont nos amies : valeur = (taille * 1024 * 1024 * 1024) / 512.

En gardant mon exemple de 5 Gio, la ligne de mon fichier ressemblera à ceci :

# Extent description
RW 10485760 VMFS "vm-demo-flat.vmdk"

Une fois le fichier enregistré, nous allons cloner le disque d'origine afin de créer un VMDK de la bonne taille ; pour se faire :

vmkfstools -i origine/vm-demo-new.vmdk vm-demo.vmdk
Destination disk format: VMFS zeroedthick
Cloning disk 'origine/vm-demo-new.vmdk'...
Clone: 50% done.

La commande rend le prompt sans atteindre les 100% et c'est tout à fait normal puisque le clone est plus petit que la cible : pourcentage = (100 * taille_voulue) / taille_actuelle.

Nettoyage

La machine virtuelle peut maintenant être redémarrée et testée.
Une fois les tests concluants, il n'y a plus qu'à supprimer le dossier origine :

rm -r origine/

Cette méthode a beau être relativement longue à exécuter, elle demeure plus rapide qu'en passant par VMware Converter.

Référence