为何Udev为RTL8153 USB网卡加载两个内核模块及解决方法咨询
我来逐个拆解你的问题,这是RTL8153适配器很常见的驱动冲突场景,解决方案都很明确:
1. 为什么cdc_ether与r8152模块会同时被加载?
RTL8153这款USB网卡的设计比较特殊——它原生兼容USB CDC-Ethernet标准协议,内核自带的cdc_ether是通用USB网络设备驱动,会匹配所有符合CDC-ETH类规范的USB设备;而r8152是Realtek为自家RTL8153定制的专用驱动,通过设备的idVendor(2357)和idProduct(0601)精准匹配。
当你插入适配器时,内核会同时触发两个匹配逻辑:
- 检测到设备属于USB网络设备类,触发
cdc_ether的modalias自动匹配 - 设备的vendor/product ID命中
r8152的驱动匹配列表
所以两个模块都会被加载,这是内核驱动匹配机制的正常表现。
2. 如何找到负责加载cdc_ether的udev规则?
其实cdc_ether的加载大多不是由udev规则直接触发的,而是内核的modalias机制(通过硬件信息自动匹配驱动模块)。不过如果要排查相关udev规则,可以按以下步骤操作:
- 先获取网卡的udev属性链:运行
udevadm info -a /sys/class/net/<你的网卡接口名>,替换<你的网卡接口名>为实际名称(比如enxabcdef123456),在输出中查找和cdc_ether相关的匹配项 - 搜索系统中的udev规则文件,主要集中在两个目录:
/lib/udev/rules.d/:系统默认的规则集合/etc/udev/rules.d/:用户自定义规则
用命令快速搜索:grep -r "cdc_ether" /lib/udev/rules.d/ /etc/udev/rules.d/
- 另外,部分通用网络设备规则(比如
80-net-setup-link.rules)可能间接触发驱动加载,也可以检查这些文件的匹配逻辑。
如果想确认modalias的触发源,运行modinfo cdc_ether,输出里的alias字段就是它匹配的硬件标识,你的RTL8153肯定在这个列表中。
3. 如何停止加载cdc_ether,只保留r8152?
这里提供三种可靠方法,你可以根据自身场景选择:
方法1:通过udev规则强制绑定r8152,自动卸载cdc_ether
基于你提供的udev规则优化,让设备优先使用专用驱动:
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="2357", ATTR{idProduct}=="0601", RUN+="/sbin/rmmod cdc_ether", RUN+="/sbin/modprobe r8152"
将这条规则保存到/etc/udev/rules.d/99-rtl8153.rules(文件名开头数字越大,规则优先级越高),然后重新加载udev规则:
udevadm control --reload-rules && udevadm trigger
方法2:局部黑名单cdc_ether(仅针对RTL8153,不影响其他设备)
如果你还需要用cdc_ether驱动其他USB网卡,可以创建局部黑名单逻辑:
- 创建文件
/etc/modprobe.d/blacklist-rtl8153.conf - 写入以下内容:
install cdc_ether /bin/sh -c 'if echo "$(cat /sys/class/net/%k/device/modalias)" | grep -q "$(modinfo -F alias r8152 | grep 2357:0601)"; then /sbin/modprobe r8152; else /sbin/modprobe --ignore-install cdc_ether; fi'
这个脚本会判断触发cdc_ether加载的设备是否是你的RTL8153,如果是,就加载r8152而非cdc_ether;否则正常加载通用驱动。
方法3:全局黑名单cdc_ether(仅当你不需要其他CDC-ETH设备时使用)
如果你的系统里没有其他依赖cdc_ether的USB网卡,可以直接全局禁用:
在/etc/modprobe.d/blacklist.conf中添加:
blacklist cdc_ether
然后更新initramfs(不同发行版命令略有区别):
- Debian/Ubuntu系:
sudo update-initramfs -u - RHEL/CentOS/Fedora系:
sudo dracut -f
另外补充:你提供的那条udev规则里的DRIVER=="r8152"确实不是必需的,因为规则是在设备刚添加、还未绑定驱动时触发的,去掉它不会影响规则功能。
内容的提问来源于stack exchange,提问作者Arnab

