VMware ESXi 6.0: Eteindre proprement les VM lorsqu'on appuie sur le bouton Power de l'hôte

De Pegasus45

Lorsque les VM sont en "Démarrage automatique" ou en "Tout ordre", ces VM sont correctement arrêtées lorsqu'on appuie sur le bouton Power de l'hôte ESXi:

Esxi6 power status.png

Par contre, les VM qui sont en "Démarrage manuel", ces VM seront éteintes brutalement, comme si on débranche la câble d'alimentation.


Voici ma solution pour les éteindre proprement aussi. Elle consiste à remplacer la commande "/bin/poweroff" par mon script, qui va arrêter proprement les VM actives, puis de lancer la commande poweroff.


Lorsque l'ESXi s'arrête, celui-ci exécute la commande "/bin/poweroff" qui est un lien symbolique vers "/usr/lib/vmware/busybox/bin/busybox":

Command
[root@esx1:~] ls -l /bin/poweroff
lrwxrwxrwx    1 root     root            72 Dec 30 08:27 /bin/poweroff -> /usr/lib/vmware/busybox/bin/busybox


Premièrement, on va faire en sorte de refaire le lien symbolique pour qu'il pointe vers mon script. Pour cela, on ajoute les commandes suivantes dans "/etc/rc.local.d/local.sh" pou qu'elles soient exécutées à chaque boot. En effet, le lien symbolique est remis à son état par défaut (vers busybox) à chaque boot:

Configuration File vi /etc/rc.local.d/local.sh
[...]
# Renvoi poweroff vers le script qui va arreter les VM proprement
rm /bin/poweroff
ln -s /vmfs/volumes/57791f52-3776fa0f-d0e8-386077ac9315/scripts/shutdown-vm.sh /bin/poweroff

exit 0

Le GUID est celui du disque local de l'ESXi.


Ensuite, on ajoute mon script:

Configuration File vi /vmfs/volumes/57791f52-3776fa0f-d0e8-386077ac9315/scripts/shutdown-vm.sh
#!/bin/sh

# List all VMs
listVMs=$(vim-cmd  vmsvc/getallvms | cut -d ' ' -f1 | grep -v Vmid)

for VM in ${listVMs}
do
        # Regarde l'etat de la VM
        vim-cmd vmsvc/power.getstate ${VM} | grep 'Powered on' 1>/dev/null
        if [ $? -eq 0 ]
        then
                # La VM est allume. Donc, on l'arrete
                vim-cmd vmsvc/power.shutdown ${VM}

                # Attend que la VM est bien arretee
                for nbAttend in $(seq 1 10)
                do
                        vim-cmd vmsvc/power.getstate ${VM} | grep 'Powered on' 1>/dev/null
                        if [ $? -eq 0 ]
                        then
                                /bin/sleep 5
                        else
                                break
                        fi
                done
        fi
done


/bin/sleep 30

# On remet le lien pour poweroff
rm /bin/poweroff
ln -s /usr/lib/vmware/busybox/bin/busybox /bin/poweroff
/bin/poweroff


On le rend exécuable:

Command
chmod +x /vmfs/volumes/57791f52-3776fa0f-d0e8-386077ac9315/scripts/shutdown-vm.sh


On reboote et on peut voir que le lien symbolique a été refaite:

Command
[root@esx1:~] ls -l /bin/poweroff
lrwxrwxrwx    1 root     root            72 Dec 30 08:27 /bin/poweroff -> /vmfs/volumes/57791f52-3776fa0f-d0e8-386077ac9315/scripts/shutdown-vm.sh


A partir de maintenant, même les VM en "Démarrage manuel" seront éteintes proprement.