Quick-howto sur la gestion correcte d'un onduleur sous Linux.
Contexte: appareil de marque Eaton connecté en USB à un serveur Ubuntu 24.04.
Installer les pré-requis:
# apt install nut nut-client
Vérifier que l'onduleur est bien vu par le système:
# lsusb
(...)
Bus 001 Device 030: ID 0463:ffff MGE UPS Systems UPS
(...)
Faire un script qui attend 120 secondes puis arrête le système en cas de coupure de courant. Par exemple:
# vi /usr/local/bin/arret_onduleur.sh
#!/bin/bash
logger "Coupure de courant - arrêt programmé dans 2 minutes"
sleep 120
# Check si le courant est reviendu
status=$(upsc eatonups | grep "status:")
if echo "$status" | grep -q "OL"; then
logger "Le courant est revenu, annulation de l'arrêt"
exit 0
fi
logger "Arrêt du système pour cause de coupure de courant"
shutdown -h now
# chmod +x /usr/local/bin/arret_onduleur.sh
nut possède des mécanismes natifs permettant de gérer les réactions à des événements et des seuils:
LOWBATT
ONBATT
HOSTSYNC
DEADTIME
MINSUPPLIES
FINALDELAY
Dans ce script on utilise un délai fixe avant arrêt, ce qui est un choix afin d'absorber les microcoupures plutôt que de laisser nut décider selon les seuils de batterie.
A adapter selon la configuration:
# cat >> /etc/nut/ups.conf <<EOF
[eatonups]
driver = usbhid-ups
port = auto
desc = "Onduleur EATON 800VA"
EOF
# cat >> /etc/nut/nut.conf <<EOF
MODE=standalone
EOF
# cat >> /etc/nut/upsd.conf <<EOF
LISTEN 127.0.0.1 3493
EOF
# cat >> /etc/nut/upsd.users <<EOF
[monuser]
password = mot_de_passe
upsmon master
EOF
# cat >> /etc/nut/upsmon.conf <<EOF
SHUTDOWNCMD "/usr/local/bin/arret_onduleur.sh"
MONITOR eatonups@localhost 1 monuser mot_de_passe master
EOF
- Penser à remplacer mot_de_passe.
- monuser est un utilisateur interne à nut, il n'est pas nécessaire de créer un compte Linux.
# systemctl restart nut-driver
# systemctl restart nut-server
# systemctl restart nut-monitor
# upsc eatonups | less
# upsc eatonups 2>/dev/null |grep -E "battery.charge:|ups.status"
# upscmd -l eatonups
# upsrw eatonups
Débrancher l'alimentation électrique du PC, puis:
# journalctl -xe | grep arret_onduleur
# watch -n 1 'upsc eatonups 2>/dev/null |grep -E "battery.charge:|ups.status"'
Le message "Init SSL without certificate database" peut être ignoré.
Si la machine fait tourner des VM, penser à mettre en place un mécanisme pour éviter un arrêt brutal. Par exemple:
$ cd ~/scripts
$ cat > shutdownall.sh <<EOF
#!/bin/bash
# Timeout (en secondes) pour attendre l'arrêt de chaque VM
TIMEOUT=60
echo "Arrêt des VMs libvirt en cours..."
# Lister les VMs en cours d'exécution
running_vms=$(virsh list --name | grep -v '^$')
# Boucle arrêt
for vm in $running_vms; do
echo " Arrêt de $vm"
virsh shutdown "$vm"
# Attente que la VM s'arrête, avec timeout
for i in $(seq 1 $TIMEOUT); do
if ! virsh domstate "$vm" | grep -q running; then
echo " $vm arrêtée proprement"
break
fi
sleep 1
done
# Forcer l'arrêt si la VM n'a pas répondu
if virsh domstate "$vm" | grep -q running; then
echo " $vm ne répond pas, arrêt forcé"
virsh destroy "$vm"
fi
done
echo "Toutes les VMs libvirt ont été arrêtées."
#end#
EOF
$ chmod +x shutdownall.sh
$ ln -s shutdownall.sh libvirt-shutdown-vms.sh
--
TG - 06/2026