我有一个相当过时的嵌入式 Linux 驱动系统,带有 v2.6.33.7 内核,没有 USBNET 和 CDC_ETHER 模块。我编译了这些模块,以便能够连接某个 USB-LAN 棒,该棒与 CDC 驱动程序配合使用,该驱动程序由 USBNET 模块加载。现在我将模块复制到该文件夹中/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 模块。让 modprobing 工作后,我需要热插拔机制。为了便于编码,我将 cdc_ether 添加到了/etc/modules
.该模块在启动时加载。我正确编辑了网络配置文件/etc/network/interfaces
,但新接口eth1
在启动时永远不会获得其 IP,因为它已经以某种方式配置了。因此,我添加了一个 udev 规则,该规则会刷新每个被删除的 eth 设备的地址。
#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"
我无法让热插拔模块加载工作,这就是为什么我似乎必须坚持在系统启动时加载。