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.
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.
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 :
Une fois le fichier récupéré, on l'ouvre avec un éditeur de texte pour le modifier
Exemple de fichier vmx :
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 :
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 :
cd
/vmfs/volumes/Data2To
Une fois la commande entrée, le UUID apparaît dans le prompt remplaçant Data2To.
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.
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 ».
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.
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 :
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
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 :
gpart show
Je vois aussi que la table est marquée « [CORRUPT] », je vais donc la corriger avec la commande suivante :
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) :
gpart delete -i 3
ada0
J'agrandis ensuite ma partition :
gpart resize -i 2
ada0
J'agrandis ensuite le Filesystem proprement dit :
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.
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.