Udev가 단일 USB 장치에 대해 두 개의 커널 모듈을 로드하는 이유는 무엇입니까?

Udev가 단일 USB 장치에 대해 두 개의 커널 모듈을 로드하는 이유는 무엇입니까?

나는RTL8153USB 이더넷 어댑터를 기반으로 cdc_ether이 드라이버가 기본적으로 사용됩니다.

r8152Realtek의 Linux 드라이버 소스에 표시된 대로 사용자 정의 udev 규칙을 생성하여 로드할 수 있는 이 드라이버를 사용하고 싶습니다 .

하지만 어댑터를 연결 cdc_ether하고 r8152모듈이 로드될 때 혼란스러운 부분이 있습니다. 내 질문은,

  1. 왜?
  2. 로드를 담당하는 udev 규칙을 찾는 방법은 무엇입니까 cdc_ether?
  3. 이 모듈 로드를 어떻게 중지할 수 있나요? 이 경우 두 개의 모듈을 로드할 필요가 없기 때문입니다.

Udev 규칙의 한 줄

ACTION=="add", DRIVER=="r8152", ATTR{idVendor}=="2357", ATTR{idProduct}=="0601", ATTR{bConfigurationValue}!="$env{REALTEK_NIC_MODE}", ATTR{bConfigurationValue}="$env{REALTEK_NIC_MODE}"

DRIVER==섹션은 필수가 아닙니다.

답변1

ACTION=="add", DRIVER=="r8152", ATTR{idVendor}=="2357", ATTR{idProduct}=="0601", ATTR{bConfigurationValue}!="$env{REALTEK_NIC_MODE}", ATTR{bConfigurationValue}="$env{REALTEK_NIC_MODE}"

udev 규칙은 다음을 의미합니다. " idVendor값이 2357이고 idProduct값이 0601인 장치(드라이버 "r8152"에 의해 관리됨)가 시스템에 추가될 때 bConfigurationValue환경 변수에 정의된 값이 아닌 경우 해당 값으로 REALTEK_NIC_MODE설정합니다 ."bConfigurationValue

즉, 이 udev 규칙은 r8152 드라이버를 로드하지 않지만 필요한 경우 장치를 해당 드라이버에 대한 올바른 모드로 전환합니다.

새 장치가 추가되면 Linux 커널은 기본적으로 modprobe요청하는 모듈의 "이름"으로 인코딩된 장치의 하드웨어 ID로 작동합니다. 그런 다음 이 "이름"은 modprobe각 모듈에 모듈 별칭으로 포함된 와일드카드 문자열과 비교됩니다. 이 명령은 빠른 검색을 위해 depmod이러한 별칭을 수집하고 저장합니다 . /lib/modules/<kernel version>/modules.alias[.bin]이 명령을 사용하여 커널 모듈에 포함된 별칭 문자열을 볼 수 있습니다 modinfo.

USB 이더넷 어댑터의 경우 "이름"은 usb:v2357p0601d.... 불행하게도 cdc_ether모듈에 일치하는 와일드카드 별칭이 있습니다.

에 정의된 모든 별칭은 /etc/modprobe.d내장 모듈 자체의 별칭보다 우선합니다. 따라서 이더넷 어댑터와 일치하고 r8152모듈이 로드되도록 하는 별칭을 지정할 수 있습니다.

다음과 같이 추가해 보세요 /etc/modprobe.d/usbnic.conf.

alias usb:v2357p0601d*dc*dsc*dp*ic*isc*ip*in* r8152

그런 다음 루트로 실행하고 depmod -aUSB 이더넷 어댑터를 분리 r8152하고 cdc_ether모듈을 제거한 다음 이더넷 어댑터를 다시 연결하고 무슨 일이 일어나는지 확인하십시오. r8152 모듈만 로드된다면 괜찮습니다.

여전히 로드 중인 경우 cdc_ether별칭을 가장 구체적으로 만들기 위해 별칭을 더 구체적으로 지정해야 할 수 있습니다(예: 별표 중 하나 이상을 실제 값으로 바꿔야 함). 최고의 경기.

업데이트: 다음은 모듈 별칭 형식에 대한 설명입니다.http://people.skolelinux.org/pere/blog/Modalias_strings___a_practical_way_to_map__stuff__to_hardware.html

답변2

최근 커널에는 이 문제에 대한 패치가 있습니다:https://lkml.org/lkml/2017/9/25/711

관련 정보