web-dev-qa-db-fra.com

Comment obtenir une relation bus / périphérique pour un / dev / ttyUSB

J'ai besoin d'écrire un script pour redémarrer les dongles USB. J'ai tous les outils, mais je ne peux pas lier mon/dev/ttyUSBx à un bus physique et à un périphérique. Un problème est que j'ai trois dongles avec le même fournisseur d'identifiant et le même produit.

Si je fais lsusb la sortie est:

Bus 001 Device 004: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 006: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 007: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 002: ID 80ee:0021
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Et je l'ai attaché à:

/dev/ttyUSB0
/dev/ttyUSB3
/dev/ttyUSB5

Mais je veux savoir quel périphérique est associé à quel périphérique de bus. Par exemple, je dois obtenir ce qui suit:

/dev/ttyUSB0 -> Bus 001 Device 006
/dev/ttyUSB3 -> Bus 001 Device 004
/dev/ttyUSB5 -> Bus 001 Device 007

J'utilise Ubuntu Server 10.04 et j'ai testé les outils:

lsusb
hal
lsmod

Mais je n'arrive pas à avoir la relation.

14

Étant donné que je n'ai pas votre matériel, je ne peux pas vous donner de réponse exacte.

Je vous suggère d’aller sur le périphérique en question, par exemple:

ls -l /dev/ttyUSB0

et obtenir les numéros de nœud majeur et mineur. Disons qu'ils sont 116, 7

Ensuite aller à:

ls -l /sys/dev/char/116:7

(charname__, car un tty est un périphérique de caractères, si vous recherchiez un périphérique de disque, vous devez spécifier blockau lieu de charname__)

Dans la sortie de la commande, vous verrez quelque chose comme:

lrwxrwxrwx 1 root root 0 Sep 6 00:17 116:7 -> ../../devices//sys/devices/pci0000:00/0000:00:13.5/pci0000:00/0000:00:13.5/usb1/1-3/1-3:1.1/sound/card1/pcmC1D0c

Le répertoire /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/ et ses sous-répertoires contiennent de nombreuses informations sur le périphérique. Par exemple, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnum et /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum. Sur mon système, ils correspondent aux numéros de bus et de périphérique mentionnés dans les entrées de hotplug de périphérique dans/var/log/syslog.

Autre chose qui fonctionne sur mon système pour/dev/video0:

find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
11
John S Gruber

Il n'y a pas vraiment bon moyen de mapper des périphériques de caractères tels que /dev/ttyUSB0 au périphérique USB et aux numéros de bus correspondants. MAIS, c'est possible!

Quelque chose comme ça pourrait marcher:

udevadm info --name=/dev/ttyUSB0 --attribute-walk

À partir de là, vous obtiendrez de nombreuses informations sur le périphérique et ses périphériques parents. Maintenant, il suffit d'analyser ces données pour obtenir ce que vous voulez. J'ai déjà utilisé cela par le passé:

echo /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/"

Maintenant, si ce n'est pas une bouchée, je ne sais pas ce que c'est! Décomposons:

udevadm info --name=/dev/ttyUSB0 --attribute-walk - renvoie des informations sur le périphérique et ses périphériques parents

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' - analyse ces données et renvoie les lignes contenant l'attribut "devnum" ou "busnum". Nous supposerons que "busnum" est répertorié en premier ... et dans ce cas ... nous pouvons simplement saisir les deux premières lignes de sortie.

head -n 2 - Récupère les 2 premières lignes de la sortie. Nous pourrions avoir plus de fantaisie ici, mais nous supposons simplement que le "busnum" et le "devnum" du parent le plus proche vont être listés en premier.

awk '{$1 = sprintf("%03d", $1); print}' - Prend ces chiffres et les ajoute à zéro.

echo /dev/bus/usb... - tout ce jazz est encapsulé dans une instruction echo pour remplacer les nouvelles lignes par des espaces. Vous pouvez ajouter le -n à echo si vous souhaitez supprimer le retour à la ligne suivant.

tr " " "/" - remplace les espaces de la sortie par des barres obliques

Cela produira quelque chose comme:

/dev/bus/usb/001/011

... qui, bien sûr, est l'appareil. Si vous le souhaitez, vous pouvez facilement générer quelque chose comme busnum:001 devnum:011 avec quelques ajustements:

echo `udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\1\ \4/p' | head -n 2 | awk '{$1 = sprintf("%s:%03d", $1, $2); print $1;}'`
9
BMiner

Vous pouvez trouver toutes les informations sur le noeud en utilisant la commande ci-dessous:

udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/
1
ravibhuva9955