Du kannst die Zuweisung der USB-Ports mit udev-Regeln festlegen 
Ich habe ChatGPT gebeten, ein kleines Tutorial zu schreiben, und das ist das Ergebnis (es scheint nicht schlecht zu sein):
1. udev-Regeln verwenden, um USB-Geräten dauerhafte Namen zuzuweisen
Die Ports /dev/ttyUSB0 und /dev/ttyUSB1 werden beim Systemstart dynamisch zugewiesen, was zu einer zufälligen Vertauschung der Geräte führen kann. Mit udev kann man jedem Gerät einen eindeutigen und dauerhaften Namen basierend auf seinen Eigenschaften (wie der Produkt-ID, dem Hersteller oder der Seriennummer) zuweisen.
Hier sind die Schritte:
- USB-Geräte identifizieren :
Verwende den folgenden Befehl, um Informationen zu jedem Gerät zu finden:
udevadm info -q all -n /dev/ttyUSB0
udevadm info -q all -n /dev/ttyUSB1
Du suchst nach Attributen wie ID_VENDOR_ID, ID_MODEL_ID oder ID_SERIAL.
- Eine udev-Regel erstellen :
Bearbeite oder erstelle eine Datei in /etc/udev/rules.d/ (z. B. /etc/udev/rules.d/99-usb-serial.rules) und füge für jedes Gerät eine Regel hinzu:
SUBSYSTEM==« tty », ATTRS{idVendor}==« XXXX », ATTRS{idProduct}==« YYYY », SYMLINK+=« zigbee_adapter »
SUBSYSTEM==« tty », ATTRS{idVendor}==« ZZZZ », ATTRS{idProduct}==« WWWW », SYMLINK+=« rflink_adapter »
Ersetze XXXX, YYYY, ZZZZ und WWWW durch die entsprechenden Werte, die im vorherigen Schritt gefunden wurden.
- Den udev-Dienst neu starten :
Wende die Regeln an, indem du udev neu startest:
sudo udevadm control --reload-rules
sudo udevadm trigger
- Den Docker-Befehl aktualisieren :
Ändere deinen Docker-Befehl, um auf die neuen dauerhaften Namen (/dev/zigbee_adapter und /dev/rflink_adapter) zu verweisen:
docker run -d \
–log-opt max-size=10m \
–restart=always \
–network=host \
–name node_red \
-u node-red:dialout \
–device=/dev/zigbee_adapter \
–device=/dev/rflink_adapter \
–label com.centurylinklabs.watchtower.enable=false \
-v /var/lib/node-red:/data \
nodered/node-red
2. Docker-Optionen verwenden, um Geräte über ihren stabilen Pfad zu spezifizieren
Wenn du udev nicht verwenden möchtest, kannst du die Geräte direkt über ihren stabilen Hardware-Pfad angeben, der in /dev/serial/by-id/ zugänglich ist.
- USB-Geräte auflisten :
Führe den folgenden Befehl aus, um die stabilen Namen zu identifizieren:
ls -l /dev/serial/by-id/
Du wirst symbolische Links wie diese sehen:
usb-1a86_USB2.0-Serial-if00-port0 → ../../ttyUSB0
usb-0403_6001_RFLINK-if00-port0 → ../../ttyUSB1
- Den Docker-Befehl aktualisieren :
Ändere den Docker-Befehl, um diese Pfade zu verwenden:
docker run -d \
–log-opt max-size=10m \
–restart=always \
–network=host \
–name node_red \
-u node-red:dialout \
–device=/dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0 \
–device=/dev/serial/by-id/usb-0403_6001_RFLINK-if00-port0 \
–label com.centurylinklabs.watchtower.enable=false \
-v /var/lib/node-red:/data \
nodered/node-red
Zusammenfassung
• Empfohlene Lösung : udev-Regeln verwenden, um dauerhafte Namen zuzuweisen, was flexibel und Docker-unabhängig ist.
• Schnelle Alternative : Die Pfade /dev/serial/by-id/ direkt im Docker-Befehl verwenden.
Diese Lösungen garantieren, dass deine USB-Geräte nicht mehr vertauscht werden, selbst nach einem Neustart oder einem Stromausfall.