본문 바로가기
IT 개발 Tip

리눅스 USB 장치 권한 설정하기(udev Rules 작성방법)

by 호박꿀고구마 2024. 4. 29.
728x90
728x90
리눅스 USB udev Rules 작성방법


안녕하세요
얼마전 오랜만에 리눅스 환경에서 USB 장치를 연결해서 사용하다가
연결 및 권한 설정 때문에 고생을 좀 해서 정리를 해둘려고 합니다

예전에 쓰던 장비를 몇년만에 다시 연결해서 쓰다가 프로그램에서 USB 장치를 찾지 못해서
'왜...갑자기 안되지??' 하다가 아 맞다 설정을 넣어줘야지 하다가 너무 오랜만에
하다보니 기억이 안나서 저도 이것저것 찾다가 고생을 좀 하게 되서 기록을 해둘려고 합니다

리눅스(Linux) USB 장치 이름 설정
출처 입력
리눅스에서는 USB 장치를 연결하게 되면 순서대로 번호를 설정 하기때문에
/dev 폴더 에서 검색을 해보면 인식이 되는 것을 확인 할 수 있습니다
단, 프로그램에서 USB 포트를 고정값으로 사용을 하고 싶거나 해당 USB 포트의 권한을 일정하게 주고 싶은데 재부팅을 하게 되면 이 권한이 풀리거나 포트가 변경이 됩니다

이 문제를 해결하기 위해 포트와 권한을 항상 일정하게 유지하는 방법입니다
일정하게 유지가 안되면 매번 재부팅 이후에 수동으로 직접 설정을 해주어야 하는 불편함이 있습니다
udev란???
출처 입력
udev는 리눅스 커널의 장치 관리자이다. 쉽게 말해서 윈도우의 장치관리자 같은 역할이다
/dev 폴더에서 여러 장치들을 관리하는 역할을 하는데
우리가 윈도우 환경에서 USB 장치 또는 시리얼 장치를 연결하게 되면 자동으로 인식이 되듯이
리눅스에서도 udev 란 곳에서 동일한 역할을 한다.
즉 /dev 에서 새로운 장치가 연결이 되면 인식을 하게 되고 이 장치를 관리해주는 역할을 한다

udev rules 작성방법 및 유의사항
출처 입력
그래서 우리는 /etc/udev/rule.d 폴더 밑에 규칙 파일을 생성하고 넣어주면 된다
즉, 고정적으로 사용되는 USB 장치 또는 시리얼 장치와 같은 디바이스가 연결이 되어
인식을 하게되면 udev에서 rules 파일을 읽어들여서
'아..이 장치는 어떤 포트의 어떤권한을 주어야 겠구나..' 라고 /dev 폴더에서 인식된 장치들의
환경을 관리해주게 됩니다'

즉 기본 설정을 해준다 라고 생각하면 됩니다
그럼 하나씩 순서대로 해보도록 하겠습니다

rule 작성 경로
파일작성 경로는 /etc/udev/rules.d 입니다
위의 디렉토리 안에 접미사(확장자) xxxxxxx.rules 를 작성해 주면 됩니다
추가로 파일명.rules 를작성할때 맨앞에 숫자를 붙이게 됩니다 숫자는 우선순위로써 낮을수록 우선순위가 높습니다
예시 : 10-Test_1.rules / 20-Test_2.rules 이렇게 2가지 파일이 있으면, 10-Test_1.rules가 먼저 실행되고 그 뒤에 20-Test_2.rules가 실행이 됩니다
작성시 유의사항
',' 로 분리된 key-value 로 구성이 된다
SUBSYSTEM / idVendor / idProduct 등은 lsusb 또는 dmesg 를 이용해서 찾으면 된다
설정 파일을 작성 또는 수정할경우 재설정을 해주어야 하는데, udevadm control --reload-rules 명령어를 이용한다
권한 설정 시, 보통은 MODE="0666" 이렇게 하는데, 간혹 리눅스의 버전이나 종류에 따라 권한이 풀리는 경우(특히 타이젠OS의 경우)가 있거나 변경이 안되는 경우가 있으니 MODE:="0666" 이렇게 작성하는 것을 추천한다
udev rules 작성예시
출처 입력

우리가 넣어줘야 하는 구성 요소는 대략 아래와 같습니다

SUBSYSTEM은 : 디바이스의 서브 시스템, ls 명령등으로 ttyUSB...등으로 확인 가능하다
SYMLINK : 장치에 부여되는 고유 이름으로, 윈도우의 바로 가기와 동일하다고 보면 된다
ACTION : 특정한 상황이 되면 작업을 하라는 의미로, ACTION=="add"은 장치가 연결되면 인식하라는 의미가 된다
KERNEL : 커널 이름으로, 디바이스 입력해준 커널 이름과 동일하면 작업을 수행한다
MODE : 장치에 할당되는 권한이다. 읽기, 쓰기 등의 권한을 말한다.

위의 구성요소를 모두 넣어도 되지만, 그렇지 않고 idVendor 와 idProduct 만 넣어도 충분히 인식 및 변경가능합니다
조금 더 디테일한 설정이나 권한을 주고 싶으면 그에 맞는 옵션을 추가해준다고 생각하면 됩니다

추가로 시리얼 넘버를 알고 넣어주고 싶은 경우에는 하단의 명령어를 이용해서 확인 가능합니다
udevadm info -a /dev/ttyUSB0 | grep '{serial}'

하단은 간단하게 idVendor 와 idProduct 값만 가지고 권한을 주는 경우 입니다
MODE="0666" 과 MODE:="0666" 두 가지가 있지만,
보통 MODE="0666" 이렇게 사용을 하지만, 간혹 저렇게 하였을 경우 권한 변경이 안되는 경우가 있습니다
그럴때는 MODE:="0666" 이렇게 변경해서 해보시면 됩니다

 

728x90

 

ATTRS{idVendor}=="test1", ATTRS{idProduct}=="1111", SYMLINK+="usb-1", MODE="0666" ATTRS{idVendor}=="test2", ATTRS{idProduct}=="2222", SYMLINK+="usb-2", MODE:="0666"

하단은 여러가지 옵션을 조금 더 추가한 경우입니다
ATTRS{idVendor}=="test1", ATTRS{idProduct}=="1111", SYMLINK+="usb-1", MODE="0666" ATTRS{idVendor}=="test2", ATTRS{idProduct}=="2222", SYMLINK+="usb-2", MODE:="0666" KERNEL=="lp[0-9]*", ATTRS{idVendor}=="test3", ATTRS{idProduct}=="3333", SYMLINK+="usblp-fix", MODE:="0666" SUBSYSTEM=="ttyUSB0",ATTRS{idVendor}=="test4", ATTRS{idProduct}=="4444", SYMLINK+="ttyusb-fix", MODE:="0666"

 

 

그리고 하단은 매번 잊어먹고 헷갈리는 usb저장장치 마운트와 rule설정 파일을
reload 할때 사용하는 명령어 입니다

 

mkdir /tmp/usb ---> 임시 폴더 생성
mount /dev/sda1 /tmp/usb ---> usb 저장장치 마운트
cd /tmp/usb ---> 경로 이동
mount -o remount,rw / ---> remount
udevadm control --reload-rules  --> rules 설정을 재적용 할때 사용


항상 이거했다 저거했다 정신이 없어서 매번 같은 실수를 반복하는
제가 한심해서 일단 기록 및 저장합니다

 



읽어주셔서 감사합니다
댓글과 공감은 저에게 큰 힘이 됩니다

 

728x90
728x90