ESX / VM Linux : libérer de l’espace disque (thin provisining)

Je viens de faire quelques tests, et il est possible de récupérer de l’espace disque quand on supprime des fichiers sur une VM Linux dont le disque est en thin provisioning.

Bref, je vois deux solutions :
– Si on peut utiliser storage vMotion, et qu’on a deux datastore, super, on va pouvoir le faire online !
– Si on n’a pas la licence qui va bien pour vmotion, on doit le faire offline…

L’idée générale, c’est de créer un gros fichier rempli de zéros, de la taille que l’on veut gagner, que vmware va reconnaître lors de la migration : il va remplacer les zéros contigus par du vide. Ensuite, on migre le disque d’un datastore à un autre (important, sinon ça ne fait rien), on sélectionne thin provisioning pour le format du disque, et hop on gagne de la place. Reste ensuite à re-migrer le disque vers son datastore d’origine.
Evidemment, lors de la création du gros fichier rempli de zéros, on va occuper encore plus de place sur le datastore, c’est donc à prévoir…

Un petit exemple :
J’ai un vmdk thin, avec 20 Go réellement occupés par des fichiers sur 100 Go disponibles. Par le passé, j’ai rempli mon disque, donc le vmdk va occuper en réalité environ 100 Go sur le vmfs. Quand j’ai voulu supprimer ces fichiers, évidemment j’ai gagné de la place à l’intérieur de la VM, mais le vmdk occupe toujours ses 100 Go…
Je regarde mon espace disque avec df -h ; je constate qu’il me reste 80 Go de libre sur mon système de fichiers. Attention, si il y a plusieurs partitions, il faudra peut-être créer des fichier « zero » un peu partout, mais en général c’est à faire là où se trouvent les datas…
Je vais donc créer un gros fichier de 75 Go environ (histoire de pas saturer le serveur en prod…), rempli de zéros, et le supprimer.
# dd if=/dev/zero of= bigZeroedFile bs=1M count=75000
# sync
# rm bigZeroedFile

Ensuite, sous vcenter, je migre ma VM en la changeant de datastore (offline, ou online si on est riche !). Je constate que j’ai libéré plein de place \o/. Ensuite je la re-migre vers le datastore d’origine.
Pfiou…

Autre possibilité, si on ne craint pas de saturer le disque (à ne pas faire sur un Zimbra !), on peut tout simplement créer un fichier qui va occuper tout l’espace libre, en remplaçant la commande dd par un cat, qui s’arrêtera lorsque le disque sera plein.
# cat /dev/zero > bigZeroedFile
# sync
# rm bigZeroedFile

Cette méthode a l’avantage de libérer tout l’espace disque lors de la migration, mais si le système tente d’écrire un fichier de travail pendant ce temps là, on risque l’explosion… La méthode dd permet de conserver une marge de manœuvre.
J’ai aussi vu qu’il existait un outil appelé zerofree, qui a le même fonctionnement que sdelete sous Windows, mais il faut l’utiliser sur un système de fichiers en lecture seule, ce qui complique encore pas mal les choses…

Et si on n’a qu’un seul datastore ?!
Et bien apparemment, on peut utiliser cette commande, guest arrêté, pour duplique le disque :
vmkfstools -i test_thin_linux.vmdk test_thin_linux_thinned.vmdk -d thin
Mais chez moi, ça ne marche pas… le disque ne rétrécit pas…

Je suis d’ailleurs surpris : apparemment, c’est tout aussi galère à faire sous Windows : l’option « shrink » dans les vmtools n’apparaît pas quand le disque virtuel est en thin provisioning (c’est à se demander à quoi elle sert… J’ai vérifié de mon côté, je ne peux pas shrinker un disque virtuel sous Windows quand le disque est en fomat thin. Par contre, quand il est en format thick, j’ai l’option, mais je ne vois pas trop à quoi elle sert, du coup…).
Peut-être que shrinker un disque thick, ça sert à faire des backups plus lights ?
Sous windows, on me souffle qu’il faut faire la même manip, mais avec sdelete -c à la place de dd ?!

Leave a Reply

Your email address will not be published.