Proxmox LXC Container bei USB-Busänderung automatisch neu starten

Begonnen von betateilchen, 22 November 2025, 21:05:03

Vorheriges Thema - Nächstes Thema

betateilchen

Für Flightradar24 betreibe ich hier einen ADSB-Feeder in einem LXC-Container unter Proxmox.
Dazu habe ich ein USB-Passthrough für den verwendeten SDR-Stick eingerichtet

dev0: /dev/bus/usb/001/010,mode=0666
So weit, so gut. Nun kommt es aber vor, dass sich durch Neustart oder Änderungen an den USB Geräten am Host die Bus-Zuordnung ändert und der SDR-Stick dann einfach nicht mehr verfügbar ist. Das ist nicht ohne weiteres erkennbar. Nachdem man die Zuordnung dann korrigiert und den Container dann neu gestartet hat, funktioniert alles wieder - bis zur nächsten Änderung.

Dazu habe ich mir jetzt ein Skript zur Überwachung und automatischen Korrektur gebaut:

#!/bin/bash

USB=`lsusb |grep RTL2832U|awk '{print "dev0: /dev/bus/usb/" $2 "/" $4 ",mode=0666"}'|sed s/:,/,/`
DEV=`cat /etc/pve/lxc/110.conf |grep dev0`

if [ "$DEV" != "$USB" ];
then
 sed -i /dev0/d /etc/pve/lxc/110.conf
 echo $USB >>   /etc/pve/lxc/110.conf
 /usr/sbin/pct reboot 110
fi

#

Wird per cronjob regelmäßig aufgerufen und prüft, ob sich Container-config und USB-Bus-Liste unterscheiden. Wenn ja, wird die config angepasst und der Container neu gestartet.

Hat sich bisher gut bewährt, vielleicht kann es ja jemand gebrauchen. Das Prinzip läßt sich natürlich auch für andere USB Geräte verwenden :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Ralli

Gruß,
Ralli

Proxmox 9 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte OpenCCU (3.83.6.20251025) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

betateilchen

#2
Hätte man vielleicht machen können.

Aber Proxmox hat halt seit 8.x die Einbindung von USB Geräten prinzipiell stark vereinfacht, indem man ein Gerät einfach als Ressource vom Host auf den Container mappen kann. In vielen Fällen funktioniert das auch problemlos und eindeutig, insbesondere bei Datenträgern und seriellen ports (z.B. zigbee). Dort kann man einfach beispielsweise /dev/serial/by-id/usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_987dce184bbeed11b7ab642e38a92db5-if00-port0 als Ressource angeben und es ist egal, in welchem USB port der Stick steckt.

Bei dem SDR Stick ist es halt so, dass der von Haus aus nicht als Gerät unter "/dev/irgendwas..." auftaucht und es gibt die zusätzliche Herausforderung, dass die zugehörigen Kernelmodule nicht benutzt werden dürfen, wenn man ihn für das Szenario "FR24 feeder" einsetzen möchte.

Man muss eben mit dem Manko leben, dass man für den Stick den usb-port genau als Ressource angeben muss und dass sich die Nummerierung der ports zwischendurch mal ändern kann. Da fand ich das kurze Bash-Skript die schnellere Lösung, als sich mit udev rumschlagen zu müssen, was man ja mit dem ressourcen-Mapping genau umgehen wollte.

Das Skript automatisiert lediglich die beiden Schritte "ermitteln der Bus-Position" und "Mappen der Bus-Position in den Container", die man ansonsten von Hand machen würde.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Beim Basteln an dem Thema ist mir aufgefallen, dass pct <ctid> reboot einen container tatsächlich nur neustartet, wenn er schon läuft. Ein heruntergefahrener container wird aber so nicht gestartet, es kommt vielmehr zu einer Fehlermeldung "not running".

Mein Plan war eigentlich, das "start on boot" abzuschalten und mich darauf zu verlassen, dass der cronjob den container dann startet. Falsch gedacht...

Also müsste in das Skript auch noch eine Fallunterscheidung, ob der container gestartet oder neugestartet werden muss.

Dann kam ich zu einer anderen Lösung:

Inzwischen habe ich die Ermittlung der bus-Position für die betreffenden devices (es sind glücklicherweise nicht allzu viele) zusätzlich in die 'pre-start'-hookscripts der entsprechenden zwei Container eingebaut.

Damit wird schon beim Starten der Container die Konfiguration entsprechend korrigiert und das gewünschte device verwendet - egal, auf welchem Weg der Container gestartet wird.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!