정적 이름으로 USB 장치를 바인딩하는 방법은 무엇입니까?


43

Arduino가있어 때로는 바인딩되어 /dev/ttyUSB0다른 시간에 바인딩되어 /dev/ttyUSB1스크립트가 실패합니다.

내 장치가있을 수있는 모든 가능성을 열거하고 싶지는 않지만 정적 위치에 바인딩해야합니다 (예 :) /dev/arduino.

어떻게하면 되나요?


4
VID & PID에 의해 올바른 고안에 symlink / dev / arduino를 할당하는 간단한 udev-rule을 작성하십시오.
Eddy_Em


답변:


41

제안한대로 일부 udev 규칙을 추가 할 수 있습니다. /etc/udev/rules.d/10-local.rules포함하도록 편집했습니다 :

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"

다음을 실행하여 장치의 변수를 확인할 수 있습니다

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)

http://www.reactivated.net/writing_udev_rules.html에서 읽을 수있는 더 자세한 가이드가 있습니다


매력처럼 일했다. 한 가지 질문 : 종료하는 방법 udevam? my_uart아래에 심볼릭 링크 가 생성 된다는 점에 유의해야 합니다 /dev/my_uart. 나는 처음으로 썼는데 충분 /dev/arduino하지만 실패했습니다 arduino.
k0pernikus

udevadm완료되면 스스로 종료해야합니다.
Kotte

그런 다음 알 수없는 이유로 보고서를 생성하는 동안 터미널 세션을 내 라즈베리 파이로 고정했습니다.
k0pernikus

35

위의 규칙 구문은 일부 배포판에서는 작동하지만 광산에서는 작동하지 않습니다 (라즈 비아 어). 모든 인과 아웃을 설명하는 단일 문서를 찾지 못했기 때문에 여기 에서 찾을 수있는 자신 만의 글을 썼습니다 . 이것이 비등하는 것입니다.
1. ttyUSB에 무엇이 있는지 확인하십시오 :

dmesg | grep ttyUSB  

2. 장치의 모든 속성을 나열하십시오.

udevadm info --name=/dev/ttyUSBx --attribute-walk

(물론 x 대신 장치 번호로). 고유 식별자 세트 (예 : idVendor + idProduct)를 선택하십시오. idVendor 및 idProduct가 동일한 장치가 둘 이상인 경우 SerialNumber가 필요할 수도 있습니다. 일련 번호는 각 장치마다 고유해야합니다.
3. 다음 /etc/udev/rules.d/99-usb-serial.rules과 같은 줄을 가진 파일 을 만듭니다 :

SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name" 

(일련 번호가 필요하지 않으며 물론 2 단계에서 찾은 idVendor 및 idProduct의 번호가 필요하다고 가정합니다.
4. 새 규칙을로드합니다.

sudo udevadm trigger

5. 무슨 일이 있었는지 확인하십시오 :

ls -l /dev/your_device_name  

심볼릭 링크가 ttyUSB 번호를 보여줍니다. 이 경우 /dev/ttyUSB1누가 소유하고 누가 어떤 그룹에 속하는지 확인하십시오.

ls -l /dev/ttyUSB1   

그런 다음 그것의 재미를 위해 :

udevadm test -a -p  $(udevadm info -q path -n /dev/your_device_name)

idVendoridProduct정확히 같은 경우 해결책이 있습니까? (동일한 모델의 USB에 UART 모듈에 연결된 2 개의 센서)
Steven Lu

@StevenLu 예, 2 단계를 참조하십시오. udevadm info --name=/dev/ttyUSB1 --attribute-walk두 장치를 모두 수행 하고 일련 번호를 찾으면 각 장치마다 고유해야합니다. 센서에 일련 번호가 없으면 센서를 지정할 수 있습니까?
RolfBly

굉장합니다. 다시 시도하면 다시보고하겠습니다.
Steven Lu

USB-UART 동글에 대한 $ 2의 일련 번호는 0001입니다. 놀랍습니다. 출력 프로토콜을 기반으로 센서를 식별 해야하는 것 같습니다.
Steven Lu

@StevenLu 불운. FTDI USB-UART 변환기에는 고유 한 일련 번호 인 AFAIK가 있습니다. 약간의 추가 비용이 들지만 개발 시간이 줄어 듭니다.
RolfBly

9

다중 동일 USB 장치 문제

네 대의 카메라가있는 Rasperry Pi가 있습니다. 나는 fswebcam카메라를 /dev/video0.. 로 식별하는 pix를 사용 video3합니다. 때때로 카메라는 video0, vide02, video4그리고 video6하지만 우리는 지금 그것에 대해 잊지 수 있습니다.

예를 들어 video0사진을 캡션하기 때문에 항상 동일한 카메라가 되도록 카메라 번호를 식별하려면 영구 ID가 필요합니다 . 불행하게도 부팅시에 카메라가 video0..으로 열거 video3되지만 항상 같은 방식으로 나타나지는 않습니다.

카메라는 모두 동일한 ID와 일련 번호를 갖습니다.

이 문제에 대한 해결책은 udev 규칙과 관련이 있지만 많은 낚시 고리가 있습니다.

명령을 발행하면

udevadm info –attribute-walk –path=/dev/video0

당신은 많은 양의 출력을 얻지 만 두드러진 비트는

KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.

커널 비트는 USB 허브 포트입니다. 4 대의 카메라에는 4 개의 카메라가 있습니다. 재부팅시 변경되지 않지만 video{x}포트와 관련된 포트 변경 될 수 있습니다.

따라서 비디오 번호를 USB 허브 포트에 연결하려면 udev 규칙이 필요합니다.

KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0” 

단순 해 보인다 – 카메라에 액세스

fswebcam –d  $realpath /dev/camera0

작동하지 않는 경우를 제외하고 – 이것을 udev 규칙에 넣고 시스템이 다른 포트에 video0 (부팅시)을 할당 한 경우 udev 규칙은 무시됩니다. 에 대한 심볼릭 링크는 /dev/camera0기본적으로 말합니다 no such device. 광장 하나.

우리가 원하는 것은 심볼릭 링크를 video{x}숫자가 아닌 USB 허브 주소에 바인딩하는 것 입니다. 파이썬 프로그램이 필요했습니다.

첫 번째 단계는

fswebcam –d /dev/video${x}  tst.jpg

x1 내지 8의 존재 tst.jpg동영상 번호에 카메라가 있는지 각각의 호출 후에 식별한다. 여기에서 활성 비디오 번호 목록을 만듭니다. 내 경험은 그것이 내가 사용한 카메라 0,1,2,3이거나 0,2,4,6카메라라는 것입니다.

물론 다른 프로세스를 사용하여이 목록을 작성할 수도 있습니다.

그런 다음 목록의 각 비디오 번호에 대해

udevadm info –attribute-walk –path=/dev/videox > dd

과 추출 KERNELS= line에서 dd. 이 과정에서 카메라의 USB 포트 주소 목록이 나타납니다. 다음 단계에서 항상 동일한 순서로 처리하도록이 목록을 정렬하십시오. 이것을 "주소 목록"이라고합니다.

udevadm … > dd일을 다시 실행하고 다음과 같은 목록을 만드십시오.

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.

이제 주소 목록을 살펴보십시오. 각 항목마다 비디오 목록에서 해당 항목을 찾으십시오. 다음과 같은 줄 모음처럼 보이는 새 목록을 만듭니다.

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”

x (기호 링크 번호)는 주소 목록의 시퀀스 번호로 대체됩니다.

이제 작동하는 udev 규칙이 있습니다. 부팅시 해당 비디오 포트에 할당 된 비디오 번호에 관계없이 USB 허브 주소에 연결된 심볼릭 링크입니다.

최종 목록을 파일로 작성하십시오 /etc/udev/rules.d/cam.rules. 실행 udevadm trigger하여 실행 하면 작업이 완료됩니다. /dev/camera2비디오 번호에 관계없이 동일한 카메라 (USB 포트)가됩니다.


유닉스 스택 교환에 오신 것을 환영합니다. 마크 다운을 사용하여 답변을 형식화하십시오. 방금 했어요 또한 우리는 그에 대한 답을 원합니다. 이것은 블로그 항목과 비슷하지만 (전적으로 나쁘지 는는 않지만) 작동하지 않는 접근법에 대해 먼저 읽는 것이 도움이되지 않습니다. 그 부분을 긁을 수 있습니다.
k0pernikus

죄송합니다. 나는 신입이다. 이 문제를 몇 달 동안 조사했습니다. 나는 같은 문제로 어려움을 겪고있는 다른 사람들을 찾았고 나에게 맞는 대답을 찾지 못했습니다. 알다시피, 내가 이런 것을 게시하도록 조언 할 곳은 어디입니까? 나는 제 자신을 제지하고 파이썬 소스를 포함하지 않았습니다 :-)
Ian Boag

1

또한에서 고유 한 기기를 찾을 수있었습니다 /dev/serial/by-id. 아직 재부팅을 시도하지는 않았지만 해당 디렉토리의 파일은 적절한 장치 파일 ( ttyACM[0-9])에 대한 링크 일뿐입니다 .`

나는 Raspberry Pi에서 아치 리눅스를 사용하고 있지만 find"Arduino"를 포함하는 파일 이름 을 사용하여 우연히 발견되었습니다 . 내 파이썬 프로그램은 해당 파일을 장치로 사용하여 Arduino에서 데이터를 읽거나 쓰는 데 사용됩니다 (지금까지는 단일 Pi에서 2 개).


0

위의 내용은 저에게 효과적이며 / etc / fstab에 항목을 배치 한 후 장치를 자동 마운트했습니다 (또한 스틱을 제거한 후 umount를 호출합니다)

/ etc / fstab

# See /etc/udev/rules.d/5-usb-disk.rules
/dev/backup     /vol/backup     ext4    defaults,errors=remount-ro 0       1

고양이 /etc/udev/rules.d/5-usb-stick.rules

#
# the next line creates a symlink to this disk drive called /dev/backup 
# i.e.
#   root:# ls -la /dev/backup 
#   lrwxrwxrwx 1 root root 3 Jul 22 19:33 /dev/backup -> sg0

# Backup usb stick - create /dev/backup
# ATTRS{model}=="Cruzer Blade    "
ACTION=="add", ATTRS{model}=="Cruzer Blade    ", SYMLINK+="backup"

# Clean up after removal  
ACTION=="remove", ATTRS{model}=="Cruzer Blade    ", RUN+="/bin/umount /vol/backup"

내 USB 스틱을 삽입하면 다음과 같은 결과가 나타납니다.

root:# mount | grep sd
/dev/sda1 on /vol/backup type ext4 (rw,relatime,errors=remount-ro,data=ordered)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.