저는 v2.6.33.7 커널이 있고 USBNET 및 CDC_ETHER 모듈은 없는 상당히 오래된 임베디드 Linux 드라이버 시스템을 가지고 있습니다. USBNET 모듈에 의해 로드되는 CDC 드라이버와 함께 작동하는 특정 USB-LAN 스틱을 연결할 수 있도록 이 모듈을 컴파일했습니다. 이제 모듈을 이 폴더에 복사합니다 /lib/modules/2.6.33.7/kernel/drivers/net/usb
.
cdc_ether 모듈은 를 사용하여 로드할 수 있지만 insmod
오류 modprobe
가 발생합니다.
usbnet 모듈을 삽입하면 다음과 같이 dmesg
표시됩니다
usbnet: exports duplicate symbol usbnet_resume (owned by kernel)
.
또한 usbnet 모듈을 제거하려고 하면 다음 오류가 발생합니다.
FATAL: Module usbnet is builtin
cdc_ether 모듈을 설치하면 dmesg
성공이 표시됩니다.
eth1: register 'cdc_ether' at usb-mxc-ehci.0-1, CDC Ethernet Device, fc:8f:c4:06:e8:9c usbcore: registered new interface driver cdc_ether
cdc_ether 모듈을 수동으로 시작하면 eth1
시스템에서 사용할 수 있는 이더넷 어댑터를 갖게 되며 이를 다시 사용할 수 있습니다 ifconfig
.
스틱을 삽입하면 모듈을 자동으로 로드하는 방법은 무엇입니까? 드라이버 규칙을 살펴보니 udev
커널 모듈을 로드하는 것 같고 module.* 파일도 살펴보니 /lib/modules/2.6.33.7/
... 행운이 없습니다. 제대로 작동하려면 무엇이 빠졌나요?
/proc/config.gz
방금 컴파일 시간 구성 파일에서 usbnet 모듈을 찾는 것이 내 커널을 컴파일한 회사에서 내장해야 한다는 것을 알았습니다 . 거기에 명시된 CONFIG_USB_USBNET=y
대로 기본적으로 스틱을 삽입할 때 cdc_ether 모듈 udev 규칙을 실행해야 합니다. 오른쪽?
modules.*
나는 빌드된 파일을 가져와서 이전 커널 폴더에 넣을 수 있었습니다 /lib/modules/2.6.33.7/
. 그 결과 modprobe
modprobe를 사용하여 모듈을 로드하려고 할 때 이제 모듈이 알려지게 됩니다.
usbnet 모듈이 내장되어 있기 때문에 부팅 시 바로 실행됩니다. 그런 다음 cdc_ether 모듈을 시작하십시오. 모드프로빙 작업을 마친 후 핫스왑 메커니즘이 필요했습니다. 코딩 편의를 위해 cdc_ether를 에 추가했습니다 /etc/modules
. 이 모듈은 시작 시 로드됩니다. 네트워크 구성 파일을 올바르게 편집했지만 /etc/network/interfaces
새 인터페이스는 eth1
이미 구성되어 있기 때문에 시작 시 IP를 가져오지 않습니다. 그래서 제거되는 모든 eth 장치의 주소를 새로 고치는 udev 규칙을 추가했습니다.
#ACTION=="add",SUBSYSTEM=="usb",DRIVER=="cdc_ether",RUN+="/sbin/modprobe cdc_ether"
ACTION=="add",SUBSYSTEM=="net",RUN+="/sbin/ifup %k"
ACTION=="remove",SUBSYSTEM=="net",RUN+="/sbin/ifdown %k",RUN+="/sbin/ip addr flush %k"
핫플러그 모듈 로딩이 작동하지 않아서 시스템 시작 시 로딩을 고집해야 하는 것 같습니다.