Wie kann man die USB-Ports an einem Mini-PC reparieren?

Hallo,
schon mehrmals haben sich die USB-Ports USB1 und USB0 nach einem Neustart vertauscht, nachdem die Sicherung durchgebrannt ist. An Port USB0 habe ich meinen Zigbee-Adapter angeschlossen und an Port USB1 meinen Rflink, und jedes Mal initialisiert das System den Zigbee-Adapter an USB1 und den Rflink an USB0.
Ich habe versucht, diese Konfiguration zu installieren, aber wenn der Rflink an USB0 angeschlossen ist, verbindet er sich nicht. Also stelle ich immer wieder her: Zigbee-Adapter an USB0 und Rflink an USB1. Ich hatte dieses Problem schon auf dem RPI und @VonOx, das damals gelöst wurde

docker run -d \
--log-opt max-size=10m \
--restart=always \
--network=host \
--name node_red \
-u node-red:dialout \
--device=/dev/ttyUSB0 \
--device=/dev/ttyUSB1 \
--label com.centurylinklabs.watchtower.enable=false \
-v /var/lib/node-red:/data \
nodered/node-red

Aktuell funktioniert alles und ich habe keine Lust, alles mit diesem Befehl neu zu installieren.
Daher wollte ich wissen, ob man den Zustand der USB-Ports fixieren kann oder ob ich darauf bestehen soll, die USB-Ports zu vertauschen?
Vielen Dank für eure Hilfe

Du kannst die Zuweisung der USB-Ports mit udev-Regeln festlegen :slight_smile:

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:

  1. 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.

  1. 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.

  1. Den udev-Dienst neu starten :

Wende die Regeln an, indem du udev neu startest:

sudo udevadm control --reload-rules

sudo udevadm trigger

  1. 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.

  1. 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

  1. 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.