Post

🔌đŸȘ«Onduleur 'Eaton Protection Station 800 USB'

🔌đŸȘ«Onduleur 'Eaton Protection Station 800 USB'

Onduleur “Eaton Protection Station 800 USB” sur serveur Debian pour protĂ©ger des Ă©quipements de coupure de courant et/ou de surtension pouvant intervenir lorsque les appareils sont en fonctionnement.

Onduleur Eaton Protection Station 800 USB

eaton

Matériel

No Eaton Protection Station - 650/800
7 4 prises filtrées.
8 4 prises secourues par batterie.
9 Voyant allumé, protection anti-surtensions active sur les 8 prises.
10 Voyant allumĂ©, dĂ©faut de l’Alimentation Sans Interruption.
11 Bouton de mise en service ou d’arrĂȘt des prises secourues.
12 Disjoncteur de protection.

Network UPS Tools (NUT)

Nut (Network UPS Tools) est un logiciel Linux de surveillance des onduleurs. Il est disponible sur la majoritĂ© des distributions et permet notamment, pour les onduleurs le supportant, d’automatiquement Ă©teindre proprement un serveur lorsque la batterie de l’onduleur arrive Ă  terme. Nous allons voir l’installation sur Debian.

NUT est un ensemble d’outils permettant de monitorer un systĂšme reliĂ© Ă  un ou des onduleurs.Il se compose de plusieurs Ă©lĂ©ments :

  • le dĂ©mon nut lancĂ© au dĂ©marrage du systĂšme
  • le dĂ©mon upsd qui permet d’interroger l’onduleur, il est lancĂ© sur le PC reliĂ© Ă  l’onduleur
  • le dĂ©mon upsmon qui permet de monitorer et lancer les commandes nĂ©cessaires sur le rĂ©seau ondulĂ© (arrĂȘt de machines 
)
  • diffĂ©rents programmes pour envoyer des commandes manuellement Ă  l’onduleur : upsc, upsdrvctl 


upsd peut communiquer avec plusieurs onduleurs si nécessaire.
upsmon interroge à intervalle régulier la machine du réseau sur laquelle est lancée upsd.

Installer NUT et branchement

Installez nut (et son éventuel besoin de dépendances) :

1
2
sudo apt update
sudo apt install nut -y

Connecter un cñble USB-B entre l’onduleur et un port USB du serveur.

Relever le périphérique :

1
lsusb

Exemple :

1
Bus 003 Device 002: ID 0463:ffff MGE UPS Systems UPS

Vérifier que le fichier appartient bien au groupe attendu (root: nut selon le systÚme) :

1
ls -l /dev/bus/usb/003/002

Résultat

1
crw-rw-r-- 1 root nut 189, 257 21 juil. 20:03 /dev/bus/usb/003/002

Détection + pilote : ups.conf

Le fichier /etc/nut/ups.conf dĂ©termine le driver et le port utilisĂ©s pour atteindre l’onduleur.

Le fichier /usr/share/nut/driver.list contient une liste d’onduleurs et le driver qu’il faut utiliser.

On peut aussi tester la commande nut-scanner -U :

1
sudo nut-scanner -U

Résultat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Cannot load SNMP library (libnetsnmp.so.40) : file not found. SNMP search disabled.
Cannot load XML library (libneon.so.27) : file not found. XML search disabled.
Cannot load IPMI library (libfreeipmi.so.17) : file not found. IPMI search disabled.
Scanning USB bus.
[nutdev1]
	driver = "usbhid-ups"
	port = "auto"
	vendorid = "0463"
	productid = "FFFF"
	product = "Protection Station"
	serial = "AN2E49008"
	vendor = "EATON"
	bus = "003"
	device = "002"
	busport = "002"
	###NOTMATCHED-YET###bcdDevice = "0100"

Si le driver usbhid-ups est dĂ©tectĂ©, on l’utilise. Exemple de configuration :

1
sudo nano /etc/nut/ups.conf

Ajouter ce bloc en fin de fichier :

1
2
3
4
5
6
[eaton]
  driver = usbhid-ups
  port = auto
  vendorid = 0463
  productid = FFFF
  desc = "Onduleur Eaton Protection Station 800"

Modifier nut-driver@eaton.service

CrĂ©er un lien pour l’exĂ©cutable upscmd

1
sudo ln -s /usr/bin/upscmd /usr/sbin/upscmd

Modifier le service

1
sudo systemctl edit --full nut-driver@eaton.service

Ensuite, remplace le contenu par une version propre

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[Unit]
Description=Network UPS Tools - device driver for %I
After=local-fs.target
PartOf=nut-driver.target

[Service]
Environment=NUT_IGNORE_NOWAIT=true
EnvironmentFile=-/etc/nut/nut.conf
SyslogIdentifier=%N
ExecStartPre=-/usr/bin/systemd-tmpfiles --create /usr/lib/tmpfiles.d/nut-common-tmpfiles.conf
ExecStart=/bin/sh -c 'NUTDEV="`/usr/libexec/nut-driver-enumerator.sh --get-device-for-service %i`" && [ -n "$NUTDEV" ] || { echo "FATAL: Could not find a NUT device section for service unit %i" >&2 ; exit 1 ; } ; exec /usr/sbin/upscmd'
ExecReload=/bin/kill -USR1 $MAINPID
ExecStop=/bin/sh -c 'NUTDEV="`/usr/libexec/nut-driver-enumerator.sh --get-device-for-service %i`" && [ -n "$NUTDEV" ] || { echo "FATAL: Could not find a NUT device section for service unit %i" >&2 ; exit 1 ; } ; /usr/sbin/upsdrvctl stop'
StartLimitInterval=0
Restart=always
RestartSec=15s
Type=forking

[Install]
WantedBy=nut-driver.target

Mais attention : en faisant un –full, tu remplaces aussi tout le contenu maintenu par le paquet. C’est plus fragile aux mises à jour qu’un simple override.

1
2
sudo systemctl daemon-reload
sudo systemctl restart nut-driver@eaton.service

Configuration daemon

Lancement via un service (nut.conf)

Le fichier /etc/nut/nut.conf dĂ©termine le comportement du dĂ©mon NUT. On utilise standalone car l’onduleur est reliĂ© Ă  la machine actuelle.

1
sudo nano /etc/nut/nut.conf

Mettre :

1
MODE=standalone

Activer et démarrer :

1
sudo systemctl enable nut-server --now

Vérification :

1
systemctl status nut-server --no-pager
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
● nut-server.service - Network UPS Tools - power devices information server
     Loaded: loaded (/usr/lib/systemd/system/nut-server.service; enabled; preset: enabled)
     Active: active (running) since Tue 2026-07-21 20:07:52 CEST; 14s ago
 Invocation: 631dc89a47014e92bef07621defc738c
    Process: 334424 ExecStartPre=/usr/bin/systemd-tmpfiles --create /usr/lib/tmpfiles.d/nut-common-tmpfiles.conf (code=exited, status=0/SUCCESS)
   Main PID: 334445 (upsd)
      Tasks: 1 (limit: 38029)
     Memory: 524K (peak: 1.8M)
        CPU: 29ms
     CGroup: /system.slice/nut-server.service
             └─334445 /lib/nut/upsd -F

juil. 21 20:07:52 alder nut-server[334445]: Found 1 UPS defined in ups.conf
juil. 21 20:07:52 alder nut-server[334445]: Running as foreground process, not saving a PID file
juil. 21 20:07:52 alder nut-server[334445]: upsnotify: notify about state 2 with libsystemd: was reques
out it
juil. 21 20:07:52 alder nut-server[334445]: upsnotify: failed to notify about state 2: no notification 
out it
juil. 21 20:07:52 alder nut-server[334445]: upsnotify: logged the systemd watchdog situation once, will
out it
juil. 21 20:07:52 alder upsd[334445]: Found 1 UPS defined in ups.conf
juil. 21 20:07:52 alder upsd[334445]: Running as foreground process, not saving a PID file
juil. 21 20:07:52 alder upsd[334445]: upsnotify: notify about state 2 with libsystemd: was requested, 
bout it
juil. 21 20:07:52 alder upsd[334445]: upsnotify: failed to notify about state 2: no notification tech 
bout it
juil. 21 20:07:52 alder upsd[334445]: upsnotify: logged the systemd watchdog situation once, will not 
bout it
Hint: Some lines were ellipsized, use -l to show in full.

Test NUT (indispensable avant upsmon/upssched)

Tester que NUT voit bien l’onduleur :

1
upsc eaton@localhost

Si upsc ne rĂ©pond pas ou ne trouve rien, corriger d’abord /etc/nut/ups.conf (driver/port) avant de continuer.

Utilisateurs (upsd.users)

DĂ©finir au moins un utilisateur “master” pour que les commandes d’arrĂȘt puissent fonctionner.

1
sudo nano /etc/nut/upsd.users

Exemple (Ă  adapter selon tes mots de passe) :

1
2
3
4
5
6
7
8
[admin]
    password = adminpass
    actions = SET
    instcmds = ALL

[upseaton]
    password  = userpass
    upsmon master

Moniteur automatique (upsmon.conf)

Le fichier /etc/nut/upsmon.conf configure l’état surveillĂ© et les commandes d’arrĂȘt.

Surveiller l’onduleur :

1
sudo nano /etc/nut/upsmon.conf

Remplacer/mettre un contenu similaire Ă  :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# Surveillance de l’onduleur directement reliĂ© (master)
MONITOR eaton@localhost 1 upseaton userpass master

# Notre serveur n'a pas d'alimentation redondante
MINSUPPLIES 1

# Commande lancĂ©e pour arrĂȘter proprement le systĂšme
SHUTDOWNCMD "/sbin/shutdown -h +0"

# Intervalles d’interrogation de upsd
POLLFREQ 5
POLLFREQALERT 5

# Temps d'attente pour la déconnexion des upsmon esclaves
HOSTSYNC 15

# Temps pendant lequel on tolĂšre l'absence (multiple de POLLFREQ)
DEADTIME 15

# Fichier d'état / déclencheur
POWERDOWNFLAG "/etc/killpower"

# OFFDURATION : mettre l’état OFF si cela persiste
OFFDURATION 30

# Notifications en cas de changement de batterie
RBWARNTIME 43200

# Délai avant notification de perte de communication
NOCOMMWARNTIME 300

# DĂ©lai avant action d’arrĂȘt suite notification
FINALDELAY 5

# Notifications via upssched
NOTIFYCMD /usr/sbin/upssched

# ÉvĂ©nements qui doivent dĂ©clencher upssched
NOTIFYFLAG ONLINE SYSLOG+EXEC
NOTIFYFLAG ONBATT SYSLOG+EXEC
NOTIFYFLAG LOWBATT SYSLOG+EXEC
NOTIFYFLAG COMMBAD SYSLOG+EXEC
NOTIFYFLAG COMMOK SYSLOG+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+EXEC

Distributeur d’évĂšnements (upssched.conf)

L’utilitaire upssched temporise les actions selon les Ă©vĂ©nements gĂ©nĂ©rĂ©s par upsmon.

1
sudo nano /etc/nut/upssched.conf

Exemple :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Script appelé par upssched pour exécuter les commandes
CMDSCRIPT /usr/bin/upssched-cmd
# ---- Ajouter ce qui suit -----
# Fichiers internes upssched
PIPEFN /run/nut/upssched/upssched.pipe
LOCKFN /run/nut/upssched/upssched.lock

# Perte de communication avec l’onduleur
AT COMMBAD * EXECUTE perte-liaison

# Retour secteur : on annule un timer et on notifie
AT ONLINE * CANCEL-TIMER attente-retour-secteur
AT ONLINE * EXECUTE charge-sur-secteur

# Passage sur batterie : on attend au maximum 20 minutes
AT ONBATT * START-TIMER attente-retour-secteur 1200
AT ONBATT * EXECUTE charge-sur-batterie

# Niveau de batterie trop bas
AT LOWBATT * EXECUTE batteries-vides

# Fin de vie batterie / événement de remplacement
AT REPLBATT * EXECUTE batteries-hs

# Quand on arrive Ă  l’arrĂȘt
AT SHUTDOWN * EXECUTE arret-en-cours

Prise en charge des évÚnements (script /usr/bin/upssched-cmd)

Créer le script /usr/bin/upssched-cmd :

1
sudo nano /usr/bin/upssched-cmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#! /bin/sh
. "/sharenfs/scripts/env/ntfy.env"

# Ce script doit ĂȘtre appelĂ© par upssched via la directive CMDSCRIPT.
#
# Analyse argument
#
case $1 in

  "charge-sur-batterie")
    sujet="L'onduleur a basculé sur les batteries"
    message="L'arrĂȘt systĂšme sera demandĂ© si le secteur ne revient pas."
  ;;

  "attente-retour-secteur")
    sujet="Onduleur - Fin d'attente de retour secteur"
    message="Cela fait trop longtemps que le secteur est absent... Un arrĂȘt forcĂ© est en cours !"

    # Demande d'arrĂȘt forcĂ©
    /sbin/upsmon -c fsd
  ;;

  "charge-sur-secteur")
    sujet="Onduleur - retour secteur"
    message="L'onduleur est revenu sur secteur."
  ;;

  "batteries-vide")
    sujet="Onduleur - Batteries vides"
    message="Les batteries sont vides, l'arrĂȘt est imminent."
  ;;

  "arret-en-cours")
    sujet="Onduleur - ArrĂȘt en cours du serveur"
    message="Le systĂšme est en cours d'arrĂȘt."
  ;;

  "perte-liaison")
    sujet="Onduleur - Perte de liaison avec l'onduleur"
    message="La communication avec l'onduleur est interrompue."
  ;;

  "batteries-hs")
    sujet="Onduleur - URGENT - batteries HS"
    message="Les batteries sont Ă  remplacer d'urgence."
  ;;

  *)
    sujet="Onduleur - Commande inconnue : $1"
    message="Une commande inconnue a été envoyée par l'onduleur..."
  ;;

esac


# Envoi d'une notification
curl -sS -X POST \
  -H "X-Email: $NTFY_EMAIL" \
  -H "Title: $sujet" \
  -H "Authorization: $NTFY_TOKEN" \
  -H "Priority: high" \
  -H "Tags: red_circle,warning" \
  -d "$message" \
  "$NTFY_URL"

Rendre le script exécutable (normalement exécutable par défaut) :

1
sudo chmod +x /usr/bin/upssched-cmd

Redémarrer et valider

Redémarrer NUT :

1
sudo systemctl restart nut-server

Vérifier que les daemons sont lancés :

1
ps auxf | grep ^nut
1
2
nut       333777  0.0  0.0  14208  2116 ?        Ss   20:06   0:00 /usr/lib/nut/usbhid-ups -a eaton
nut       348948  0.0  0.0   7580  3744 ?        Ss   20:42   0:00 /lib/nut/upsd -F

Onduleur connecté ?

upsc permet de s’adresser Ă  un dĂ©mon upsd.

1
2
# pour lister tous les onduleurs dĂ©tectĂ©s sur host ; si l’host n’est pas spĂ©cifiĂ©, c’est localhost.
upsc -L

Liste

1
2
Init SSL without certificate database
eaton: Onduleur Eaton Protection Station 800

Liste des paramĂštres

1
upsc eaton@localhost

Pour Ă©viter l’affichage du message “Init SSL without certificate database”, ajouter 2>&1 | grep -v '^Init SSL' Ă  la commande
Exemple: upsc eaton@localhost 2>&1 | grep -v '^Init SSL'

Pour afficher un paramĂštre

1
upsc eaton@localhost ups.status 2>&1 | grep -v '^Init SSL'

Définitions des codes renvoyés par ups.status

Abrégé Définition
OL En ligne (pas de coupure de courant) (Ă  l’opposĂ© de OB - sur batterie)
LB Batterie faible
SD Shutdown load, arrĂȘt en cours
CP Cñble d’alimentation
CTS Clear to Send. Reçu de l’UPS.
RTS Ready to Send. Envoyé par le PC.
DCD DĂ©tection de porteuse de donnĂ©es. Reçu de l’UPS.
RNG Ring indicateur. Reçu de l’UPS.
DTR Terminal de donnĂ©es prĂȘt. EnvoyĂ© par le PC.
ST Envoyer un BREAK sur la ligne de donnĂ©es d’émission

Tester l’envoi notification

Le plus simple est de dĂ©brancher la liaison USB entre l’onduleur et le serveur, puis de le rebrancher
Avant, il faut mettre le le journal en attente: sudo journalctl -u nut-monitor -f

Débranche le cùble USB et regarde si tu vois des lignes ONBATT, COMMBAD, et des messages liés à upssched.manpages.debian+2

À partir de là, la chaüne complùte sera :

  1. UPS change d’état → driver / upsd.
  2. upsmon reçoit l’évĂ©nement (COMMBAD, ONBATT, etc.).
  3. NOTIFYFLAG ... EXEC fait appeler NOTIFYCMD (upssched).
  4. upssched applique tes rĂšgles AT ... EXECUTE ... et appelle /usr/bin/upssched-cmd avec le bon argument.

Le journal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
juil. 21 21:30:05 alder systemd[1]: Starting nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller...
juil. 21 21:30:06 alder systemd[1]: Started nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller.
juil. 21 21:30:06 alder nut-monitor[368697]: fopen /run/nut/upsmon.pid: No such file or directory
juil. 21 21:30:06 alder nut-monitor[368697]: Could not find PID file to see if previous upsmon instance is already running!
juil. 21 21:30:06 alder nut-monitor[368697]: UPS: eaton@localhost (primary) (power value 1)
juil. 21 21:30:06 alder nut-monitor[368697]: Using power down flag file /etc/killpower
juil. 21 21:30:06 alder nut-monitor[368700]: Init SSL without certificate database
juil. 21 21:30:06 alder nut-monitor[368700]: upsnotify: notify about state 2 with libsystemd: was requested, but not running as a service unit now, will not spam more about it
juil. 21 21:30:06 alder nut-monitor[368700]: upsnotify: failed to notify about state 2: no notification tech defined, will not spam more about it
juil. 21 21:30:06 alder nut-monitor[368700]: upsnotify: logged the systemd watchdog situation once, will not spam more about it
juil. 21 21:30:31 alder nut-monitor[368700]: Poll UPS [eaton@localhost] failed - Data stale
juil. 21 21:30:31 alder nut-monitor[368700]: Communications with UPS eaton@localhost lost
juil. 21 21:30:31 alder nut-monitor[368893]: {"id":"nrna4Zx48qX2","time":1784662231,"expires":1784705431,"event":"message","topic":"yan_infos","title":"Onduleur - Perte de liaison avec l'onduleur","message":"La communication avec l'onduleur est interrompue.","priority":4,"tags":["red_circle","warning"]}
juil. 21 21:30:31 alder nut-monitor[368888]: Network UPS Tools upsmon 2.8.1
juil. 21 21:30:36 alder nut-monitor[368700]: Poll UPS [eaton@localhost] failed - Data stale
juil. 21 21:30:41 alder nut-monitor[368700]: Poll UPS [eaton@localhost] failed - Data stale
juil. 21 21:30:46 alder nut-monitor[368700]: Communications with UPS eaton@localhost established
juil. 21 21:30:46 alder nut-monitor[368970]: Network UPS Tools upsmon 2.8.1

scĂ©nario « perte de liaison » fonctionne comme prĂ©vu
Ce que montrent tes logs

  • Poll UPS [eaton@localhost] failed - Data stale + Communications with UPS eaton@localhost lost : c’est exactement l’évĂ©nement COMMBAD/COMMBAD que NUT dĂ©clenche quand le cĂąble USB est dĂ©branchĂ© ou que le driver ne voit plus l’UPS
  • Juste aprĂšs, on voit ton message JSON ntfy, ce qui veut dire que toute la chaĂźne fonctionne :
    driver → upsd → upsmon → upssched → upssched-cmd → notification ntfy.

À propos de « Data stale »
Les messages « Data stale » sont normaux quand on dĂ©branche l’USB : upsd marque les donnĂ©es comme pĂ©rimĂ©es, et upsmon le signale avant de dĂ©clarer la perte de communication.
On peut les considĂ©rer comme des logs techniques, ils n’indiquent pas un bug dansla config, juste la sĂ©quence normale de dĂ©connexion.

Tester le shutdown automatique

Pour tester le shutdown automatique en utilisant upsdrvctl, l’idĂ©e est de simuler exactement ce que ferait NUT en fin de coupure, mais de maniĂšre contrĂŽlĂ©e. On distingue deux choses : tester sans rĂ©ellement Ă©teindre l’UPS (mode test) et tester en vrai.

1. Ce que fait normalement NUT lors d’un shutdown

Avec ta config :

  • upsmon reçoit un Ă©vĂ©nement critique (souvent FSD ou LOWBATT).
  • Il crĂ©e le fichier POWERDOWNFLAG (par ex. /etc/killpower) et lance SHUTDOWNCMD "/sbin/shutdown -h +0".
  • Pendant la sĂ©quence d’arrĂȘt, un script d’init (typiquement le script nut ou Ă©quivalent de ta distro) vĂ©rifie la prĂ©sence de POWERDOWNFLAG et, si prĂ©sent, appelle :
1
upsdrvctl shutdown

Ce upsdrvctl shutdown est ce qui envoie la commande de coupure Ă  l’UPS (timer, arrĂȘt du relais, etc.).

L’objectif du test est de vĂ©rifier que :

  1. La machine s’éteint proprement quand NUT dĂ©clenche l’arrĂȘt.
  2. L’UPS coupe bien la sortie quand la sĂ©quence est complĂšte, et Ă©ventuellement se rallume quand le secteur revient.

2. Tester sans Ă©teindre rĂ©ellement l’UPS (mode test)

On peut d’abord voir ce que ferait upsdrvctl sans couper l’alimentation :

1
sudo upsdrvctl -t shutdown
  • L’option -t met upsdrvctl en mode test : il affiche les actions qu’il ferait (appel du driver avec -k, ordre de shutdown, etc.) mais ne les exĂ©cute pas.
  • Cela permet de vĂ©rifier que ta configuration ups.conf est correcte (sections, sdorder, etc.) sans risquer une coupure rĂ©elle.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*** Testing mode: not calling exec/kill/signal
   0.000000	[D2] 
If you're not a NUT core developer, chances are that you're told to enable debugging
to see why a driver isn't working for you. We're sorry for the confusion, but this is
the 'upsdrvctl' wrapper, not the driver you're interested in.

Below you'll find one or more lines starting with 'exec:' followed by an absolute
path to the driver binary and some command line option. This is what the driver
starts and you need to copy and paste that line and append the debug flags to that
line (less the 'exec:' prefix).

Alternately, provide an additional '-d' (lower-case) parameter to 'upsdrvctl' to
pass its current debug level to the launched driver, and '-B' keeps it backgrounded.

   0.000220	[D1] upsdrvctl commanding all drivers (1 found): (null)
   0.000228	[D1] Shutdown UPS: eaton
   0.000234	[D2] exec:  /usr/lib/nut/usbhid-ups -a eaton -k
   0.000237	[D1] upsdrvctl: successfully finished
   0.000242	[D1] Completed the job of upsdrvctl tool, cleaning up and exiting now
   0.000246	[D1] Completed the job of upsdrvctl tool, clean-up finished, exiting now

Si cette commande s’exĂ©cute sans erreur, la partie « dialogue avec le driver pour l’arrĂȘt » est correctement configurĂ©e.

3. Simuler la sĂ©quence complĂšte sans toucher Ă  l’UPS

Pour tester la logique NUT cĂŽtĂ© OS sans couper physiquement l’alimentation, tu peux :

  1. Lancer un FSD (Forced Shutdown) via upsmon :
    1
    
     sudo /usr/sbin/upsmon -c fsd
    

    Cette commande indicque Ă  l’instance upsmon qu’il doit dĂ©marrer la sĂ©quence de shutdown comme si la batterie Ă©tait critique.
    upsmon va gĂ©nĂ©rer l’évĂ©nement SHUTDOWN, attendre FINALDELAY, Ă©crire POWERDOWNFLAG et lancer ton SHUTDOWNCMD.

  2. VĂ©rifier que ta machine commence bien sa sĂ©quence d’arrĂȘt (shutdown -h +0).
  3. Sur certaines distributions, les scripts d’init vont dĂ©tecter POWERDOWNFLAG pendant l’arrĂȘt et appeler automatiquement upsdrvctl shutdown Ă  la fin.

Pour un test sec, tu peux :

  • Modifier temporairement SHUTDOWNCMD pour qu’il ne fasse qu’un echo ou un logger au lieu d’un vrai shutdown, histoire de voir la sĂ©quence sans que la machine s’éteigne.
  • Ou lancer upsmon -c fsd sur une machine de test.

4. Tester réellement le shutdown complet avec upsdrvctl

Quand tu seras prĂȘt Ă  tester « pour de vrai » :

  1. Assure-toi que ta machine peut redĂ©marrer sans intervention (BIOS/UEFI configurĂ© pour « Power on after AC restore » ou Ă©quivalent, si tu comptes sur l’UPS pour couper puis rĂ©tablir).
  2. Laisse NUT dĂ©clencher la sĂ©quence (par coupure secteur prolongĂ©e) ou force‑la avec :
    1
    
     sudo /usr/sbin/upsmon -c fsd
    
  3. Laisse l’OS suivre sa sĂ©quence d’arrĂȘt jusqu’au bout.
  4. VĂ©rifie que, dans les scripts d’arrĂȘt de ton systĂšme, l’appel Ă  upsdrvctl shutdown est bien prĂ©sent (souvent dans le script d’init de NUT) et qu’il se lance Ă  la toute fin. Tu peux, si besoin, ajouter toi‑mĂȘme dans un script d’arrĂȘt personnalisĂ© : ` if [ -f /etc/killpower ]; then /usr/sbin/upsdrvctl shutdown fi`

  5. Observe :
    • La machine doit s’éteindre proprement avant que la batterie soit vide.
    • L’UPS doit couper la sortie (souvent aprĂšs un dĂ©lai interne).
    • Au retour secteur, selon le modĂšle et ta config BIOS, la machine peut redĂ©marrer automatiquement.

      5. Ordre de test conseillé

Pour limiter les risques :

  1. Test sec : upsdrvctl -t shutdown pour valider la config drivers (aucune coupure).
  2. Test OS : upsmon -c fsd avec un SHUTDOWNCMD temporairement inoffensif, pour vérifier la logique NUT et la création de POWERDOWNFLAG.
  3. Test complet : remettre le vrai SHUTDOWNCMD, lancer upsmon -c fsd ou provoquer une vraie coupure longue, et vĂ©rifier que l’UPS coupe bien la sortie via upsdrvctl shutdown.

Liens

Cet article est sous licence CC BY 4.0 par l'auteur.