Logo

Gestion d'un onduleur sous Linux

Quick-howto sur la gestion correcte d'un onduleur sous Linux.

Contexte: appareil de marque Eaton connecté en USB à un serveur Ubuntu 24.04.

Préparation

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
(...)
Script d'arrêt du système

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
Note

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.

Fichiers de configuration de l'UPS

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
Notes

- Penser à remplacer mot_de_passe.

- monuser est un utilisateur interne à nut, il n'est pas nécessaire de créer un compte Linux.

Prise en compte de la conf
# systemctl restart nut-driver
# systemctl restart nut-server
# systemctl restart nut-monitor
Commandes utiles
# upsc eatonups | less
# upsc eatonups 2>/dev/null |grep -E "battery.charge:|ups.status"
# upscmd -l eatonups
# upsrw eatonups
Vérification

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"'
Note

Le message "Init SSL without certificate database" peut être ignoré.

Script d'arrêt des VM

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

Cet article a été généré par un humain