π Proxmox Cluster Check: Beter dan pvecm status?
Als homelab-beheerder dacht ik altijd dat ik de perfecte routine had voor het updaten en onderhouden van mijn Proxmox VE hosts. Ik werkte methodisch, voorzichtig en volgde alle best-practices. Wanneer een nieuwe Linux-kernel of beveiligingspatch een herstart vereiste, sloot ik handmatig en netjes elke virtuele machine (VM) en LXC-container op de node af. Ik wachtte tot ze volledig offline waren, voerde de herstart uit, controleerde of alles netjes opstartte en ging pas daarna door naar de volgende host. Ik dacht dat dit handmatige "node-voor-node" proces de ultieme veiligheidsgarantie was. Maar ik had het volledig mis.
π De update die mij in de val lokte
Tijdens een regulier onderhoudsvenster deed ik exact wat ik altijd deed. Ik stopte mijn workloads netjes en voerde een herstart uit via de terminal. Tot mijn grote schrik verloor mijn cluster onmiddellijk zijn stemmeerderheid (Quorum). VM's weigerden op te starten, configuratiebestanden sloegen op slot (Read-Only) en ik staarde naar een volledig defecte cluster-omgeving.
Hoe kon dit gebeuren ondanks mijn zorgvuldige, handmatige routine?
Terwijl het cluster vlekkeloos leek te draaien vΓ³Γ³r de herstart, had een automatische pakketupgrade op de achtergrond de SSH host-keys op mijn externe QDevice-host gewijzigd. Tegelijkertijd waren de bestandsrechten op de NSS-certificatendatabase (/etc/corosync/qnetd) gereset naar root.
Omdat alles op dat moment in het actieve RAM-geheugen draaide, leek het cluster aan de oppervlakte kerngezond. Maar op het moment dat de node herstartte en zijn beveiligde TLS-sockets en SSH-sleutels opnieuw over het netwerk probeerde te verifiΓ«ren, liep hij tegen een muur op. Het was een stille fout die op de achtergrond op de loer lag, wachtend op een herstart om toe te slaan.
Die nacht leerde mij een stressvolle maar waardevolle les: handmatige controles en de standaard output van pvecm status zijn simpelweg niet genoeg wanneer je complexe cluster-architecturen beheert.
π― Waarom dit script een game-changer is
Om te zorgen dat ik die blinde paniek nooit meer hoef mee te maken, heb ik een universeel pre-reboot controlescript ontwikkeld. Het heeft de manier waarop ik clusteronderhoud aanpak volledig veranderd. Dit script is om drie redenen onmisbaar geworden in mijn homelab:
- Het elimineert menselijke interpretatiefouten: Wanneer je
pvecm statustypt, gooit Proxmox een enorme muur van tekst en cijfers over je scherm. Wanneer je 's nachts moe bent, is het heel makkelijk om een klein verschil tussen de verwachte stemmen (Expected votes) en totale stemmen (Total votes) over het hoofd te zien. Dit script rekent voor mij. Het controleert live stemgegevens, scant netwerksockets en vertaalt droge data naar een direct, kleurgecodeerd eindoordeel: Veilig om te herstarten of STRIKT VERBODEN. - Het schaalt mee met elke cluster-topologie: Mijn homelab-infrastructuur verandert continu. Dit script is volledig onafhankelijk van je opzet. Draai je een 2-node cluster met een QDevice? Het valideert direct de netwerk- en TLS-socketstatus van de externe stem. Schaal je in de toekomst op naar een cluster zonder QDevice? Het script detecteert automatisch de afwezigheid van de QDevice-vlag en slaat de controle geruisloos over zonder foutmeldingen te genereren.
- Het is volledig toekomstbestendig (Ceph & iSCSI Fallback): Wat dit script echt elegant maakt, is de ingebouwde logica voor gedeelde opslag-subsystemen. Het script zoekt proactief naar actieve Ceph-pools of gecentraliseerde iSCSI SAN-targets. Zijn deze features momenteel nog niet geïmplementeerd? Dan noteert het script dit als een simpele informatieregel en gaat door. Zodra ik in de toekomst een iSCSI LUN toevoeg, zal het script deze automatisch controleren zonder dat ik één regel code hoef aan te passen.
π Het Universele Proxmox Cluster Check Script
Plak dit script in een bestand genaamd /usr/local/bin/cluster_check.sh op je Proxmox-host, maak het uitvoerbaar met chmod +x en draai het altijd direct na je apt upgrade maar vΓ³Γ³rdat je reboot typt.
#!/bin/bash
# ANSI-kleurcodes voor strakke en scannbare output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo -e "${YELLOW}=== UNIVERSAL PROXMOX CLUSTER & STORAGE CHECK ===${NC}\n"
# Statustracking variabelen initialiseren
CHECK_QUORUM="OK"
CHECK_VOTES="OK"
CHECK_STORAGE="OK"
# 1. Live data ophalen uit de Proxmox cluster engine
PVE_STATUS=$(pvecm status 2>/dev/null)
if [ -z "$PVE_STATUS" ]; then
echo -e "${RED}[ERROR] Dit systeem maakt geen deel uit van een Proxmox cluster!${NC}"
exit 1
fi
# Variabelen parsen uit de ruwe pvecm status output
QUORATE=$(echo "$PVE_STATUS" | grep -i "Quorate:" | awk '{print $2}')
EXPECTED_VOTES=$(echo "$PVE_STATUS" | grep -i "Expected votes:" | awk '{print $3}')
TOTAL_VOTES=$(echo "$PVE_STATUS" | grep -i "Total votes:" | awk '{print $3}')
HAS_QDEVICE=$(echo "$PVE_STATUS" | grep -i "Flags:" | grep -i "Qdevice")
# 2. Cluster Quorum Evaluatie
echo -n "1. Cluster Quorum Status: "
if [ "$QUORATE" == "Yes" ]; then
echo -e "${GREEN}[OK] Cluster heeft Quorum (Stemmeerderheid)${NC}"
else
echo -e "${RED}[ERROR] Cluster heeft GEEN Quorum!${NC}"
CHECK_QUORUM="FAIL"
fi
# 3. Dynamische Stembalans Controle
echo -n "2. Actieve Stemmenbalans: "
if [ "$TOTAL_VOTES" -eq "$EXPECTED_VOTES" ]; then
echo -e "${GREEN}[OK] Alle $TOTAL_VOTES verwachte stemmen zijn online${NC}"
elif [ "$TOTAL_VOTES" -gt "$(($EXPECTED_VOTES / 2))" ] && [ "$QUORATE" == "Yes" ]; then
echo -e "${YELLOW}[WARNING] Slechts $TOTAL_VOTES van de $EXPECTED_VOTES stemmen online (Cluster werkt, maar mist nodes)${NC}"
CHECK_VOTES="WARN"
else
echo -e "${RED}[ERROR] Te weinig active stemmen ($TOTAL_VOTES van de $EXPECTED_VOTES)!${NC}"
CHECK_VOTES="FAIL"
fi
# 4. Dynamische QDevice Connectiviteitscontrole
echo -n "3. QDevice Configuratie: "
if [ -n "$HAS_QDEVICE" ]; then
if command -v corosync-qdevice-tool &> /dev/null; then
if corosync-qdevice-tool -s | grep -qi "Connected"; then
echo -e "${GREEN}[OK] QDevice is actief en verbonden${NC}"
else
echo -e "${RED}[ERROR] QDevice is geconfigureerd, maar de TLS-verbinding FAALT!${NC}"
CHECK_QDEV="FAIL"
fi
else
echo -e "${RED}[ERROR] QDevice vlag aanwezig, maar corosync-qdevice-tool ontbreekt op de host!${NC}"
CHECK_QDEV="FAIL"
fi
else
echo -e "${NC}[INFO] Geen extern QDevice geconfigureerd voor dit cluster${NC}"
fi
# 5. Lokale & Gedeelde Opslag Subsystemen Analyseren
echo -e "\n${YELLOW}--- OPSLAG SUBSYSTEMEN STATUS (ZFS, LVM, CEPH & iSCSI) ---${NC}"
# 5a. ZFS Status Controle
if command -v zpool &> /dev/null; then
ZPOOLS=$(zpool list -H -o name 2>/dev/null)
if [ -n "$ZPOOLS" ]; then
for pool in $ZPOOLS; do
ZSTATUS=$(zpool status "$pool" | grep "state:" | awk '{print $2}')
echo -n " - ZFS Pool ($pool): "
if [ "$ZSTATUS" == "ONLINE" ]; then
echo -e "${GREEN}[OK] Status is ONLINE${NC}"
else
echo -e "${RED}[ERROR] Status is $ZSTATUS! Check 'zpool status'${NC}"
CHECK_STORAGE="FAIL"
fi
done
else
echo -e " - ZFS: [INFO] Geen actieve lokale ZFS pools gevonden"
fi
fi
# 5b. LVM Volume Group Controle
if command -v vgdisplay &> /dev/null; then
VGS=$(vgdisplay -c 2>/dev/null | awk -F: '{print $1}')
if [ -n "$VGS" ]; then
for vg in $VGS; do
VG_STATUS=$(vgdisplay "$vg" 2>/dev/null | grep "VG Status" | awk '{print $3}')
echo -n " - LVM VG ($vg): "
if [ "$VG_STATUS" == "resizable" ] || [ "$VG_STATUS" == "read/write" ]; then
echo -e "${GREEN}[OK] Status is prima${NC}"
else
echo -e "${RED}[ERROR] LVM Groep status is afwijkend: $VG_STATUS${NC}"
CHECK_STORAGE="FAIL"
fi
done
else
echo -e " - LVM: [INFO] Geen actieve LVM Volume Groups gevonden"
fi
fi
# 5c. Gedeelde Opslag / iSCSI & Ceph Aanwezigheidsdetectie
if command -v ceph &> /dev/null; then
CEPH_STATUS=$(ceph health 2>/dev/null)
echo -n " - Ceph Cluster: "
if [[ "$CEPH_STATUS" == *"HEALTH_OK"* ]]; then
echo -e "${GREEN}[OK] Ceph is gezond${NC}"
else
echo -e "${RED}[ERROR] Ceph status: $CEPH_STATUS${NC}"
CHECK_STORAGE="FAIL"
fi
fi
# 6. HET FINALE REBOOT VERDICT GENEREREN
echo -e "\n${YELLOW}=== EVALUATIE EINDOORDEEL ===${NC}"
if [ "$CHECK_QUORUM" == "FAIL" ] || [ "$CHECK_VOTES" == "FAIL" ] || [ "${CHECK_QDEV:-OK}" == "FAIL" ] || [ "$CHECK_STORAGE" == "FAIL" ]; then
echo -e "${RED}######################################################"
echo -e "# EINDOORDEEL: HERSTART STRIKT VERBODEN! #"
echo -e "# ER ZIJN KRITIEKE CLUSTER- OF OPSLAGFOUTEN DETECTEERD! #"
echo -e "######################################################${NC}"
exit 1
elif [ "$CHECK_VOTES" == "WARN" ]; then
echo -e "${YELLOW}######################################################"
echo -e "# EINDOORDEEL: HERSTART MOGELIJK MET RISICO #"
echo -e "# Cluster is quorate, maar mist actieve nodes/stemmen.#"
echo -e "######################################################${NC}"
else
echo -e "${GREEN}######################################################"
echo -e "# EINDOORDEEL: VEILIG OM TE HERSTARTEN #"
echo -e "# Alle cluster-hartslagen, QDevice en opslagen OK. #"
echo -e "######################################################${NC}"
fi
π Gemoedsrust in het Homelab
Het updaten van je infrastructuur hoort geen gokspel te zijn. Door dit script simpelweg te draaien direct na je apt upgrade maar vΓ³Γ³r het herstart-commando, overbrug je de kloof tussen wat er momenteel in het vluchtige RAM-geheugen van de host leeft en wat er daadwerkelijk naar de harde schijf is weggeschreven. Het vangt permissiefouten, verlopen certificaten, verstoorde opslagpaden en afgebroken netwerkverbindingen op voordat ze downtime kunnen veroorzaken.
Het verandert een stressvol gokspel in een voorspelbaar, ijzersterk verificatieproces. Ik kan met absolute zekerheid zeggen dat ik nooit meer reboot typ op een Proxmox host zonder deze controle eerst te draaien!