USB 동글을 다시 시작하기위한 스크립트를 작성해야합니다. 모든 도구가 있지만 / dev / ttyUSBx를 물리적 BUS 및 DEVICE에 연결할 수 없습니다. 문제는 동일한 id 공급 업체와 id 제품을 가진 3 개의 동글이 있다는 것입니다.
lsusb를 수행하면 출력은 다음과 같습니다.
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
그리고 나는 그것을 첨부했습니다 :
/dev/ttyUSB0
/dev/ttyUSB3
/dev/ttyUSB5
그러나 어떤 장치가 어떤 버스 장치와 관련되어 있는지 알고 싶습니다. 예를 들어 다음을 얻어야합니다.
/dev/ttyUSB0 -> Bus 001 Device 006
/dev/ttyUSB3 -> Bus 001 Device 004
/dev/ttyUSB5 -> Bus 001 Device 007
Ubuntu Server 10.04를 사용하고 있으며 도구를 테스트했습니다.
lsusb
hal
lsmod
그러나 나는 관계를 얻을 수 없습니다.
답변
하드웨어가 없기 때문에 정확한 답변을 드릴 수 없습니다.
예를 들어 해당 장치로 이동하는 것이 좋습니다.
ls -l /dev/ttyUSB0
주 노드 번호와 부 노드 번호를 얻습니다. 그들이 116, 7이라고 가정 해 봅시다
그런 다음
ls -l /sys/dev/char/116:7
( char
tty는 문자 장치이므로 디스크 장치를 추적하는 경우 block
대신 대신 지정하십시오 char
)
명령의 출력에는 다음과 같은 내용이 표시됩니다.
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
디렉토리 /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/
및 해당 서브 디렉토리에는 장치에 대한 많은 정보가 있습니다. 일례로서, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnum
그리고 /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum
. 내 시스템에서 이들은 / var / log / syslog의 장치 핫 플러그 항목에 언급 된 버스 및 장치 번호와 일치합니다.
/ dev / video0에 대한 시스템에서 작동하는 다른 것 :
find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
답변
문자 장치 를 해당 USB 장치 및 버스 번호 에 매핑 하는 좋은 방법 은 실제로 없습니다 /dev/ttyUSB0
. 그러나 가능합니다!
이와 같은 것이 효과가있을 수 있습니다.
udevadm info --name=/dev/ttyUSB0 --attribute-walk
여기에서 장치와 해당 상위 장치에 대한 많은 정보를 얻을 수 있습니다. 이제는 데이터를 파싱하여 원하는 것을 얻습니다. 나는 이것을 과거에 사용했다 :
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 " " "/"
자, 그것이 한 입이 아니라면, 나는 무엇인지 몰라요! 그것을 분해하자 :
udevadm info --name=/dev/ttyUSB0 --attribute-walk
-장치 및 해당 상위 장치에 대한 정보를 반환합니다.
sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'
-이 데이터를 구문 분석하고 “devnum”또는 “busnum”속성을 포함하는 행을 반환합니다. “busnum”이 먼저 나열되어 있다고 가정합니다.이 경우에는 처음 두 줄의 출력을 잡을 수 있습니다.
head -n 2
-처음 두 줄의 출력을 잡습니다. 여기서 더 화려할 수는 있지만 가장 가까운 부모의 “busnum”과 “devnum”이 먼저 나열 될 것이라고 가정합니다.
awk '{$1 = sprintf("%03d", $1); print}'
-해당 숫자를 가져 와서 0으로 채 웁니다.
echo /dev/bus/usb
…- 이 모든 재즈는 줄 echo
바꿈을 공백으로 바꾸라 는 문장으로 싸여 있습니다. 당신은 추가 할 수 있습니다 -n
에 echo
당신이 뒤에 줄 바꿈을 차단하려는 경우.
tr " " "/"
-출력의 공백을 슬래시로 바꿉니다.
이것은 다음과 같이 출력됩니다 :
/dev/bus/usb/001/011
… 물론 장치입니다. 원하는 경우 busnum:001 devnum:011
몇 가지 조정으로 쉽게 출력 할 수 있습니다 .
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;}'`
답변
아래 명령을 사용하여 노드에 대한 모든 정보를 찾을 수 있습니다.
udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/