确认缺驱动后才编译安装,首要排查固件缺失或旧驱动冲突;仅当内核不兼容、嵌入式平台无集成、DKMS失败或PCI ID不在驱动表中时,才需手动编译;编译须经匹配、准备、验证三环节,并通过lspci、dmesg、ip link等验证probe成功。

编译安装第三方网卡驱动不是第一步,而是确认系统确实缺驱动之后的兜底操作。多数情况下,问题出在固件缺失或旧驱动冲突,而非必须从源码编译。真要动手,关键在匹配、准备和验证三个环节。
先排除固件和驱动冲突
很多“没网卡”现象其实是固件没加载,不是驱动没编译:
- 运行 lspci -k -nn | grep -A 3 -i ethernet,看是否识别到设备,以及显示 Kernel driver in use: none 或 Kernel modules: r8169(但实际需要 r8125)
- 检查 /lib/firmware/ 下有无对应厂商目录,比如
rtl_nic/(Realtek)、intel/(Intel),没有就补装固件包:
• Ubuntu/Debian:sudo apt install firmware-realtek firmware-linux-nonfree
• CentOS/RHEL/Fedora:sudo dnf install linux-firmware - 装完固件后,先卸载旧驱动(如 sudo modprobe -r r8169),再加载新驱动(如 sudo modprobe r8125),然后用 dmesg | tail -20 看是否出现 loaded firmware 或 probed 字样
确认必须自己编译的场景
只有满足以下至少一项,才考虑手动编译:
- 内核版本太新或太旧,官方驱动源码明确不支持当前 uname -r 输出的版本(查 README 或 Makefile)
- 使用的是嵌入式平台(如 RK3568),SDK 提供的内核未集成该网卡驱动,且厂商只给了源码包
- dkms 安装失败并报错类似 struct net_device_ops has no member named ndo_set_rx_mode,说明内核 API 已变更
- PCI 设备 ID 不在驱动的
pci_device_id表中(用 lspci -nn | grep Ethernet 得到 ID,如[10ec:8125],再查驱动源码里是否包含该条目)
编译安装四步实操
以常见 Realtek RTL8152/RTL8153 USB 网卡为例(其他驱动流程类似):
- 装依赖:确保有 build-essential(Debian/Ubuntu)或 gcc kernel-devel(RHEL/Fedora),以及 linux-headers-$(uname -r);交叉编译 RK3568 驱动还需匹配 Rockchip SDK 中的工具链
-
进源码目录:解压后进入
src/子目录(不是根目录),避免make找不到顶层 Makefile - 编译前清理:先 make clean,再 make;注意终端末尾是否有 warning,比如 ‘xxx’ defined but not used,这往往意味着需手动适配内核结构体字段
- 安装与加载:执行 sudo make install(部分驱动需 sudo insmod xxx.ko),再 sudo depmod -a 刷新模块依赖,最后 sudo modprobe xxx 加载;用 ip link show 和 dmesg | grep -i xxx 验证是否成功 probe
验证与排错要点
编译成功 ≠ 驱动能用,重点看硬件是否被识别、是否触发 probe:
- 如果 ip link 仍看不到接口,但 lsmod | grep xxx 显示模块已加载,大概率是 PCI ID 不匹配或 probe 函数没执行
- 用 lspci -vv -s [bus:slot.func] 查设备详细能力(如是否支持 MSI、BAR 地址是否有效),有些工控网卡需额外 patch 才能启用
- 驱动加载后无日志?检查 printk 级别是否被过滤,可临时设 echo 8 > /proc/sys/kernel/printk
- insmod 成功但无法 ifconfig up?可能是缺少 ethtool 支持或 PHY 初始化失败,需查 dmesg 中 PHY 相关报错



















