Aller au contenu

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 nut sur Debian/Ubuntu.

1. Détecter l'onduleur

NUT fournit un scanner qui identifie l'onduleur et propose les paramètres de pilote :

nut-scanner -U

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

# L'hôte est à la fois serveur NUT et client local
MODE=netserver

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

LISTEN 127.0.0.1 3493
LISTEN ::1 3493

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és master / slave fonctionnent 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
chmod +x /etc/nut/notify-mail.sh

3. Sécuriser les fichiers

Ces fichiers contiennent des mots de passe : limitez leur accès à root et au groupe nut.

chown root:nut /etc/nut/*
chmod 640 /etc/nut/*
chmod 750 /etc/nut/notify-mail.sh

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

systemctl enable --now nut-server nut-monitor

Après toute modification de configuration :

systemctl restart nut-server nut-monitor
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 :

upsrw -s battery.charge.low=50 onduleur@localhost

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.

Références