在热插拔事件中自动加载外部编译的模块

在热插拔事件中自动加载外部编译的模块

我有一个相当过时的嵌入式 Linux 驱动系统,带有 v2.6.33.7 内核,没有 USBNET 和 CDC_ETHER 模块。我编译了这些模块,以便能够连接某个 USB-LAN 棒,该棒与 CDC 驱动程序配合使用,该驱动程序由 USBNET 模块加载。现在我将模块复制到该文件夹​​中/lib/modules/2.6.33.7/kernel/drivers/net/usb

可以使用加载 cdc_ether 模块,insmodmodprobe给我一个错误。
插入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.gzusbnet 模块应该是由编译我的内核的公司内置的,正如那里所述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"

我无法让热插拔模块加载工作,这就是为什么我似乎必须坚持在系统启动时加载。

相关内容