/ dev / ttyUSB에 대한 버스 및 장치 관계를 얻는 방법


14

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

그러나 나는 관계를 얻을 수 없습니다.

답변:


11

하드웨어가 없기 때문에 정확한 답변을 드릴 수 없습니다.

예를 들어 해당 장치로 이동하는 것이 좋습니다.

ls -l /dev/ttyUSB0

주 노드 번호와 부 노드 번호를 얻습니다. 그들이 116, 7이라고 가정 해 봅시다

그런 다음

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

( chartty는 문자 장치이므로 디스크 장치를 추적하는 경우 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

대단히 감사합니다!, 나는 이것을 오랫동안 싸웠습니다. 추가 방문자 : Ubuntu Ubuntu 10.04.2 LTS에서 장치 디렉토리는 / sys / char / 대신 / sys / dev / char /입니다.
Ernesto Campohermoso

수정 해 주셔서 감사합니다. 해당 변경 내용으로 답변을 편집하고 찾기 명령을 추가하여 정보를 인쇄했습니다.
존 S Gruber

@JohnSGruber 좋아, 그러나 그것을 마운트하는 방법?!
Dr.jacky

1
@ Mr.Hyde : / dev / ttyUSB를 마운트 할 수 없습니다; 디스크 드라이브처럼 작동하는 일부 장치 만 마운트 할 수 있습니다.
존 S Gruber

10

문자 장치 를 해당 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바꿈을 공백으로 바꾸라 는 문장으로 싸여 있습니다. 당신은 추가 할 수 있습니다 -necho당신이 뒤에 줄 바꿈을 차단하려는 경우.

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;}'`

1

아래 명령을 사용하여 노드에 대한 모든 정보를 찾을 수 있습니다.

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

후행 슬래시를 제거하십시오. "syspath를 찾을 수 없음"을 제공합니다.
nvd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.