So verwandelst du einen GL.iNet Flint 3 mit OpenWrt in QNetd f?r einen Proxmox-Cluster
In einem Proxmox-Cluster mit zwei Knoten gibt es ein bekanntes Problem: Um das Quorum aufrechtzuerhalten, m?ssen wir Situationen vermeiden, in denen jeder Knoten genau die H?lfte der Stimmen hat. Eine g?ngige L?sung besteht darin, ein QDevice hinzuzuf?gen. Dabei f?hrt ein unabh?ngiges drittes Ger?t QNetd aus und fungiert als Arbitrator. In meinem Fall lief bereits ein QDevice, aber QNetd war auf einem anderen Rechner untergebracht. Ich wollte diese Abh?ngigkeit beseitigen und ein Ger?t nutzen, das praktisch immer eingeschaltet und au?erdem physisch unabh?ngig von den Proxmox-Servern ist: meinen GL.iNet Flint 3 (GL-BE9300)-Router. Das Problem: Auf dem Flint 3 l?uft OpenWrt statt Debian, und die in meiner Firmware verf?gbaren Repositories enthalten corosync-qnetd nicht. Wichtig: Diese Anleitung dokumentiert genau die L?sung, die ich in meiner Installation verwendet habe. OpenWrt, GL.iNet, Debian, Corosync und Proxmox entwickeln sich weiter. Pr?fe daher Versionen, Pfade und Parameter, bevor du sie unver?ndert ?bernimmst.
Auf YouTube teile ich weitere Tutorials, Praxistests und echte Smart-Home-Projekte. Auf YouTube abonnieren

Verwandtes Video auf YouTube
Video1. Die verwendete Umgebung
In meiner Installation:
Router:
GL.iNet Flint 3 / GL-BE9300
IP: 192.168.1.1
OpenWrt 23.05-SNAPSHOT
ARM64-Architektur
Cluster:
Name: hectormox
Knoten 1:
miniproxmox
192.168.1.6
Knoten 2:
zimaproxmox
192.168.1.7Die minimale Debian-Installation befand sich unter:
/opt/debian-qnetd
QNetd lauscht auf dem Standardport:
TCP 5403
2. Per SSH mit dem Flint 3 verbinden
Unter Windows k?nnen wir direkt den in PowerShell enthaltenen SSH-Client verwenden:
ssh root@192.168.1.1
Wir geben das Administrationspasswort des Routers ein.
Nach der Anmeldung sehen wir etwas ?hnliches wie:
BusyBox
OpenWrt
root@GL-BE9300:~#Bevor wir irgendetwas installieren, lohnt es sich herauszufinden, was tats?chlich vorhanden ist.
3. System, Architektur, Pakete und verf?gbaren Speicherplatz pr?fen
Wir f?hren Folgendes aus:
cat /etc/os-release
cat /etc/openwrt_release
uname -a
uname -m
command -v opkg
command -v apk
opkg print-architecture
df -hAuf meinem Flint erhielt ich ein System mit:
OpenWrt 23.05-SNAPSHOT
aarch64
und opkg als Paketmanager.
Ich habe auch gepr?ft, welche Werkzeuge verf?gbar waren:
command -v ar
command -v tar
command -v gzip
command -v xz
command -v wget
command -v curl
command -v mount
command -v chrootUnd insbesondere, ob OpenWrt Corosync bereits anbot:
opkg update
opkg list | grep -Ei 'corosync|qnetd|qdevice|libnss|libqb'In meiner Firmware war corosync-qnetd nicht vorhanden.
Daher konnten wir nicht einfach Folgendes ausf?hren:
opkg install corosync-qnetd
wie wir es mit einem nativen OpenWrt-Paket tun w?rden.
4. Warum eine minimale Debian-Umgebung innerhalb von OpenWrt verwenden
Anstatt Corosync und alle zugeh?rigen Abh?ngigkeiten direkt f?r OpenWrt zu kompilieren, entschied ich mich f?r eine deutlich einfachere L?sung:
eine minimale Debian-ARM64-Umgebung in einem Verzeichnis erstellen und QNetd ?ber chroot ausf?hren.
OpenWrt bleibt das Betriebssystem des Routers. Wir installieren keinen anderen Kernel, virtualisieren nichts und ersetzen die Firmware nicht.
Die Struktur sieht einfach so aus:
OpenWrt
└── /opt/debian-qnetd
└── Debian 12 ARM64
└── corosync-qnetdDer Flint funktioniert also weiterhin als OpenWrt-Router, verf?gt aber ?ber eine kleine Debian-Umgebung, aus der wir Software ausf?hren k?nnen, die in seinen Repositories nicht vorhanden ist.
5. debootstrap auf dem Flint installieren
Zuerst aktualisieren wir die Paketindizes:
opkg update
Wir installieren debootstrap:
opkg install debootstrap
Wir pr?fen, ob es verf?gbar ist:
command -v debootstrap
debootstrap --versionUnd pr?fen den verf?gbaren Speicherplatz:
df -h /overlay
Bei mir waren mehrere Gigabyte frei, genug f?r eine minimale Debian-Installation.
6. Problem mit GPG und Debian Bookworm
Hier trat eines der ersten Probleme auf, die spezifisch f?r meine OpenWrt-Version waren.
debootstrap muss die Signaturen der Debian-Repositories ?berpr?fen, aber das auf dem Router zun?chst verf?gbare gpgv war f?r einige von Bookworm verwendete Signaturen zu alt.
Die L?sung bestand darin, Folgendes zu installieren:
opkg install gpgv2
Wir k?nnen die Installation damit ?berpr?fen:
gpgv2 --version
Au?erdem ben?tigen wir die offiziellen Debian-Schl?ssel.
Wir bereiten ein tempor?res Verzeichnis vor:
BASE="/tmp/qnetd-bootstrap"
mkdir -p "$BASE"
mkdir -p "$BASE/bin"Wir laden das Paket debian-archive-keyring f?r Debian Bookworm herunter.
Hier sollte man pr?fen, welche Paketversion zum Zeitpunkt der Verwendung dieser Anleitung aktuell ist, anstatt dauerhaft eine bestimmte URL zu ?bernehmen.
Nach dem Herunterladen:
DEB="$BASE/debian-archive-keyring.deb"
Wir entpacken den Inhalt:
ar p "$DEB" data.tar.xz |
xz -dc |
tar -xf - -C "$BASE"Der Schl?ssel steht nun hier zur Verf?gung:
KEY="$BASE/usr/share/keyrings/debian-archive-keyring.gpg"
ls -l "$KEY"Damit debootstrap gpgv2 verwendet, legen wir vor?bergehend einen kleinen Override an:
ln -sf /usr/bin/gpgv2 "$BASE/bin/gpgv"
Das wirkt sich nur auf den PATH aus, den wir beim Ausf?hren von debootstrap verwenden.
7. Debian 12 ARM64 minbase erstellen
Wir legen fest, wo die Installation erfolgen soll:
TARGET="/opt/debian-qnetd"
Wir f?hren Folgendes aus:
PATH="$BASE/bin:$PATH" \
debootstrap \
--arch=arm64 \
--variant=minbase \
--keyring="$KEY" \
bookworm \
"$TARGET" \
https://deb.debian.org/debianDamit wird eine minimale Debian-12-Installation heruntergeladen und hier eingerichtet:
/opt/debian-qnetd
Wir k?nnen den Inhalt pr?fen:
ls -la /opt/debian-qnetd
Und die Umgebung manuell betreten:
chroot /opt/debian-qnetd /bin/bash
Um zu OpenWrt zur?ckzukehren:
exit
8. Debian aktualisieren und QNetd installieren
Direkt von OpenWrt aus k?nnen wir Befehle innerhalb des chroot ausf?hren:
chroot "$TARGET" /usr/bin/apt-get update
Vor der Installation pr?fen wir, ob das Paket verf?gbar ist:
chroot "$TARGET" \
/usr/bin/apt-cache policy corosync-qnetdBei mir bot Debian Folgendes an:
corosync-qnetd 3.0.3-1
Bei der ersten Installation fehlten einige Abh?ngigkeiten der minbase-Umgebung.
Zuerst reparierte ich die Paketdatenbank mit:
chroot "$TARGET" \
/usr/bin/apt-get --no-remove -y --fix-broken installDanach installierte ich:
chroot "$TARGET" \
/usr/bin/apt-get install -y \
--no-install-recommends \
corosync-qnetd \
libnss3-toolsZu den Abh?ngigkeiten, die Debian schlie?lich installierte, geh?rten NSS-Bibliotheken, Perl, netbase und weitere ben?tigte Pakete.
9. /proc und /dev/pts w?hrend der Installation
W?hrend der Installation gab es einige Warnungen zu /proc und /dev/pts.
Ich band vor?bergehend Folgendes ein:
mount -o bind \
/proc \
/opt/debian-qnetd/procUnd:
mount -o bind \
/dev/pts \
/opt/debian-qnetd/dev/ptsDas half uns bei der Vorbereitung von Debian.
Sp?ter stellten wir fest, dass QNetd diese Bind-Mounts im normalen Betrieb nicht ben?tigt. Sie geh?ren daher nicht zum endg?ltigen Service.
10. QNetd-Zertifikate initialisieren
QNetd verwendet eine NSS-Datenbank zur Verwaltung seiner Zertifikate.
In unserer Debian-Umgebung steht daf?r folgendes Werkzeug zur Verf?gung:
corosync-qnetd-certutil
Wir initialisieren sie von OpenWrt aus:
chroot /opt/debian-qnetd \
/usr/bin/corosync-qnetd-certutil \
-iDie NSS-Datenbank befindet sich, von OpenWrt aus gesehen, hier:
/opt/debian-qnetd/etc/corosync/qnetd/nssdb
Wir k?nnen sie folgenderma?en ?berpr?fen:
ls -lah \
/opt/debian-qnetd/etc/corosync/qnetd/nssdbInnerhalb des chroot lautet derselbe Pfad:
/etc/corosync/qnetd/nssdb
Die ?ffentliche CA befindet sich hier:
/opt/debian-qnetd/etc/corosync/qnetd/nssdb/qnetd-cacert.crt
11. Den Benutzer coroqnetd
Das Debian-Paket erstellt einen eigenen Benutzer f?r die Ausf?hrung von QNetd.
Wir pr?fen seine Kennungen:
chroot /opt/debian-qnetd id coroqnetd
In meiner Installation erhielt ich:
UID 100
GID 101
Das ist wichtig, weil ich QNetd sp?ter mit folgender Option ausf?hre:
--userspec=100:101
Diese Zahlen d?rfen nicht ungepr?ft ?bernommen werden.
Jede Installation muss Folgendes ausf?hren:
chroot /opt/debian-qnetd id coroqnetd
und die ermittelten Werte verwenden.
Au?erdem pr?fen wir die Berechtigungen der NSS-Datenbank:
DB="/opt/debian-qnetd/etc/corosync/qnetd/nssdb"
ls -ln "$DB"Bei mir musste ich Folgendes anpassen:
chgrp 101 \
"$DB/pwdfile.txt" \
"$DB/pkcs11.txt"
chmod 640 \
"$DB/pwdfile.txt" \
"$DB/pkcs11.txt"Auch in meiner Installation war 101 die konkrete GID.
12. QNetd manuell testen
Bevor wir daraus einen Service machen, sollten wir pr?fen, ob der Daemon tats?chlich startet.
Ich testete Folgendes:
timeout -s TERM 10 \
chroot --userspec=100:101 \
/opt/debian-qnetd \
/usr/bin/corosync-qnetd \
-f \
-4 \
-l 192.168.1.1 \
-p 5403 \
-s reqDie verwendeten Parameter bedeuten:
-f: im Vordergrund ausf?hren.-4: IPv4 verwenden.-l 192.168.1.1: Adresse, auf der QNetd lauscht.-p 5403: Port.-s req: TLS in der von uns verwendeten Version erzwingen.
Bevor wir die Optionen ?bernehmen, sollten wir die Hilfe der installierten Version pr?fen:
chroot /opt/debian-qnetd \
/usr/bin/corosync-qnetd \
-h13. Das LD_PRELOAD-Problem von OpenWrt
Beim Ausf?hren von Debian-Programmen unter OpenWrt erschienen Warnungen zu einer Firmware-Variablen namens LD_PRELOAD.
Damit der chroot-Prozess keine OpenWrt-eigenen Variablen ?bernimmt, f?hrte ich ihn schlie?lich mit einer sauberen Umgebung aus:
/usr/bin/env -i \
PATH=/usr/sbin:/usr/bin:/sbin:/bin \
...Dieses Detail wurde Teil des endg?ltigen Service.
14. Den QNetd-Service unter OpenWrt einrichten
Hier liegt einer der wichtigsten Unterschiede zu einer normalen Debian-Installation.
Unter Debian w?rden wir systemd verwenden.
Unter OpenWrt verwenden wir procd und Skripte unter:
/etc/init.d/
Wir erstellen die Datei:
cat > /etc/init.d/qnetd-debian <<'EOF'
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=98
STOP=10
start_service() {
procd_open_instance
procd_set_param command \
/usr/bin/env -i \
PATH=/usr/sbin:/usr/bin:/sbin:/bin \
/usr/sbin/chroot --userspec=100:101 \
/opt/debian-qnetd \
/usr/bin/corosync-qnetd \
-f -4 -l 192.168.1.1 -p 5403 -s req
procd_set_param respawn 3600 5 5
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}
EOFWir setzen die Berechtigungen:
chmod 755 /etc/init.d/qnetd-debian
Wir aktivieren den automatischen Start:
/etc/init.d/qnetd-debian enable
Wir k?nnen die angelegten Links pr?fen:
ls -l /etc/rc.d/*qnetd*
Auf meinem Flint wurden folgende Eintr?ge angelegt:
/etc/rc.d/S98qnetd-debian
/etc/rc.d/K10qnetd-debian
Wir starten den Service:
/etc/init.d/qnetd-debian start
15. Pr?fen, ob QNetd l?uft
Zuerst suchen wir den Prozess:
pidof corosync-qnetd
Anschlie?end pr?fen wir den Port:
netstat -lntp 2>/dev/null | grep 5403
Wir sollten Folgendes sehen:
192.168.1.1:5403 LISTEN
Wir k?nnen auch den vollst?ndigen Prozess pr?fen:
ps w | grep '[c]orosync-qnetd'
Und den Status direkt bei procd:
ubus call service list \
'{"name":"qnetd-debian"}'Ein korrekter Status enth?lt:
"running": true
Bei mir war au?erdem Folgendes zu sehen:
/usr/bin/corosync-qnetd
-f
-4
-l 192.168.1.1
-p 5403
-s req16. Den Respawn pr?fen
Der Service enth?lt folgende Einstellung:
procd_set_param respawn 3600 5 5
Dadurch kann procd QNetd erneut starten, wenn der Prozess unerwartet endet.
W?hrend der Tests beendeten wir den Prozess manuell und pr?ften, ob er mit einer anderen PID erneut gestartet wurde und wieder auf diesem Port lauschte:
192.168.1.1:5403
17. Proxmox vorbereiten
Jetzt wechseln wir zum ersten Cluster-Knoten:
ssh root@192.168.1.6
Wir pr?fen den aktuellen Status:
pvecm status
Und:
corosync-qdevice-tool -s
Mein Cluster hei?t:
hectormox
Zuvor lief ein anderer QNetd auf:
192.168.1.5:5403
Der neue wird hier laufen:
192.168.1.1:5403
18. Vor dem ?ndern von QDevice ein Backup erstellen
Bevor ich die Zertifikate ?nderte, sicherte ich folgende Pfade:
/etc/corosync/qdevice
/etc/pve/corosync.conf
Zum Beispiel:
BACKUP="/root/qdevice-backup-$(hostname)-$(date +%Y%m%d-%H%M%S).tar.gz"
tar -czf "$BACKUP" \
-C / \
etc/corosync/qdevice \
etc/pve/corosync.conf
sha256sum "$BACKUP"
ls -lh "$BACKUP"Ich empfehle nicht, ohne dieses Backup fortzufahren.
19. Eine neue NSS-Datenbank auf Proxmox erstellen
Auf miniproxmox:
DIR="/root/qnetd-migration"
DB="$DIR/nssdb-new"
PASS="$DIR/pwdfile-new.txt"
mkdir -p "$DIR"
mkdir -m 700 "$DB"
: > "$PASS"
chmod 600 "$PASS"
Inicializamos NSS:
certutil -N \
-d "sql:$DB" \
-f "$PASS"20. Die CA vom Flint nach Proxmox kopieren
Von miniproxmox:
scp \
root@192.168.1.1:/opt/debian-qnetd/etc/corosync/qnetd/nssdb/qnetd-cacert.crt \
/root/qnetd-migration/qnetd-cacert.crtWir importieren die CA:
certutil -A \
-d "sql:$DB" \
-n "QNet CA" \
-t "CT,c,c" \
-i "$DIR/qnetd-cacert.crt" \
-f "$PASS"Wir pr?fen das Ergebnis:
certutil -L \
-d "sql:$DB" \
-f "$PASS"Wir sollten Folgendes sehen:
QNet CA CT,c,c
21. Den CSR des Clusters erstellen
Wir erzeugen etwas Entropie:
dd if=/dev/urandom \
of="$DIR/noise-new.txt" \
bs=1024 \
count=1 \
status=noneWir erstellen den CSR:
CSR="$DIR/qdevice-net-node.crq"
certutil -R \
-d "sql:$DB" \
-f "$PASS" \
-z "$DIR/noise-new.txt" \
-s "CN=hectormox" \
-g 3072 \
-o "$CSR"Folgendes muss ersetzt werden:
hectormox
durch den tats?chlichen Clusternamen.
Wir k?nnen ihn folgenderma?en pr?fen:
pvecm status
22. Den CSR an den Flint senden
Von Proxmox aus:
scp \
"$CSR" \
root@192.168.1.1:/opt/debian-qnetd/tmp/hectormox.crqWir verbinden uns erneut mit dem Flint:
ssh root@192.168.1.1
Und signieren ihn:
chroot /opt/debian-qnetd \
/usr/bin/corosync-qnetd-certutil \
-s \
-c /tmp/hectormox.crq \
-n hectormoxDas signierte Zertifikat befindet sich hier:
/opt/debian-qnetd/etc/corosync/qnetd/nssdb/cluster-hectormox.crt
23. Das signierte Zertifikat abrufen
Von miniproxmox:
scp \
root@192.168.1.1:/opt/debian-qnetd/etc/corosync/qnetd/nssdb/cluster-hectormox.crt \
/root/qnetd-migration/cluster-hectormox.crtWir k?nnen es in PEM umwandeln:
cd /root/qnetd-migration
openssl x509 \
-inform DER \
-in cluster-hectormox.crt \
-out cluster-hectormox.pemUnd ?berpr?fen:
openssl verify \
-CAfile qnetd-cacert.crt \
cluster-hectormox.pemDas korrekte Ergebnis lautet:
OK
24. Das Cluster-Zertifikat importieren
Wir f?gen das signierte Zertifikat zu NSS hinzu:
certutil -A \
-d "sql:$DB" \
-n "Cluster Cert" \
-t "u,u,u" \
-i "$DIR/cluster-hectormox.crt" \
-f "$PASS"Wir pr?fen das Ergebnis:
certutil -L \
-d "sql:$DB" \
-f "$PASS"Nun sollten folgende Eintr?ge erscheinen:
QNet CA CT,c,c
Cluster Cert u,u,u
25. Zertifikat und privaten Schl?ssel nach PKCS#12 exportieren
Wir erzeugen die Datei:
pk12util \
-o "$DIR/qdevice-net-node.p12" \
-d "sql:$DB" \
-k "$PASS" \
-W "" \
-n "Cluster Cert"Erwartetes Ergebnis:
PKCS12 EXPORT SUCCESSFUL
Diese Datei enth?lt einen privaten Schl?ssel. Sie darf nicht ver?ffentlicht oder weitergegeben werden.
26. Den zweiten Proxmox-Knoten vorbereiten
Wir kopieren die Datei auf den zweiten Knoten:
scp \
/root/qnetd-migration/qnetd-cacert.crt \
root@192.168.1.7:/root/qnetd-migration/Und:
scp \
/root/qnetd-migration/qdevice-net-node.p12 \
root@192.168.1.7:/root/qnetd-migration/Auf zimaproxmox:
DIR="/root/qnetd-migration"
DB="$DIR/nssdb-new"
PASS="$DIR/pwdfile-new.txt"
CA="$DIR/qnetd-cacert.crt"
P12="$DIR/qdevice-net-node.p12"
mkdir -m 700 "$DB"
: > "$PASS"
chmod 600 "$PASS"
certutil -N \
-d "sql:$DB" \
-f "$PASS"Wir importieren die CA:
certutil -A \
-d "sql:$DB" \
-n "QNet CA" \
-t "CT,c,c" \
-i "$CA" \
-f "$PASS"Wir importieren PKCS#12:
pk12util \
-i "$P12" \
-d "sql:$DB" \
-k "$PASS" \
-W ""Das korrekte Ergebnis lautet:
PKCS12 IMPORT SUCCESSFUL
Und pr?fen:
certutil -L \
-d "sql:$DB" \
-f "$PASS"27. Eine endg?ltige NSS-Datenbank vorbereiten
Bevor ich die tats?chlich von QDevice verwendete Datenbank ?nderte, bereitete ich ein weiteres Verzeichnis vor:
/root/qnetd-migration/nssdb-ready
Auf jedem Knoten:
DIR="/root/qnetd-migration"
READY="$DIR/nssdb-ready"
mkdir -m 700 "$READY"
cp -a \
"$DIR/nssdb-new/." \
"$READY/"
install -m 600 \
"$DIR/pwdfile-new.txt" \
"$READY/pwdfile.txt"Wir pr?fen das Ergebnis:
certutil -L \
-d "sql:$READY" \
-f "$READY/pwdfile.txt"Und k?nnen die Identit?t ?berpr?fen:
certutil -L \
-d "sql:$READY" \
-n "Cluster Cert" \
-a |
openssl x509 \
-noout \
-subject \
-issuerBei mir:
subject=CN=hectormox
issuer=CN=QNet CA
28. Die aktiven Zugangsdaten ersetzen
Diesen Schritt f?hrten wir Knoten f?r Knoten.
Wir stoppen ausschlie?lich QDevice:
systemctl stop corosync-qdevice
Corosync stoppen wir nicht.
Wir sichern die alte Datenbank:
ACTIVE="/etc/corosync/qdevice/net/nssdb"
BACKUP="${ACTIVE}.pre-glinet-$(date +%Y%m%d-%H%M%S)"
mv "$ACTIVE" "$BACKUP"Wir kopieren die neue Datenbank:
cp -a \
/root/qnetd-migration/nssdb-ready \
"$ACTIVE"Wir passen die Berechtigungen an:
chown -R root:root "$ACTIVE"
chmod 700 "$ACTIVE"
chmod 600 "$ACTIVE"/*Wir pr?fen das Ergebnis:
certutil -L \
-d "sql:$ACTIVE" \
-f "$ACTIVE/pwdfile.txt"Und starten QDevice:
systemctl start corosync-qdevice
Wir wiederholen denselben Vorgang auf dem anderen Knoten.
29. Die IP des alten QNetd ?ndern
In meinem Fall war QDevice bereits f?r einen anderen Server konfiguriert:
192.168.1.5
und sollte auf den Flint umgestellt werden:
192.168.1.1
Zuvor erstellte ich ein weiteres Backup:
cp \
/etc/pve/corosync.conf \
"/root/corosync-pre-glinet-$(date +%Y%m%d-%H%M%S).conf"Die ?nderung sah so aus:
- host: 192.168.1.5
+ host: 192.168.1.1
Au?erdem erh?hten wir:
- config_version: 3
+ config_version: 4
Der betreffende Abschnitt sah anschlie?end etwa so aus:
quorum {
device {
model: net
net {
algorithm: ffsplit
host: 192.168.1.1
tls: on
}
votes: 1
}
}Beachte, dass config_version gegen?ber dem Wert der jeweiligen Installation erh?ht werden muss.
Die Werte 3 ? 4 d?rfen nicht w?rtlich ?bernommen werden.
30. Nur QDevice neu starten
Nach der ?nderung ?bernahm Corosync die neue Konfiguration, aber der QDevice-Prozess verwendete weiterhin die alte Adresse, bis wir ihn neu starteten.
Wir f?hren Folgendes aus:
systemctl restart corosync-qdevice
Wir pr?fen den Status:
corosync-qdevice-tool -s
Das korrekte Ergebnis war:
Cluster name: hectormox
QNetd host: 192.168.1.1:5403
Algorithm: Fifty-Fifty split
State: Connected
Wir starten QDevice auch auf dem zweiten Knoten neu.
31. Das Quorum pr?fen
Wir f?hren Folgendes aus:
pvecm status
In unserem Fall lautete das Endergebnis:
Expected votes: 3 Highest expected: 3 Total votes: 3 Quorum: 2 Quorate: Yes
Und in der Mitgliederliste:
0x00000001 1 A,V,NMW 192.168.1.6
0x00000002 1 A,V,NMW 192.168.1.7
0x00000000 1 Qdevice
Das bedeutet:
miniproxmox: 1 voto.zimaproxmox: 1 voto.- QDevice/QNetd: 1 Stimme.
Insgesamt:
3 Stimmen
Das ben?tigte Quorum betr?gt weiterhin:
2
32. Ein vollst?ndiges Backup des Flint-QNetd erstellen
Nachdem alles eingerichtet war, erstellte ich ein vollst?ndiges Backup der Umgebung.
Wir legen Folgendes fest:
SERVICE="/etc/init.d/qnetd-debian"
BACKUP="/overlay/qnetd-backup-completo-$(date +%Y%m%d-%H%M%S).tar.gz"Wir stoppen QNetd kurzzeitig:
"$SERVICE" stop
Wir erstellen das Backup:
tar -czf "$BACKUP" \
-C / \
--exclude=opt/debian-qnetd/proc \
--exclude=opt/debian-qnetd/dev/pts \
--exclude=opt/debian-qnetd/run \
--exclude=opt/debian-qnetd/tmp \
opt/debian-qnetd \
etc/init.d/qnetd-debian \
etc/rc.d/S98qnetd-debian \
etc/rc.d/K10qnetd-debianAnschlie?end starten wir den Service wieder:
"$SERVICE" start
Wir ?berpr?fen die Integrit?t:
tar -tzf "$BACKUP" >/dev/null
sha256sum "$BACKUP"
ls -lh "$BACKUP"Mein fertiges Backup war ungef?hr:
157 MB
33. Das Backup nach Windows herunterladen
In PowerShell:
scp -O `
root@192.168.1.1:/overlay/qnetd-backup-completo-XXXXXXXX.tar.gz `
"$env:USERPROFILE\Downloads\"Anschlie?end berechnen wir den Hash:
Get-FileHash `
"$env:USERPROFILE\Downloads\qnetd-backup-completo-XXXXXXXX.tar.gz" `
-Algorithm SHA256Der Wert muss exakt mit dem zuvor auf dem Flint ermittelten Wert ?bereinstimmen.
Das Backup enth?lt Zertifikate und private Schl?ssel und muss daher sicher aufbewahrt werden.
34. Das System nach einem Neustart des Flint testen
Ich wollte das Projekt nicht schon dann als abgeschlossen betrachten, wenn es nach einem manuellen Start funktionierte.
Ich startete den Flint 3 ?ber seine Weboberfl?che neu.
Sobald er wieder erreichbar war, meldete ich mich erneut an:
ssh root@192.168.1.1
Zuerst pr?fte ich, ob das Skript noch vorhanden war:
wc -l /etc/init.d/qnetd-debian
Danach:
pidof corosync-qnetd
Ich pr?fte den Port:
netstat -lntp 2>/dev/null | grep 5403
Y finalmente procd:
ubus call service list \
'{"name":"qnetd-debian"}'Beim abschlie?enden Test erhielt ich:
23 /etc/init.d/qnetd-debian
eine g?ltige PID:
28139
den Port:
192.168.1.1:5403 LISTEN
und:
"running": true
Damit war nachgewiesen, dass QNetd nach dem Neustart des Routers automatisch gestartet war.
35. Pr?fen, ob Proxmox die Verbindung automatisch wiederherstellt
Auf miniproxmox:
corosync-qdevice-tool -s
Der Status wechselte automatisch zur?ck zu:
QNetd host: 192.168.1.1:5403 State: Connected
Und:
pvecm status
zeigte erneut Folgendes an:
Expected votes: 3
Total votes: 3
Quorum: 2
Quorate: Yes
Wenn wir den Flint neu starten, verlieren die Proxmox-Knoten vor?bergehend die Stimme von QDevice. Sobald QNetd wieder l?uft, verbinden sich die QDevice automatisch erneut.
36. Ein ungew?hnliches Problem, das auftrat
Bei einem der Tests geschah etwas Merkw?rdiges.
Der Service wurde als aktiviert angezeigt:
/etc/init.d/qnetd-debian enabled
aber QNetd lief nicht.
Wir pr?ften:
pidof corosync-qnetd
Es wurde keine PID zur?ckgegeben.
Auch lauschte nichts auf dem Port:
netstat -lntp 2>/dev/null |
grep 5403Also ?berpr?ften wir das Skript:
wc -l /etc/init.d/qnetd-debian
Dabei stellten wir fest:
0 /etc/init.d/qnetd-debian
Die Datei war leer geworden.
Die folgenden Eintr?ge waren jedoch weiterhin vorhanden:
/etc/rc.d/S98qnetd-debian
/etc/rc.d/K10qnetd-debian
Deshalb konnte OpenWrt den Service als aktiviert anzeigen, obwohl tats?chlich nichts zum Ausf?hren vorhanden war.
Wir stellten das Skript wieder her und wiederholten den vollst?ndigen Neustarttest.
Danach startete der Service korrekt.
Die Schlussfolgerung ist wichtig:
Es reicht nicht, nur zu pr?fen, ob ein Service aktiviert ist.
Zus?tzlich sollte man Folgendes ?berpr?fen:
pidof corosync-qnetd
netstat -lntp 2>/dev/null | grep 5403
ubus call service list \ '{"name":"qnetd-debian"}'37. Schnelldiagnose, wenn QNetd nicht startet
Zuerst pr?fen wir, ob das Skript vorhanden und nicht leer ist:
wc -l /etc/init.d/qnetd-debian
cat /etc/init.d/qnetd-debianDanach:
/etc/init.d/qnetd-debian enabled
Wir suchen den Prozess:
pidof corosync-qnetd
Port:
netstat -lntp 2>/dev/null |
grep 5403Status in procd:
ubus call service list \
'{"name":"qnetd-debian"}'Und wenn wir QNetd au?erhalb von procd testen m?chten:
timeout 5 /usr/bin/env -i \
PATH=/usr/sbin:/usr/bin:/sbin:/bin \
/usr/sbin/chroot --userspec=100:101 \
/opt/debian-qnetd \
/usr/bin/corosync-qnetd \
-f -4 \
-l 192.168.1.1 \
-p 5403 \
-s req
echo "EXIT=$?"Wenn der Befehl Folgendes zur?ckgibt:
124
bedeutet das, dass der Daemon noch lief, als timeout ihn beendete.
In diesem Fall liegt das Problem wahrscheinlich beim procd-Service und nicht bei QNetd.
38. Schnelldiagnose von Proxmox aus
Zuerst pr?fen wir die Services:
systemctl is-active corosync
systemctl is-active corosync-qdeviceDanach:
corosync-qdevice-tool -s
Richtig ist:
State: Connected
Und:
pvecm status
sollte Folgendes anzeigen:
Total votes: 3
Quorate: Yes
Wenn Folgendes erscheint:
Cannot initialize CMAP service
bedeutet das nicht zwangsl?ufig, dass QNetd fehlerhaft ist.
Pr?fen wir zuerst:
systemctl is-active corosync
W?hrend meiner Tests trat genau so ein Vorfall auf. Ursache war ein von QNetd unabh?ngiges Problem mit NFS-Mounts auf dem Proxmox-Host.
39. Werte, die an die eigene Installation angepasst werden m?ssen
Nicht alle Werte aus dieser Anleitung d?rfen unver?ndert ?bernommen werden.
Adresse des Flint
In meinem Fall:
192.168.1.1
Proxmox-Knoten
192.168.1.6
192.168.1.7
Clustername
hectormox
Pr?fe ihn mit:
pvecm status
Architektur
Mein Flint verwendet:
ARM64
Wir sollten sie jedoch pr?fen mit:
uname -m
UID und GID von coroqnetd
In meiner Installation:
100:101
Pr?fen mit:
chroot /opt/debian-qnetd \
id coroqnetdDebian-Pfad
Ich habe Folgendes gew?hlt:
/opt/debian-qnetd
Das ist nicht zwingend erforderlich.
Debian-Version
In dieser Anleitung:
Debian 12 Bookworm
TLS
Meine Version verwendete:
-s req
Pr?fe es mit:
chroot /opt/debian-qnetd \
/usr/bin/corosync-qnetd \
-hconfig_version
?bernimm nicht einfach:
3 → 4
Der aktuelle Wert in unserer corosync.conf muss um eins erh?ht werden.
40. Das Endergebnis
Nach Abschluss aller Schritte l?uft der Flint 3 wie folgt:
OpenWrt
??? Debian 12 ARM64 in chroot
??? corosync-qnetdQNetd:
192.168.1.1:5403
TLS
procd
Respawn
automatischer Start
Und der Cluster:
miniproxmox → QDevice ─┐
├──→ Flint 3 / QNetd
zimaproxmox → QDevice ─┘Das Endergebnis k?nnen wir mit folgendem Befehl pr?fen:
corosync-qdevice-tool -s
lautet:
QNetd host: 192.168.1.1:5403
State: Connected
Und mit:
pvecm status
erhalten wir:
Expected votes: 3
Total votes: 3
Quorum: 2
Quorate: Yes
Das Besondere an dieser L?sung ist, dass wir den Flint 3 weder in einen Debian-Server verwandelt noch OpenWrt ersetzt haben.
Der Flint bleibt unser OpenWrt-Router.
Wir nutzen lediglich ein st?ndig eingeschaltetes ARM64-Ger?t mit ausreichend Speicherplatz und Unterst?tzung f?r chroot, um eine minimale Debian-Umgebung ausschlie?lich f?r QNetd einzurichten.
So erhalten wir eine physisch unabh?ngige dritte Stimme f?r einen Proxmox-Cluster mit zwei Knoten, ohne einen weiteren Server nur f?r den Arbitrator eingeschaltet zu halten.
Empfohlene Ausruestung
In diesem Projekt verwendetes Geraet: GL.iNet GL-BE9300 Flint 3. Falls du es brauchst, findest du es hier:
- GL.iNet GL-BE9300 Flint 3 — Im Video getestet: AliExpress España · AliExpress desde Europa · AliExpress Oficial GL.iNet · Amazon


