NUT : gérer un onduleur (UPS) sous Linux
Mise à jour : 2026-10-19 | Non relu
NUT (Network UPS Tools) permet à un serveur Linux de dialoguer avec un onduleur (UPS, Uninterruptible Power Supply). L'objectif : quand une coupure de courant vide la batterie, le serveur s'éteint proprement avant la panne, évitant corruption de données et arrêt brutal. NUT peut aussi prévenir par mail à chaque événement (passage sur batterie, batterie faible, retour du secteur...).
Pourquoi un arrêt propre ?
Sans NUT, un serveur sur onduleur tient jusqu'à ce que la batterie soit vide, puis s'éteint brutalement, comme une coupure sèche : risque de corruption des systèmes de fichiers et des bases de données. NUT surveille le niveau de batterie et déclenche un arrêt ordonné tant qu'il reste assez d'énergie pour le faire.
Prérequis
- Un onduleur relié au serveur, en général par USB.
- Pour les notifications par mail : un serveur mail local (Postfix...) déjà configuré sur la machine.
- Les paquets NUT :
apt install nutsur Debian/Ubuntu.
1. Détecter l'onduleur
NUT fournit un scanner qui identifie l'onduleur et propose les paramètres de pilote :
Exemple de résultat (onduleur Eaton en USB) :
[nutdev1]
driver = "usbhid-ups"
port = "auto"
vendorid = "0463"
productid = "FFFF"
product = "Ellipse PRO"
serial = "XXXXXXXXXX"
vendor = "EATON"
bus = "003"
Notez le driver, le vendorid, le productid et le serial : ils serviront à la configuration. Le pilote usbhid-ups convient à la plupart des onduleurs USB récents.
2. Les fichiers de configuration
NUT se configure dans /etc/nut/. On va définir cinq fichiers, chacun avec un rôle précis.
nut.conf : le mode de fonctionnement
netserver signifie que le serveur pilote l'onduleur et se surveille lui-même. (Le mode standalone conviendrait si une seule machine était concernée, sans écoute réseau.)
ups.conf : décrire l'onduleur
# Eaton Ellipse PRO en USB
[onduleur]
driver = usbhid-ups
port = auto
vendorid = 0463
productid = FFFF
serial = XXXXXXXXXX
pollinterval = 15
Le nom entre crochets ([onduleur]) est l'identifiant de l'onduleur dans NUT. On le réutilisera partout ensuite (onduleur@localhost). Choisissez un nom simple et gardez-le cohérent dans tous les fichiers.
upsd.conf : l'écoute réseau
On limite l'écoute au localhost : aucun accès réseau extérieur n'est nécessaire si seul ce serveur est surveillé. C'est le réglage le plus sûr. (Pour superviser d'autres machines à distance, on écouterait sur l'adresse du réseau d'administration, jamais sur Internet.)
upsd.users : les comptes
[upsadmin]
password = METTRE_UN_MOT_DE_PASSE_FORT
actions = SET
actions = FSD
instcmds = ALL
upsmon primary
[upsuser]
password = METTRE_UN_AUTRE_MOT_DE_PASSE
upsmon secondary
upsadmin: compte d'administration, peut modifier des variables (SET), forcer un arrêt (FSD) et lancer toutes les commandes.upsuser: compte en lecture seule.primary/secondary: le primary est la machine directement reliée à l'onduleur, qui orchestre l'arrêt ; les secondary seraient d'autres serveurs alimentés par le même onduleur. Les anciens mots-clésmaster/slavefonctionnent encore (NUT 2.8 et suivants acceptent les deux), mais sont dépréciés.
Mots de passe en clair : protégez les fichiers
Les mots de passe sont écrits en clair dans ces fichiers. La section Sécurisation (plus bas) restreint leur lecture à root et au groupe nut. Utilisez des mots de passe forts et différents, et ne les laissez jamais dans une note ou un dépôt Git.
upsmon.conf : la surveillance et les notifications
# ----------- Surveillance -----------
RUN_AS_USER nut
MONITOR onduleur@localhost 1 upsadmin METTRE_UN_MOT_DE_PASSE_FORT primary
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h now"
POWERDOWNFLAG /etc/killpower
FINALDELAY 30
POLLFREQ 5
POLLFREQALERT 10
DEADTIME 25
HOSTSYNC 15
# ----------- Notifications -----------
NOTIFYCMD /etc/nut/notify-mail.sh
NOTIFYMSG ONLINE "UPS %s : retour sur secteur"
NOTIFYMSG ONBATT "UPS %s : passage sur batterie"
NOTIFYMSG LOWBATT "UPS %s : batterie faible"
NOTIFYMSG FSD "UPS %s : arret force en cours"
NOTIFYMSG COMMOK "Communication avec l'UPS %s retablie"
NOTIFYMSG COMMBAD "Communication avec l'UPS %s perdue"
NOTIFYMSG SHUTDOWN "Arret automatique en cours"
NOTIFYMSG REPLBATT "UPS %s : batterie a remplacer"
NOTIFYMSG NOCOMM "UPS %s injoignable"
NOTIFYMSG NOPARENT "Le processus upsmon parent est mort - arret impossible"
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
NOTIFYFLAG FSD SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC
NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT SYSLOG+WALL+EXEC
La ligne MONITOR relie upsmon à l'onduleur : son nom (onduleur@localhost), le nombre d'alimentations (1), le compte et le mot de passe de upsadmin, et le rôle primary.
Chaque NOTIFYMSG définit le texte d'un événement, et le NOTIFYFLAG correspondant indique quoi en faire : SYSLOG (journal), WALL (message aux utilisateurs connectés) et EXEC (exécuter NOTIFYCMD, ici l'envoi de mail).
Le déclenchement de l'arrêt
Quand l'onduleur signale LOWBATT (batterie faible, selon le seuil battery.charge.low de l'onduleur), upsmon lance SHUTDOWNCMD et envoie le mail. Le serveur s'éteint alors proprement, tant qu'il reste de la batterie.
notify-mail.sh : le script d'envoi de mail
Créez /etc/nut/notify-mail.sh (remplacez les adresses) :
#!/bin/bash
# /etc/nut/notify-mail.sh
# Usage : notify-mail.sh "Texte du message" (fourni par upsmon)
MSG="$1"
SUJET="[NUT] $MSG"
EXPEDITEUR="onduleur@domaine.fr"
DESTINATAIRES="admin@domaine.fr"
/usr/sbin/sendmail -oi -f "$EXPEDITEUR" $DESTINATAIRES <<EOF
Subject: $SUJET
Content-Type: text/plain; charset=US-ASCII
$MSG
--
Supervision onduleur (NUT)
EOF
exit 0
3. Sécuriser les fichiers
Ces fichiers contiennent des mots de passe : limitez leur accès à root et au groupe nut.
640 pour les configs, 750 pour le script
Les fichiers de configuration n'ont pas besoin d'être exécutables : 640 (lecture pour root et le groupe nut) suffit et est plus propre que 750. Le script notify-mail.sh, lui, doit être exécutable, d'où 750.
4. Activer et démarrer les services
Après toute modification de configuration :
Les deux services
nut-server (le démon upsd) expose les données de l'onduleur. nut-monitor (le démon upsmon) surveille l'état et déclenche l'arrêt. Les deux sont nécessaires sur la machine reliée à l'onduleur.
5. Tester et diagnostiquer
upsc onduleur@localhost # toutes les variables de l'onduleur en temps réel
upscmd -l onduleur@localhost # commandes instantanées disponibles
journalctl -u 'nut-*' -f # suivre les démons NUT en direct
upsc est la commande clé : elle affiche l'état de charge, l'autonomie estimée, la tension, le seuil de batterie faible... C'est le premier réflexe pour vérifier que NUT dialogue bien avec l'onduleur.
Tester les notifications et l'arrêt
# Simuler une perte de communication (déclenche COMMBAD, puis COMMOK au retour)
# Le plus simple et sans risque : débrancher le câble USB 40 secondes, puis le rebrancher.
# En ligne de commande (le pilote est géré par systemd depuis NUT 2.8) :
systemctl stop nut-driver@onduleur
sleep 40
systemctl start nut-driver@onduleur
# Simuler une batterie faible et l'arrêt (ATTENTION : déclenche un vrai arrêt)
upsmon -c fsd
La commande fsd éteint réellement le serveur
upsmon -c fsd (forced shutdown) déclenche la procédure d'arrêt réelle. Ne la lancez que sur une machine de test, ou en connaissance de cause pendant une fenêtre de maintenance. Pour vérifier les notifications sans éteindre, contentez-vous du test de perte de communication ci-dessus.
Ajuster le seuil de batterie faible
Le seuil battery.charge.low définit à quel pourcentage de charge l'onduleur signale LOWBATT, et donc quand le serveur s'éteint. Une valeur de 50 % garde une marge confortable pour un arrêt serein :
La commande demande le nom du compte (upsadmin) et son mot de passe. Vérifiez ensuite avec upsc onduleur@localhost battery.charge.low : certains onduleurs d'entrée de gamme ignorent la modification.