别再折腾内核了!Ubuntu 20.04下用DKMS搞定RTL8156网卡驱动的保姆级教程

张开发
2026/4/20 11:51:40 15 分钟阅读

分享文章

别再折腾内核了!Ubuntu 20.04下用DKMS搞定RTL8156网卡驱动的保姆级教程
Ubuntu 20.04下RTL8156网卡驱动终极解决方案DKMS与巨型帧配置全指南每次内核升级后都要重新折腾网卡驱动编译时总遇到找不到header的报错这篇文章将彻底解决这些问题。我们将深入探讨DKMS这一一劳永逸的驱动管理方案特别针对RTL8156系列网卡在Ubuntu 20.04环境下的完整配置流程。1. 为什么DKMS是更好的选择传统驱动安装方式最大的痛点在于内核版本依赖性。每次内核升级后用户都需要重新编译安装驱动这不仅耗时耗力还经常因为header文件缺失等问题导致失败。DKMS(Dynamic Kernel Module Support)系统正是为解决这一问题而生。DKMS的核心优势在于自动重建当内核升级时自动重新编译驱动模块版本管理维护多个驱动版本便于回滚集中管理所有DKMS模块统一存放在/usr/src目录下依赖处理自动解决编译依赖关系对于RTL8156这类常用但内核支持不完善的硬件DKMS几乎是必选方案。我们来看一个典型的问题场景$ uname -r 5.13.0-48-generic $ sudo make make: *** /lib/modules/5.13.0-48-generic/build: No such file or directory. Stop.这正是DKMS要解决的典型问题。接下来我们将从底层原理到实践操作完整掌握DKMS的使用方法。2. 准备工作与环境配置2.1 获取正确的驱动版本RTL8156驱动通常包含在r8152驱动包中。获取途径有Realtek官网下载最新版推荐GitHub社区维护版本内核自带版本可能较旧提示避免使用过旧的驱动版本它们可能不支持巨型帧等高级功能验证驱动版本是否支持RTL8156$ grep RTL8156 ./r8152.c #define RTL8156_VERSION 2.16.12.2 系统环境准备确保系统已安装必要的编译工具和内核头文件sudo apt update sudo apt install build-essential dkms linux-headers-$(uname -r)检查DKMS服务状态$ systemctl status dkms ● dkms.service - DKMS autoinstallation service Loaded: loaded (/lib/systemd/system/dkms.service; enabled; vendor preset: enabled) Active: active (exited) since Tue 2023-05-16 10:23:45 CST; 1h ago3. DKMS详细配置与安装3.1 创建DKMS模块目录DKMS对目录结构有严格要求必须遵循特定命名规范sudo mkdir -p /usr/src/r8152-2.16.1 sudo cp -r ~/Downloads/r8152/* /usr/src/r8152-2.16.1/关键文件结构如下/usr/src/r8152-2.16.1/ ├── dkms.conf ├── r8152.c └── Makefile3.2 编写dkms.conf配置文件这是DKMS的核心配置文件内容示例如下PACKAGE_NAMEr8152 PACKAGE_VERSION2.16.1 BUILT_MODULE_NAME[0]$PACKAGE_NAME DEST_MODULE_LOCATION[0]/updates/dkms AUTOINSTALLYES REMAKE_INITRDYES CLEANrm src/PKGNAME.ko src/*.o || true各参数含义参数说明PACKAGE_NAME模块名称必须与目录名前缀一致PACKAGE_VERSION版本号必须与目录名后缀一致BUILT_MODULE_NAME构建的模块名称DEST_MODULE_LOCATION模块安装位置AUTOINSTALL是否在新内核安装时自动重建3.3 完整安装流程执行以下命令序列完成安装# 添加模块到DKMS系统 sudo dkms add -m r8152 -v 2.16.1 # 构建模块 sudo dkms build -m r8152 -v 2.16.1 # 安装模块 sudo dkms install -m r8152 -v 2.16.1 # 更新模块依赖关系 sudo depmod -a # 加载模块 sudo modprobe r8152验证安装是否成功$ dkms status r8152, 2.16.1, 5.13.0-48-generic, x86_64: installed4. 巨型帧配置与疑难排解4.1 检查驱动加载情况首先确认正确的驱动已加载$ ethtool -i enx0826ae31ad1b driver: r8152 version: 2.16.1 firmware-version: bus-info: usb-0000:00:14.0-1如果显示的是cdc_ncm而非r8152说明驱动未正确加载。4.2 解决设备命名问题创建udev规则文件/usr/lib/udev/rules.d/50-usb-realtek-net.rulesACTIONadd, SUBSYSTEMnet, DRIVERSr8152, NAMEethX然后重新加载模块sudo udevadm control --reload-rules sudo systemctl restart systemd-modules-load.service4.3 配置巨型帧检查当前MTU值$ ip -d link show enx0826ae31ad1b 5: enx0826ae31ad1b: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:26:ae:31:ad:1b brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 9194设置巨型帧以9000字节为例sudo ip link set enx0826ae31ad1b mtu 9000永久生效需要修改网络配置文件# /etc/netplan/01-netcfg.yaml network: version: 2 renderer: networkd ethernets: enx0826ae31ad1b: mtu: 90005. 内核升级后的验证与维护DKMS最大的优势在内核升级时体现。当系统内核更新后只需sudo apt upgradeDKMS会自动检测并重建所有已注册的模块。验证方法# 检查新内核下的模块状态 $ sudo dkms status -k $(uname -r) r8152, 2.16.1, 5.13.0-51-generic, x86_64: installed # 确认模块已加载 $ lsmod | grep r8152 r8152 94208 0常见维护命令命令用途dkms remove -m r8152 -v 2.16.1 --all完全移除模块dkms uninstall -m r8152 -v 2.16.1卸载特定版本dkms build -m r8152 -v 2.16.1 -k 5.13.0-48为特定内核构建6. 性能优化与高级配置6.1 中断合并与缓冲区调整优化网络性能参数sudo ethtool -C enx0826ae31ad1b rx-usecs 8 tx-usecs 8 sudo ethtool -G enx0826ae31ad1b rx 4096 tx 40966.2 电源管理禁用避免USB接口省电导致性能下降echo options r8152 enable_remote_wakeupN | sudo tee /etc/modprobe.d/r8152.conf sudo update-initramfs -u6.3 多队列支持现代内核版本支持多队列sudo ethtool -L enx0826ae31ad1b combined 4检查当前队列设置$ ethtool -l enx0826ae31ad1b Channel parameters for enx0826ae31ad1b: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 47. 常见问题解决方案问题1dkms build失败提示缺少头文件$ sudo dkms build -m r8152 -v 2.16.1 Error! Your kernel headers for kernel 5.13.0-48-generic cannot be found.解决方案sudo apt install linux-headers-$(uname -r)问题2模块加载失败dmesg显示错误[ 123.456789] r8152: disagrees about version of symbol module_layout解决方案sudo dkms remove -m r8152 -v 2.16.1 --all sudo dkms install -m r8152 -v 2.16.1问题3MTU设置不生效检查驱动是否支持$ ethtool -k enx0826ae31ad1b | grep tso tcp-segmentation-offload: on generic-segmentation-offload: on generic-receive-offload: on临时禁用GSO/GROsudo ethtool -K enx0826ae31ad1b gso off gro off8. 监控与调试技巧实时监控驱动状态watch -n 1 dmesg | grep r8152 | tail -n 10查看详细统计信息ethtool -S enx0826ae31ad1b性能测试工具推荐# 安装iperf3 sudo apt install iperf3 # 服务器端 iperf3 -s # 客户端 iperf3 -c 192.168.1.100 -t 60 -P 4驱动调试模式启用echo 16 | sudo tee /sys/module/r8152/parameters/msg_enable9. 替代方案与社区资源当DKMS方案遇到困难时可以考虑预编译DKMS包sudo apt install r8152-dkmsmainline内核新版内核可能已包含更好支持PPA源sudo add-apt-repository ppa:some-ppa/r8152 sudo apt update sudo apt install r8152-dkms优质社区资源Realtek官方论坛Ubuntu中文社区Kernel.org邮件列表10. 安全注意事项与最佳实践定期更新驱动关注Realtek官网的安全公告备份原始驱动sudo cp /lib/modules/$(uname -r)/kernel/drivers/net/usb/r8152.ko ~/backup/签名验证生产环境应考虑模块签名sudo apt install mokutil sudo mokutil --import /usr/lib/modules/$(uname -r)/updates/dkms/r8152.ko性能基准测试变更前后进行网络性能对比回滚方案保留旧版驱动以便快速恢复# 回滚到内核自带驱动 sudo dkms remove -m r8152 -v 2.16.1 --all sudo modprobe -r r8152 sudo modprobe r8152

更多文章