• udev rules 심볼릭링크 설정 - USB 장치 포트 이름 고정하기
    Linux 2023. 3. 1. 19:26

     

    udev

    /dev 디렉터리의 장치 노드를 관리하는 장치 관리자 (userspace /dev)

     

    udevadm

    장치 제어, 테스트 등에 사용하는 장치 관리 명령어

    option : info, control, monitor, test 등

     

    udev rules 설정

    장치의 port name을 특정 이름으로 고정시킴으로써 PC 재부팅 혹은 USB 재연결 시 장치 이름이 바뀌는 것을 방지한다.

    e.g. ttyUSB0 → ttyGPS

     

     

    rules 설정에 필요한 정보

    Vendor ID, Product ID (Model ID), Serial number 등

     

     

    설정 과정

    1) ls 명령어를 이용해 /dev 디렉터리 내 tty로 시작하는 장치 목록을 조회한다.

    $ ls /dev/tty*
    /dev/tty /dev/tty0 /dev/tty1 /dev/ttys0 /dev/ttys1
    /dev/ttyACM0 /dev/ttyACM1 /dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2

     

    2) udevadm의 info 옵션을 이용해 장치의 기본 정보를 조회하고, 이를 통해 이름을 고정하고 싶은 장치를 찾는다.

    udevadm info /dev/ttyUSB0

    해당 명령어를 실행하면 ttyUSB0 장치에 관련된 다양한 정보가 출력된다.

    보다 자세한 정보를 출력하고자 할 경우 -a 옵션을 사용한다.

     

     

    3) grep 명령어를 이용해 해당 장치의 Vendor ID, Product(Model) ID, Serial number를 조회한다.

    $ udevadm info /dev/ttyUSB0 | grep -E 'VENDOR_ID|MODEL_ID|SERIAL_SHORT'
    E: ID_MODEL_ID=0123
    E: ID_SERIAL_SHORT=ABCDEFG
    E: ID_VENDOR_ID=4567

    해당 장치를 특정할 수 있는 고유 정보만 알아내면 된다.

    Vendor ID와 Product ID가 모두 일치하는 장치가 있을 수 있기 때문에 Serial number까지 검색한다.

     

     

    4) rules 파일을 생성하고 편집한다.

    $ cd /etc/udev/rules.d && sudo gedit 99-usb.rules

    커스텀 rules 파일은 /etc/udev/rules.d 디렉터리 내에 위치해야 하며,

    파일 이름은 '숫자(prefix number)-설명-이름.rules' 형태를 갖춰 설정하는 것이 관례다. e.g. 99-usb.rules

    (prefix number 설정에 관한 자세한 내용은 여기를 참고)

     

     

    5. 아래와 같은 형태로 내용을 입력하고 저장한다.

    SUBSYSTEM=="tty", ATTRS{idVendor}=="4567", ATTRS{idProduct}=="0123", ATTRS{serial}=="ABCDEFG", SYMLINK+="ttyGPS", MODE:="0777"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="1098", ATTRS{idProduct}=="7654", ATTRS{serial}=="HIJKLMN", SYMLINK+="ttyLiDAR", MODE:="0777"

    tty 서브시스템을 가지며, Vendor ID가 4567, Product ID가 0123, Serial number가 ABCDEFG인 장치에

    777권한(읽기, 쓰기, 실행 모두 가능)과 ttyGPS라는 이름을 부여하고,

     

    마찬가지로

    tty 서브시스템을 가지며, Vendor ID가 1098, Product ID가 7654, Serial number가 HIJKLMN인 장치에

    777권한과 ttyLiDAR라는 이름을 부여하겠다는 의미이다.

     

    각 장치의 서브시스템은 udevadm info 명령어를 통해 확인 가능하다.

     

    각 연산자의 의미는 다음과 같다.

    == : 동일한지 비교

    != : 다른지 비교

    = : 키에 새로운 값 할당

    += : 키에 해당하는 값에 새로운 값 추가

    -= : 키에 해당하는 값에서 해당 값 제거

    := : 키에 변경이 불가한 최종 값 할당

     

     

    6. 연결된 USB를 재연결한 후, 장치 목록을 조회하여 바뀐 이름을 확인한다.

    $ ls -l /dev/tty*
    lrwxrwxrwx 1 root root 7 3월 1 18:10 /dev/ttyGPS -> ttyACM1
    lrwxrwxrwx 1 root root 7 3월 1 18:10 /dev/ttyLiDAR -> ttyUSB2

    기존 ttyACM1, ttyUSB2였던 장치가 각각 ttyGPS, ttyLiDAR로 잡히는 것을 확인할 수 있다.

     

     

     

     

    간혹 가다 장치의 Serial number(ID_SERIAL_SHORT)가 잡히지 않는 경우가 있다.

     

    이때, -a 옵션을 이용한 출력 결과에서 Serial number를 찾은 후,

    해당 Serial number를 갖는 parent device의 Vendor ID와 Product ID를 조회한다.

    $ udevadm info -a /dev/ttyACM0 | awk -v RS='' '/serial/' | grep -E 'idProduct|idVendor|serial'
    ATTRS{idProduct}=="0123"
    ATTRS{idVendor}=="abcd"
    ATTRS{serial}=="0000:00:00.0"

    이후 해당 정보를 rules 파일에 입력한 후 저장한다.

     

     

     

     

    참고.

    https://en.wikipedia.org/wiki/Udev

    https://www.thegeekdiary.com/beginners-guide-to-udev-in-linux/

    https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux

    https://unix.stackexchange.com/questions/82944/how-to-grep-for-text-in-a-file-and-display-the-paragraph-that-has-the-text

    'Linux' 카테고리의 다른 글

    cat 명령어 - 파일 내용 출력, 연결  (0) 2023.03.01

    댓글

ABOUT ME

공부한 것을 기록하기 위해 블로그를 개설했습니다. 관심 분야는 ROS와 머신러닝입니다.

VISIT

/