1. Introduction

Je me suis trouvé confronté à la nécessité d'ajouter de l'espace disque sur une VM dans un serveur ESXi suite à augmentation exponentielle de l'espace de stockage pour une VM. J'ai donc ajouté deux disques montés en RAID 1 matériel et fait en sorte d'affecter l'espace supplémentaire dans les VM de mon choix.

2. Processus

Pour pouvoir augmenter l'espace disque, il faut effectuer les étapes suivantes :

  • ajout physique du ou des disques supplémentaires ;
  • ajout du disque dans VMWare ;
  • création d'un datastore ;
  • arrêt des VM à déplacer ;
  • renommage des VM à déplacer (ajout « old » dans le nom) ;
  • copie des VM dans le nouveau datastore ;
  • modification des chemins des VM ;
  • démarrage puis arrêt des VM copiées pour test ;
  • agrandissement VMDK de la ou des VM à agrandir ;
  • agrandissement Filesystem à partir de la VM (Windows 2008 Server dans mon cas) ;
  • suppression des anciennes VM après quelques jours.

3. Ajout du ou des disques supplémentaires

Une fois toutes les VM arrêtées, on arrête le serveur par le bouton de droite sur l'adresse IP du serveur depuis l'interface VSphere.

Cette étape n'est pas indispensable si vous utilisez des disques Hotplug (dans un serveur compatible avec cette technologie), et que vous ne devez pas configurer de RAID matériel.

4. Ajout des disques dans VMWare

Les disques ne vont pas être vus automatiquement. Il va falloir les « monter ». Pour ceci, une fois avoir sélectionné le serveur dans VSphere (en cliquant sur son adresse IP), il faut cliquer dans l'onglet configuration,puis dans la partie gauche stockage, et enfin onglet périphérique comme montré sur la copie d'écran ci-dessous.

Image non disponible
Disques

Si le disque nouvellement installé n'apparaît pas, il faut cliquer en haut à droite sur « réanalyser tout ».

Si le disque ne monte pas automatiquement, il suffit de cliquer le bouton de droite sur la ligne du disque concerné au niveau du mot non monté et de cliquer « monter ».

5. Formatage en VMFS

Le disque va devoir être formaté en VMFS, le Filesystem de VMWare. VSPhere m'a proposé automatiquement la création d'un datastore.

6. Copie des VM dans le nouveau datastore

Pour copier une VM d'un datastore à un autre, il suffit de copier le contenu de son dossier dans un dossier du datastore de destination.

Pour simplifier la copie, j'ai ouvert une fenêtre source en ouvrant une fenêtre du datastore de la VM d'origine et une fenêtre destination sur le nouveau datastore comme sous la fenêtre ci-dessous.

Le seul handicap de cette manœuvre est le temps de copie, proportionnel à la taille de la VM.

Image non disponible
Ouverture datastore

La copie de VM ne suffira pas à rendre celle-ci opérationnelle, comme nous allons le voir ci-dessous.

7. Modification chemins des VM dans le fichier vmx

Le chemin du ou des fichiers .vmdk n'est plus valide dans la ou les VM copiées. Pour le mettre à jour, il faut modifier le fichier .vmx. Il faut commencer par le télécharger en local, il n'est pas modifiable depuis VSphere.

Pour le télécharger, il faut cliquer sur l'icône suivante :

Image non disponible

Une fois le fichier récupéré, on l'ouvre avec un éditeur de texte pour le modifier

Exemple de fichier vmx :

 
Sélectionnez
encoding = "UTF-8"
config.version = "8"
virtualHW.version = "8"
pciBridge0.present = "TRUE"
pciBridge4.present = "TRUE"
pciBridge4.virtualDev = "pcieRootPort"
pciBridge4.functions = "8"
pciBridge5.present = "TRUE"
pciBridge5.virtualDev = "pcieRootPort"
pciBridge5.functions = "8"
pciBridge6.present = "TRUE"
pciBridge6.virtualDev = "pcieRootPort"
pciBridge6.functions = "8"
pciBridge7.present = "TRUE"
pciBridge7.virtualDev = "pcieRootPort"
pciBridge7.functions = "8"
vmci0.present = "TRUE"
hpet0.present = "TRUE"
nvram = "infra_bd.nvram"
virtualHW.productCompatibility = "hosted"
powerType.powerOff = "soft"
powerType.powerOn = "hard"
powerType.suspend = "hard"
powerType.reset = "soft"
displayName = "infra_bd"
extendedConfigFile = "infra_bd.vmxf"
numvcpus = "8"
cpuid.coresPerSocket = "4"
scsi0.present = "TRUE"
scsi0.sharedBus = "none"
scsi0.virtualDev = "lsisas1068"
memsize = "6144"
scsi0:0.present = "TRUE"
scsi0:0.fileName = "/vmfs/volumes/54ba0a72-cf7ca16c-a81c-d067e5f9396c/infra propre/infra propre-000010.vmdk"
scsi0:0.deviceType = "scsi-hardDisk"
ide1:0.present = "TRUE"
ide1:0.clientDevice = "FALSE"
ide1:0.deviceType = "atapi-cdrom"
ide1:0.startConnected = "FALSE"
ethernet0.present = "TRUE"
ethernet0.virtualDev = "e1000"
ethernet0.networkName = "CFA"
ethernet0.addressType = "generated"
disk.EnableUUID = "TRUE"
guestOS = "windows7srv-64"
uuid.location = "56 4d 64 24 c2 00 8f 86-32 89 92 68 db c4 01 1c"
uuid.bios = "56 4d 64 24 c2 00 8f 86-32 89 92 68 db c4 01 1c"
vc.uuid = "52 90 85 76 d4 98 c9 b5-13 03 ca 93 f9 da 50 da"
ethernet0.startConnected = "TRUE"
ethernet0.generatedAddress = "00:0c:29:c4:01:1c"
usb.present = "TRUE"
svga.vramSize = "16777216"
vmci0.id = "-607911652"
tools.syncTime = "FALSE"
cleanShutdown = "TRUE"
migrate.hostlog = "./infra_bd-0921df52.hlog"
replay.supported = "FALSE"
unity.wasCapable = "FALSE"
ehci.present = "TRUE"
sched.swap.derivedName = "/vmfs/volumes/54ba0a72-cf7ca16c-a81c-d067e5f9396c/infra_bd/infra_bd-0921df52.vswp"
replay.filename = ""
scsi0:0.redo = ""
pciBridge0.pciSlotNumber = "17"
pciBridge4.pciSlotNumber = "21"
pciBridge5.pciSlotNumber = "22"
pciBridge6.pciSlotNumber = "23"
pciBridge7.pciSlotNumber = "24"
scsi0.pciSlotNumber = "160"
ethernet0.pciSlotNumber = "32"
vmci0.pciSlotNumber = "33"
usb.pciSlotNumber = "34"
ehci.pciSlotNumber = "35"
scsi0.sasWWID = "50 05 05 64 c2 00 8f 80"
ethernet0.generatedAddressOffset = "0"
hostCPUID.0 = "0000000b756e65476c65746e49656e69"
hostCPUID.1 = "000206c220200800029ee3ffbfebfbff"
hostCPUID.80000001 = "0000000000000000000000012c100800"
guestCPUID.0 = "0000000b756e65476c65746e49656e69"
guestCPUID.1 = "000206c200040800829822031febfbff"
guestCPUID.80000001 = "00000000000000000000000128100800"
userCPUID.0 = "0000000b756e65476c65746e49656e69"
userCPUID.1 = "000206c220200800029822031febfbff"
userCPUID.80000001 = "00000000000000000000000128100800"
evcCompatibilityMode = "FALSE"
vmotion.checkpointFBSize = "33554432"
ide1:0.fileName = "/vmfs/devices/cdrom/mpx.vmhba0:C0:T0:L0"
usb:1.present = "TRUE"
usb:1.speed = "2"
usb:1.deviceType = "hub"
usb:1.port = "1"
usb:1.parent = "-1"
sched.cpu.min = "2002"
sched.cpu.units = "mhz"
sched.cpu.affinity = "all"
sched.mem.min = "3082"
sched.mem.affinity = "all"
sched.cpu.shares = "high"
checkpoint.vmState.readOnly = "FALSE"
checkpoint.vmState = ""
mem.hotadd = "TRUE"
vmci0.unrestricted = "TRUE"
svga.autodetect = "TRUE"
floppy0.present = "FALSE"
usb_xhci.present = "FALSE"
usb.autoConnect.device0 = ""
usb_xhci.pciSlotNumber = "-1"
usb.autoConnect.device1 = ""
usb_xhci.autoConnect.device0 = ""
usb_xhci.autoConnect.device1 = ""
usb:0.present = "TRUE"
usb:0.deviceType = "hid"
usb:0.port = "0"
usb:0.parent = "-1"

Il va falloir changer le chemin d'accès de tous les liens tel que :

 
Sélectionnez
sched.swap.derivedName = "/vmfs/volumes/54ba0a72-cf7ca16c-a81c-d067e5f9396c/infra_bd/infra_bd-0921df52.vswp"

C'est le UUID qu'il faut changer. Pour trouver le nouveau UUID, on ouvre une console ssh, on rentre dans le dossier correspondant au datastore exemple ci-dessous avec un datastore nommé Data2To :

 
Sélectionnez
cd /vmfs/volumes/Data2To

Une fois la commande entrée, le UUID apparaît dans le prompt remplaçant Data2To.

Image non disponible
Console SSH

Un simple chercher/remplacer après avoir copié l'UUID depuis la console suffira pour modifier le fichier .vmx.

Une fois celui-ci modifié, on le dépose dans le nouveau datastore.

Image non disponible

8. Test de la ou des nouvelles VM.

Avant de pouvoir tester une VM modifiée comme expliqué précédemment, il faut la faire lister dans la liste des VM. Pour cela, il suffit de cliquer le bouton de droite sur le fichier .vmx et de sélectionner « Ajouter à l'inventaire ».

Lors du premier démarrage, une boite de dialogue demandant si la VM a été déplacée ou copiée apparaît. Il faut bien évidemment sélectionner « copiée ».

9. Agrandissement VMDK

Il faut maintenant agrandir le disque image (VMDK). Pour cela, il faut sélectionner la VM, aller dans l'onglet résumé, puis sélectionner propriété de la machine virtuelle. En sélectionnant la ligne correspondant au disque, on a accès à la droite de la zone « Provisionnement disque ».

Image non disponible
Taille disque

Attention, si vous avez plusieurs VMDK, veillez à sélectionner celui contenant le volume que vous souhaitez agrandir. Vous pouvez bien sûr agrandir plusieurs fichiers VMDK.

10. Agrandissement Filesystem

Il faudra agrandir autant de Filesystem que de volumes impactés.

10-1. Cas Windows

Pour agrandir un Filesystem NTFS, cela se fait à chaud depuis le gestionnaire de disques (accessible depuis ordinateur->gérer->stockage->gestion des disques). Il suffit de cliquer le bouton de droite sur le volume à agrandir et sélectionner étendre. L'opération est quasi instantanée.

Image non disponible
Étendue volume

Cette opération peut aussi être effectuée en ligne de commande avec diskpart.

La partition et l'espace libre doivent être contigus. Si ce n'est pas le cas, il doit être possible d'utiliser des outils spécialisés (qui vont déplacer les données).

10-2. Cas Linux 

Il faut changer la taille de la partition, puis agrandir le Filesystem. Gparted le fera très bien, mais le système doit être démonté.

Il est possible de le faire à chaud sur un système monté avec LVM (Logical Volume Management).

Avec l'utilisation de LVM, il suffit de créer un nouveau disque virtuel dans le datastore, de l'attacher à la VM souhaitée, puis de l'intégrer dans le LV (Logical Volume). Avant ceci, il faudra créer une partition LVM (type 0x8e). Les Filesystem ext2, ext3, et ext4 pourront être redimensionnés à chaud une fois le volume logique étendu avec la commande resize2fs. (Sans paramètres, resize2fs étendra le Filesystem à la taille de la partition.)

Pour les partitions ext2 et ext3, il est recommandé de démonter celles-ci avant modification de la taille.

10-3. Cas FreeBSD

Une fois l'agrandissement du VMDK, dans le système, j'utilise la commande :

 
Sélectionnez
df -h

L'option « -h » permet d'afficher le résultat de façon plus lisible. Dans l'image ci-dessous, on peut voir que ma partition / fait 8Go (7,3 exactement). Je peux voir aussi que le nom du device est /dev/ada0p2

Image non disponible

Même en ne connaissant pas FreeBSD, il est facile de comprendre que p2 de /dev/ada0p2 correspond à la partition numéro 2. C'est explicite sur l'image suivante.

La commande suivante va me permettre de voir les partitions :

 
Sélectionnez
gpart show
Image non disponible

Je vois aussi que la table est marquée « [CORRUPT] », je vais donc la corriger avec la commande suivante :

 
Sélectionnez
gpart revover ada0

Je démarre ensuite sur CD-ROM, puis enlève la partition de swap (partition 3 comme vu sur l'image précédente) :

 
Sélectionnez
gpart delete -i 3 ada0

J'agrandis ensuite ma partition :

 
Sélectionnez
gpart resize -i 2 ada0
Image non disponible

J'agrandis ensuite le Filesystem proprement dit :

 
Sélectionnez
growfs ada0p2

Il y a demande de confirmation comme on peut le voir sur l'image suivante.

Je redémarre ensuite le système.

En réutilisant la commande df -h, je peux voir que ma partition est passée à 20 Go.

Image non disponible

Dans cet exemple, je n'ai pas recréé de partition swap. J'aurais dû pour cela resizer ma partition en laissant un espace pour le swap, ou utiliser un swapfile.

11. Effectuer l'opération plus facilement et à chaud

Il est possible d'effectuer cette opération plus facilement en utilisant Storage vMotion. Ceci permet de déplacer à chaud les fichiers VMDK d'un espace de stockage à un autre. Ce produit n'est pas disponible gratuitement.

Une fois les vmdk déplacés, il sera nécessaire d'arrêter les VM de façon à agrandir ceux-ci ou d'ajouter des fichiers vmdk supplémentaires à la ou les VM. Pour agrandir les Filesystem, les mêmes règles que vues précédemment seront à appliquer.

12. Conclusion

Cette étape sera tôt ou tard nécessaire sur un serveur. Cette opération peut aussi être l'occasion de remplacer un serveur vieillissant ou devenu insuffisant. Dans le cadre d'une opération automatique, il serait possible d'utiliser vMotion, qui lui permet de migrer à chaud des VM d'une machine physique à une autre sous réserve que les vmdk se trouvent sur un SAN ou NAS.

Il devrait être possible d'appliquer ce tutoriel pour déplacer des VM arrêtés d'un serveur ESX à un autre via VSPhere, mais la copie des fichiers d'une machine à l'autre via le réseau peut représenter un temps considérable. Ce point peut peut-être être contourné via l'utilisation de snapshots. Il faudra alors modifier les chemins tel que vu au chapitre#7.Modification chemins des VM dans le fichier vmx|outlineModification chemins des VM dans le fichier vmx c'est délicat et je ne l'ai pas testé, mais vMotion crée des snapshots pour effectuer le travail.

12-1. Remerciements

Je remercie Viduc pour sa relecture technique.

Je remercie Claude LELOUP pour sa relecture orthographique.