Ubuntu 16.04에서 커널 장치 노드(플러그된 포트를 기반으로 한 고정 USB 인터페이스 이름) 변경

Ubuntu 16.04에서 커널 장치 노드(플러그된 포트를 기반으로 한 고정 USB 인터페이스 이름) 변경

저는 Raspberry Pi에서 USB 네트워크 인터페이스(USB를 통한 이더넷)를 사용하고 있습니다. 목표는 기본적으로 Raspberry Pi에서 제공하는 4개의 USB 포트를 사용하여 TFTP U-boot를 통해 여러 Linux 시스템을 동시에 플래시하는 것입니다.

이제 각각 IP 주소가 있는 4개의 USB 인터페이스가 정의되었습니다. 이미 tftp서버를 설정했어요 . 잘 작동하지만 여러 Linux 시스템을 동시에 연결하려고 하면 DHCP가 인터페이스를 혼합하는 것 같습니다(예: 오래된 것이 usb0새로운 것이 되고 usb1, 오래된 것이 usb1새로운 것이 됩니다 usb0). 이것이 임대에 혼란을 야기한다고 생각합니다. TFTP Exchange가 소프트 락업에 걸린 것 같습니다.

글쎄요, 그런 일은 일어날 수 없습니다. 따라서 저는 연결된 USB 포트에 따라 장치에 고정된 이름을 부여하기 위해 4개의 udev 규칙을 설정했습니다. 다음과 같이:

SUBSYSTEM=="usb", ACTION=="add", DEVPATH=="*.2", NAME="usb0"

(저는 다음을 udevadm info사용하여 이 값을 얻었습니다.

당연히 네트워크 인터페이스의 이름이 되므로 장치 이름을 바꿔야 합니다. 따라서 이 경우 심볼릭 링크는 아무 소용이 없습니다(내가 모르는 것이 없는 한).

그러나 systemd-udevd장치 이름을 바꾸는 것은 허용되지 않습니다.

Feb 28 17:25:01 pi systemd-udevd[3749]: NAME="usb2"는 무시됩니다. 커널 장치 노드의 이름을 바꿀 수 없습니다. /lib/udev/rules.d/99-systemd.rules:49에서 수정하십시오.

버전 15.04 이전에도 이것이 가능했다는 것을 온라인에서 읽었으므로 이 이전 동작을 복원할 수 있는 방법이 있어야 한다고 생각합니다.

어떤 조언이라도 대단히 감사하겠습니다.

답변1

명확히 해야 할 몇 가지 사항이 있습니다.

  1. 장치에는 트리 계층 구조가 있습니다. USB 이더넷 어댑터가 다음과 같이 나타납니다.많은 종류의서로 다른 하위 시스템의 "장치"는 서로 다른 계층을 나타냅니다.

    • subsystem usb, devtype usb_device– 포트에 연결된 USB 장치;
    • subsystem usb, devtype usb_interface– USB 장치가 제공하는 특정 기능(“인터페이스”라는 용어는 네트워킹과 다른 의미를 가집니다!)
    • 하위 시스템 net– 실제 네트워크 인터페이스(이번에는 일반 네트워크 의미)입니다.

    (네트워크 장치는 usb_interface의 하위이며, 그 자체는 usb_device의 하위입니다.)

  2. 모든 장치에 네트워크 인터페이스와 같은 "장치 노드"가 있는 것은 아닙니다.원하지 않는다나타나다 /dev.(불행한 일이지만 그렇지 않습니다.)

  3. 네트워크 인터페이스만 이름을 바꿀 수 있습니다. 다른 장치는 불가능합니다. 이 정책은 Linux가 장치 노드를 생성하는 udev에서 장치 노드를 생성하는 커널 자체로 전환했을 때 더욱 제한적이 되었습니다. (예, 기술적으로는 mv /dev/foo /dev/bar여전히 유효하지만정책udev는 커널이 내보낸 내용을 망치지 않습니다. )

따라서 포인트 1이 중요합니다. 전체 게시물은 네트워크 인터페이스(subsystems에 속함 net)에 대해 이야기하지만 udev 규칙은 하위 시스템과 일치 usb하므로 /sys에서 일부 추상 USB 장치의 이름을 바꾸려고 합니다.

규칙에 가 구체적으로 있어야 합니다 SUBSYSTEM=="net". 상위 장치를 추가로 일치시키려면 다음을 사용할 수 있습니다("S" 참고).SUBSYSTEMS=="usb"

관련 정보