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.
É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
(char
name__, car un tty est un périphérique de caractères, si vous recherchiez un périphérique de disque, vous devez spécifier block
au lieu de char
name__)
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
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;}'`
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/