udev에서 심볼릭 링크 생성 시 번호 다시 매기기

udev에서 심볼릭 링크 생성 시 번호 다시 매기기

저는 voyage linux(Debian Squeeze 기반)를 실행하는 ALIX 3d2 보드에 USB 셀룰러 모뎀을 연결했습니다. 모뎀은 자신을 TTY 장치로 등록하므로 기본적으로 udev는 .txt 파일에 "ttyUSB0"부터 "ttyUSB3"까지 이름이 붙은 TTY 장치를 생성합니다 /dev. 그러나 다른 USB-직렬 장치가 연결되어 있을 수 있으며 모뎀에 대해 알려진 참조를 원합니다. 그래서 모뎀에서 연결을 설정하기 위한 간단한 udev 규칙을 작성했습니다. /dev/ttyModem{0-3}그러나 자동으로 번호 매기기를 처리하는 방법을 찾을 수 있는 유일한 방법은 4포트 USB-직렬 연결을 %n생성하기 위해 존재하는 udev의 변수를 이용하는 것이었습니다. /dev/ttyModem{4-7}모뎀 이전의 어댑터가 열거됩니다. %e내 필요에 맞는 이전 udev 문서에서 변수에 대한 참조를 찾았지만 얼마 전에 제거된 것 같습니다.

다행스럽게도 각 tty 장치에는 장치에서 참조할 수 있는 포트 번호가 있으므로 수동으로 번호 지정을 처리할 수 있어야 합니다. 포트 번호를 기반으로 링크를 생성할 수 있지만 포트 번호와 USB 공급업체 ID + 제품 ID를 모두 사용하려고 할 때마다 규칙이 더 이상 적용되지 않습니다. 이러한 속성은 서로 다른 장치에서 식별되기 때문에 어딘가에서 "단일 상위 장치" 규칙을 위반하고 있는 것 같습니다. udevadm info하지만 제가 아는 한 모든 속성은 하나의 장치와 해당 상위 장치에서 나와야 합니다.

제가 적용한 규칙은 다음과 같습니다.

이 규칙은 효과가 있고 제가 사용하기 시작한 규칙이지만 생성되는 숫자는 0에서 시작하지 않을 수 있습니다.

SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", SYMLINK+="ttyUSBID%n"

그래서 포트 번호를 지정하기 위해 이와 같은 네 가지 규칙을 사용해 보았으나 실패했습니다. "하나의 상위 장치" 규칙을 위반했기 때문이라고 생각합니다.

SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{port_number}=="0", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", SYMLINK+="ttyFailingPort0"

이 규칙의 각 조건은 동일한 노드에서 나와야 하므로 이 규칙(예상대로 작동)은 상위 노드를 참조할 수 있어야 합니다.

SUBSYSTEMS=="usb-serial", KERNELS=="ttyUSB*", ATTRS{port_number}=="0", SYMLINK+="ttyPortNumberChild0"

그러나 이 규칙은 실패하며 그 이유를 모르겠습니다.

SUBSYSTEMS=="usb-serial", KERNELS=="ttyUSB*", ATTRS{idVendor}=="1199" ATTRS{port_number}=="0", SYMLINK+="ttyFailingPortNumber0

udevadm info --attribute-walk이것은 의 출력입니다.포트 0,포트 1,포트 2,포트 3. 상단의 두 번째 장치에는 포트 번호가 포함되고, 네 번째 장치에는 USB 식별 정보가 포함됩니다.

이건 좀 알겠는데XY 문제, 따라서 모뎀에 대한 상수 이름을 지정하는 더 좋은 방법을 알고 있다면 언제든지 답변으로 게시해 주십시오.

답변1

모뎀 규칙은 ACTION=="add", SUBSYSTEM=="tty"idVendor, idProduct 및 port_number 속성과 결합되어야 합니다.

ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="0", SYMLINK+="ttyPort0"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="1", SYMLINK+="ttyPort1"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="2", SYMLINK+="ttyPort2"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", ATTRS{port_number}=="3", SYMLINK+="ttyPort3"

/dev/serial/by-id또한 (모뎀에 고유한 일련 번호가 있는 경우 도움이 됨) 또는 /dev/serial/by-path(모뎀을 항상 동일한 USB 포트에 연결하는 경우 작동함)의 기존 심볼릭 링크가 귀하의 목적에 적합한지 확인하십시오.

답변2

여러 규칙 간에 구성을 분할하여 "단 하나의 상위" 제한을 해결했습니다. 관심 있는 분들을 위해 제가 작성한 코드는 다음과 같습니다.

ACTION!="add", GOTO="modem_rules_end"
SUBSYSTEM!="tty" GOTO="modem_rules_end"

#ModemType1
ATTRS{idVendor}=="1199", ATTRS{idProduct}=="0028", GOTO="type1_rules_begin"
GOTO="type1_rules_end"
LABEL="type1_rules_begin"

ATTRS{port_number}=="0", SYMLINK:="ttyType1_0"
ATTRS{port_number}=="1", SYMLINK:="ttyType1_1"
ATTRS{port_number}=="2", SYMLINK:="ttyType1_2"
ATTRS{port_number}=="3", SYMLINK:="ttyType1_3"

LABEL="type1_rules_end"
LABEL="modem_rules_end"

답변3

/dev/ttyUSB* 번호를 놓고 경쟁하는 다른 USB tty 장치와 시스템의 번호를 일치시키기 위해 USB 셀룰러 모뎀을 얻는 데 비슷한 문제가 있었습니다. 제 경우에는 Telit 칩셋을 탑재한 EuroTech ReliaCELL 10-20-32입니다. 나는 여기에서 몇 가지 아이디어를 사용하여 이 문제를 해결했고 내 .rules에서 다음 발췌문을 얻었습니다.

SUBSYSTEMS=="usb", DRIVERS=="option", ATTRS{bInterfaceNumber}=="00", SYMLINK+="ttyUSB_modem_port_0"
SUBSYSTEMS=="usb", DRIVERS=="option", ATTRS{bInterfaceNumber}=="01", SYMLINK+="ttyUSB_modem_port_1"
SUBSYSTEMS=="usb", DRIVERS=="option", ATTRS{bInterfaceNumber}=="02", SYMLINK+="ttyUSB_modem_port_2"
SUBSYSTEMS=="usb", DRIVERS=="option", ATTRS{bInterfaceNumber}=="03", SYMLINK+="ttyUSB_modem_port_3"

답변4

내 UNIX 컴퓨터에 액세스하기 위해 여러 개의 동일한 USB 직렬 어댑터를 사용하여 설정했습니다.

마지막 줄의 KERNELS 속성은 내 "Prolific Technology Inc."에서 나온 것 같습니다. 허브는 두 개의 허브로 구성되며, 하나는 다른 하나와 연결됩니다.

KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.5:1.0", SYMLINK+="ttyUSB_Sol1"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.6:1.0", SYMLINK+="ttyUSB_Sol2"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.7:1.0", SYMLINK+="ttyUSB_Sol3"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.4:1.0", SYMLINK+="ttyUSB_Sol4"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.3:1.0", SYMLINK+="ttyUSB_HPUX1"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.2:1.0", SYMLINK+="ttyUSB_HPUX2"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", KERNELS=="1-1.2.1.4:1.0", SYMLINK+="ttyUSB_HPUX3"

관련 정보