그래서 udev를 파고들다가 문제에 부딪혔습니다.
기본적인 전제는 이해한 것 같습니다(틀렸다면 정정해 주세요). 장치는 시스템 시작 시 또는 얼마 후에 연결됩니다. Udev는 일치하는 항목을 찾기 위해 모든 규칙을 면밀히 조사합니다. 일치하는 항목을 찾으면 요청된 모든 작업을 수행하고 마지막 항목에 도달할 때까지 규칙 목록을 계속 진행합니다. 그런 다음 다음 장치에서 시작됩니다.
이제 2개의 인터페이스를 생성하는 USB 장치가 있습니다. 붙여서 보면 can0 , can1 둘다 나옵니다 /sys/class/net/
. 하지만 에는 /dev
이와 관련된 항목이 하나만 있습니다 /dev/bus/usb/002/00X
.
이제 이것이 내 문제가 있는 곳입니다. 저는 이러한 각 인터페이스에 특정 이름을 지정하고 싶습니다. 나는 하나가 항상 다른 것보다 먼저 온다는 것을 알고 있습니다. 아무것도 하지 않으면 이름이 can0
및 로 지정됩니다 can1
. udev 규칙을 넣으면 첫 번째 규칙의 이름이 올바르게 바뀌지만 로그를 보면 dmesg
두 번째 규칙에는 커널 이름이 너무 많기 때문에 can0
(이 없기 때문에 can1
) 오류가 발생합니다.
이 문제를 해결하는 방법? udevadm
목록에 장치가 하나만 있으므로 /dev
속성별로 구별할 수 없는 것 같기 때문에 도움이 되지 않습니다.
출력은 lsusb -v
다음과 같습니다.
Bus 001 Device 011: ID 0c72:0011 PEAK System
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0c72 PEAK System
idProduct 0x0011
bcdDevice 0.00
iManufacturer 1 PEAK-System Technik GmbH
iProduct 2 PCAN-USB Pro FD
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 111
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 4 Config00
bmAttributes 0x80
(Bus Powered)
MaxPower 240mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 6
bInterfaceClass 0 (Defined at Interface level)
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 5 PCAN-USB Pro FD CAN
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 6
bInterfaceClass 0 (Defined at Interface level)
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 6 PCAN-USB Pro FD LIN
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x84 EP 4 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x04 EP 4 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x85 EP 5 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x05 EP 5 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x86 EP 6 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x06 EP 6 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
bNumConfigurations 1
Device Status: 0x0000
(Bus Powered)
답변1
에 표시된 대로 lsusb -v
인터페이스의 이름은 서로 다릅니다. 이는 추가로 확인할 수 있습니다.
udevadm info -a -p $(udevadm info -q path -n can0)
udevadm info -a -p $(udevadm info -q path -n can1)
따라서 ATTR{interface}
를 사용하여 구별할 수 있습니다.
SUBSYSTEM=="usb", ATTRS{idVendor}=="0c72", ATTRS{idProduct}=="0011", ATTR{interface}=="PCAN-USB Pro FD CAN"
ATTR
위에서는 및 키의 특정 조합을 사용했습니다 ATTRS
. 이는 현재 또는 현재 및 상위 장치에서 값을 찾고 있기 때문에 중요합니다.http://www.reactivated.net/writing_udev_rules.html.
인터페이스 이름이 동일한 경우 로 구분할 수 있습니다 ATTR{bInterfaceNumber}
.