나는RTL8153USB 이더넷 어댑터를 기반으로 cdc_ether
이 드라이버가 기본적으로 사용됩니다.
r8152
Realtek의 Linux 드라이버 소스에 표시된 대로 사용자 정의 udev 규칙을 생성하여 로드할 수 있는 이 드라이버를 사용하고 싶습니다 .
하지만 어댑터를 연결 cdc_ether
하고 r8152
모듈이 로드될 때 혼란스러운 부분이 있습니다. 내 질문은,
- 왜?
- 로드를 담당하는 udev 규칙을 찾는 방법은 무엇입니까
cdc_ether
? - 이 모듈 로드를 어떻게 중지할 수 있나요? 이 경우 두 개의 모듈을 로드할 필요가 없기 때문입니다.
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 -a
USB 이더넷 어댑터를 분리 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