AI 탐구노트

우분투 : USB 장치 명 지정해서 쓰기 본문

기술 팁

우분투 : USB 장치 명 지정해서 쓰기

42morrow 2024. 9. 29. 09:35

 

사진: Unsplash 의 Gabriel Heinzer

 

불편함

 

최근 우분투 PC에 스마트폰, 아두이노 등을 연결해야 하는 상황이 계속 생겼습니다.

그런데 매번 연결 시 마다 /dev/ttyUSB0, /dev/ttyUSB1 등 계속해서 이름이 변경되는 바람에 번거로웠습니다. 

OpenCV로 webcam 연결할 때 /dev/video0를 매번 써 왔었는데 그때는 당연한 듯 썼었는데, 이제서야 불편함을 느낀다는게...

 

이렇게 연결되는 장치의 연결순서에 따라 번호가 매겨지는 방식을 쓰는 것은 한편으로 보면 간편할 수도 있습니다.

연결 장치의 이름을 별도로 확인할 필요가 없기 때문이죠. 

하지만, 프로그램에서 어떤 기기가 연결되는지를 확인하고 진행해야 하는 경우에는 문제가 될 수 있습니다.

 

그래서, 자주 사용하는 장비를 이름을 원하는대로 지정해서 사용하기로 했습니다. 

 

해결책

연결 장치에 직접 내가 원하는 ID를 부여해서 사용하는 방법을 이용합니다.

장치 별 고유값이 있는데 이를 처리 규칙에 등록하고 내가 원하는 이름으로 Symbolic Link를 걸어 이를 이용하는겁니다. 

 

작업 과정은 다음과 같습니다. 

 

1.장치의 고유값 확인하기

USB 장치에는 각각 Vendor ID, Product ID, Serial Number(*경우에 따라 옵션)의 고유값이 있는데 이를 알아내야 합니다. 

 

아래와 같이 lsusb 명령을 이용하면 Vendor ID, Product ID를 읽어올 수 있습니다. 

 

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 003: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 004: ID 32e6:d412 Web Camera Web Camera
Bus 001 Device 005: ID 0483:5222 STMicroelectronics 108EC-S
Bus 001 Device 006: ID 0bda:8771 Realtek Semiconductor Corp. Bluetooth Radio
Bus 001 Device 007: ID 18f8:0f97 [Maxxter] Optical Gaming Mouse [Xtrem]
Bus 001 Device 008: ID 1a86:7523 QinHeng Electronics CH340 serial converter
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 002: ID 05e3:0612 Genesys Logic, Inc. Hub

 

예를 들어 lsusb 출력 결과에서 아두이노 호환보드를보면 1a86:7523라고 되어 있습니다. 

여기서 Vendor ID는 1a86, Product ID는 7523이 됩니다.

 

남은 것은 Serial Number 인데 이것은 udevadm이라는 툴을 사용해서 아래와 같이 확인할 수 있습니다. 

참고로 연결해야 하는 같은 장치가 여럿 있으면 분간을 위해 Serial 번호가 필요하며 그렇지 않은 경우에는 넘어가도 됩니다.

 

$ udevadm info -a /dev/ttyUSB0 | grep '{serial}'
    ATTRS{serial}=="xxxxxxxx"

 

 

참고로 udev는 리눅스 커널을 위한 장치 관리자로 보통 /dev 에 보이는 장치(예: /dev/video0 등 웹캡)들을 관리합니다.

장치를 연결하면 udev가 발생한 이벤트를 캐치해서 처리하도록 해 주는 역할을 하는거죠.

 

2.UDEV 용 rules 등록하기

 

이제 확인된 USB 장치를 처리하는 rule을 등록합니다.

이런 rules 들은 /etc/udev/rules.d 폴더에 생성하게 됩니다. (이미 일부가 만들어져 있을겁니다.)

 

# rules 파일 생성
$ sudo vi /etc/udev/rules.d/91-my_serial_devices.rules

 

 

 

저는 이 파일에 Arduino와 제 스마트폰 연결 시 symbolic link로 작동하도록 설정했습니다.

각각 /dev/ttyArduino와 /dev/usbGalaxy 로 말입니다. 

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyArduino"
SUBSYSTEM=="usb", ATTRS{idVendor}=="04e8", ATTRS{idProduct}=="6860", ATTRS{serial}=="....", SYMLINK+="usbGalaxy"

 

 

이제 rules가 적용되도록 udev 서비스를 재시작합니다.

$ sudo udevadm control --reload-rules
$ sudo udevadm trigger

 

3.장치 연결 확인

자 이제 장치가 정상적으로 등록되었는지 확인해 봅니다. 

$ ls /dev/ttyArduino
/dev/ttyArduino

$ ls /dev/usbGalaxy 
/dev/usbGalaxy

 

 

참고글

 

1.

언젠가부터 우분투에서 USB 연결 장치에서 id, type 별로 확인할 수 있는 방법이 바뀐 모양입니다.

/dev/serial/by-id   혹은 /dev/serial/by-type 에서 해당 목록을 볼 수 있었다고 하는데 현재 버전을 보면 해당 내용이 없습니다. 

Reddit에 관련한 이 올라와 있더군요...

 

그래서, 이럴 어떻게 해결하느냐... 

 

링크 상의 파일로 /lib/udev/rules.d/60-serial.rules를 생성해 주고 재부팅합니다. 

사라진 serial 처리를 지원해 주는 것 같습니다.