Tu peux fixer l’attribution des ports USB avec des règles udev
J’ai demandé à ChatGPT d’écrire un petit tuto, voilà ce qu’il me donne (ça me semble pas mal):
1. Utiliser des règles udev pour assigner des noms persistants aux périphériques USB
Les ports /dev/ttyUSB0 et /dev/ttyUSB1 sont attribués dynamiquement au démarrage du système, ce qui peut provoquer l’inversion aléatoire des périphériques. Avec udev, on peut assigner un nom unique et persistant à chaque périphérique en fonction de ses caractéristiques (comme son ID de produit, son fabricant ou son numéro de série).
Voici les étapes :
- Identifier les périphériques USB :
Utilisez la commande suivante pour repérer les informations sur chaque périphérique :
udevadm info -q all -n /dev/ttyUSB0
udevadm info -q all -n /dev/ttyUSB1
Vous cherchez des attributs comme ID_VENDOR_ID, ID_MODEL_ID ou ID_SERIAL.
- Créer une règle udev :
Éditez ou créez un fichier dans /etc/udev/rules.d/ (par exemple /etc/udev/rules.d/99-usb-serial.rules) et ajoutez une règle pour chaque périphérique :
SUBSYSTEM==« tty », ATTRS{idVendor}==« XXXX », ATTRS{idProduct}==« YYYY », SYMLINK+=« zigbee_adapter »
SUBSYSTEM==« tty », ATTRS{idVendor}==« ZZZZ », ATTRS{idProduct}==« WWWW », SYMLINK+=« rflink_adapter »
Remplacez XXXX, YYYY, ZZZZ, et WWWW par les valeurs correspondantes trouvées à l’étape précédente.
- Redémarrer le service udev :
Appliquez les règles en redémarrant udev :
sudo udevadm control --reload-rules
sudo udevadm trigger
- Mettre à jour la commande Docker :
Modifiez votre commande Docker pour pointer vers les nouveaux noms persistants (/dev/zigbee_adapter et /dev/rflink_adapter) :
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. Utiliser les options de Docker pour spécifier les périphériques via leur chemin stable
Si vous ne souhaitez pas utiliser udev, vous pouvez spécifier directement les périphériques via leur chemin matériel stable, accessible dans /dev/serial/by-id/.
- Lister les périphériques USB :
Exécutez la commande suivante pour identifier les noms stables :
ls -l /dev/serial/by-id/
Vous verrez des liens symboliques comme :
usb-1a86_USB2.0-Serial-if00-port0 → …/…/ttyUSB0
usb-0403_6001_RFLINK-if00-port0 → …/…/ttyUSB1
- Mettre à jour la commande Docker :
Modifiez la commande Docker pour utiliser ces chemins :
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
Résumé
• Solution recommandée : Utiliser des règles udev pour attribuer des noms persistants, ce qui est flexible et indépendant de Docker.
• Alternative rapide : Utiliser les chemins /dev/serial/by-id/ directement dans la commande Docker.
Ces solutions garantiront que vos périphériques USB ne s’inverseront plus, même après un redémarrage ou une panne électrique.