apcupsd.conf per Xen —
Xen Hypervisor: È un software open source che gestisce le risorse hardware a livello basilare, permettendo di eseguire più sistemi operativi isolati (macchine virtuali) sullo stesso computer fisico.
Maggiori dettagli sono disponibili sul sito ufficiale del Xen Project.
Chiaramente Xen è l’hypervisor che utilizziamo in azienda, la questione è nata quasi per amore di discussione ma si è poi palesata pesantemente solo qualche giorno dopo quando ENEL ha fatto una serie di “singhiozzi” che hanno mandato KO i nostri cluster.
Abbiamo quindi cominciato a studiare il sistema per far si che se va via la corrente apcupsd prima di spegnere il server fisico spenga nel modo più morbido ( o se non con le buone con le cattive) possibile le VM.
Se fin ora non era necessario capire come funzionava il demone ma ci siamo accontentati di accettare il funzionamento a scatola chiusa adesso la situazione era cambiata radicalmente se devo dirgli prima di fare shutdown fai questo e quell’altro o si capisce come gira il demone o non ne veniamo fuori.
Quindi dopo aver letto un “tot” di documentazione e aver interpellato Grok quando qualcosa on era chiaro o non molto chiaro, siamo arrivati a questa conclusione,
apcupsd.conf non fa nulla, imposta solo i parametri chi fa tutto è apccontrol che al suo interno ha una logica (molto semplificata) che dice sostanzialmente se all’interno della directory /etc/apcupsd/ c’è uno script personalizzato con lo stesso nome dell’evento lui esegue prima lo script personalizzato, se questo esce con codice 99 allora si ferma e non fa l’azione di default, se invece lo script esce con codice 0 o non trova lo script allora esegue l’azione di default, che detto così ha un senso ma è chiaro come una notte senza luna, un esempio o meglio la situazione che abbiamo applicato renderà il tutto molto più chiaro.
Modifichiamo apcupsd.conf in questo modo:
UPSCABLE usb
UPSTYPE usb
#DEVICE /dev/ttyS0
BATTERYLEVEL -1 ### disabilitato
MINUTES -1 ### disabilitato
TIMEOUT 300
quindi scriviamo in /etc/apcupsd lo script timeout che contiene:
#!/bin/bash echo “$(date) – TIMEOUT raggiunto (5 minuti su batteria)” >> /var/log/apcupsd-shutdown.log
# Esci 0 per lasciare che apccontrol continui e chiami doshutdown
exit 0
e lo script doshutdown che contiene:
#!/bin/bash
#
# Script di emergenza eseguito da apccontrol sull’evento doshutdown
# (dopo TIMEOUT secondi di mancanza di corrente)
# Gestisce correttamente anche le VM HVM senza PV driver grazie a -F
#
LOG=”/var/log/apcupsd-shutdown.log”
exec >> “$LOG” 2>&1
echo “==================================================”
echo “=== $(date) – Inizio spegnimento di emergenza ===”
echo “==================================================”
# 1. Uccide heartbeat su questo nodo
echo “→ Killing heartbeat…”
killall -9 heartbeat 2>/dev/null || true
# eventualmente anche heartbeatd se presente
killall -9 heartbeatd 2>/dev/null || true
# 2. Richiede lo spegnimento ordinato di tutte le VM
# -a = tutte le guest
# -F = fallback ad ACPI power button per le VM senza PV driver
echo “→ xl shutdown -a -F”
/usr/sbin/xl shutdown -a -F
# 3. Attende che le VM si spengano (max 3 minuti)
echo -n “→ Attendo spegnimento delle VM”
n=0
while [ $n -lt 180 ]; do
alive=$(/usr/sbin/xl list 2>/dev/null | awk ‘NR>2 {print $1}’ | wc -l)
if [ “$alive” -eq 0 ]; then
echo ” → tutte spente.”
break
fi
echo -n “.”
sleep 1
n=$((n + 1))
done
# Se dopo 3 minuti ci sono ancora VM, le elenca
if [ “$alive” -gt 0 ]; then
echo “”
echo “→ Ancora $alive VM attive dopo il timeout:”
/usr/sbin/xl list 2>/dev/null | awk ‘NR>1’
fi
# 4. Distrugge forzatamente le eventuali VM rimaste
echo “→ Controllo e destroy delle VM rimanenti…”
for name in $(/usr/sbin/xl list 2>/dev/null | awk ‘NR>2 {print $1}’); do
echo ” Destroying $name”
/usr/sbin/xl destroy “$name” 2>/dev/null || true
done
# Verifica finale
remaining=$(/usr/sbin/xl list 2>/dev/null | awk ‘NR>2 {print $1}’ | wc -l)
if [ “$remaining” -eq 0 ]; then
echo “→ Nessuna VM rimasta.”
else
echo “→ ATTENZIONE: ancora $remaining VM presenti!”
fi
# 5. Spegnimento del server
echo “→ Shutdown del nodo…”
/sbin/shutdown -h now “apcupsd: power failure timeout (5 min) – emergency shutdown”
echo “=== $(date) – Script terminato ===”
# Esci con 99 → apccontrol non esegue l’azione di default
exit 99
rendiamoli eseguibili con chmod 755 e rivediamo cosa succede:
apcupsd legge continuamente lo stato dell’UPS
va via la tensione apcupsd se ne accorge e verifica la condizione TIMEOUT=300
dopo 5 minuti apcupsd genera l’evento timeout
il demone qualunque sia l’evento chiama apccontrol ed esegue /etc/apcupsd/apccontrol <nome_evento> in questo caso quindi esegue /etc/apcupsd/apccontrol timeout, visto che esiste lo script timeout lui lo lancia
Dopo l’evento timeout, apcupsd genera automaticamente l’evento doshutdown e di conseguenza /etc/apcupsd/apccontrol doshutdown
il flusso visivamente risulta essere questo:
apcupsd.conf (TIMEOUT 300)
↓
apcupsd (demone) rileva timeout
↓
chiama → apccontrol timeout
↓
(dopo l’evento timeout) genera automaticamente
↓
chiama → apccontrol doshutdown
↓
se esiste → /etc/apcupsd/doshutdown
↓
se esce con 99 → si ferma
se esce con 0 → esegue shutdown -h now di default
testato una dozzina di volte ha funzionato bene e quindi lo abbiamo messo in produzione.
Categorised as: configurazioni | configurazioni | Linux | Work
Comments are disabled on this post