先确认硬件是否被识别:若lspci无输出或dmesg无eth相关日志,且Kernel driver in use: none,则大概率缺固件;若有驱动但不可用(如r8169),才需更换适配驱动。

旧内核离线安装新网卡驱动,核心难点不是“装不上”,而是“装上了但不生效”——常见于固件缺失、PCI ID 不匹配、模块未触发 probe 或内核头文件版本错位。别急着编译,先确认是不是根本没识别到硬件。
怎么判断是缺驱动还是缺固件
执行 lspci -k -nn | grep -A 3 -i ethernet,重点看两行:
- 如果显示
Kernel driver in use: none,且dmesg | grep -i eth完全无输出,大概率是固件(firmware)缺失,不是驱动问题 - 如果显示
Kernel driver in use: r8169但网卡不能用,那才是驱动不适配,需要换r8125等新版驱动
接着检查 /lib/firmware/ 下有没有对应厂商目录,比如 Realtek 网卡要存在 rtl_nic/,Intel 要有 intel/。缺就补:把 firmware-realtek 或 linux-firmware 的离线 deb/rpm 包拷进去,用 dpkg -i 或 rpm -ivh 安装,再 modprobe -r r8169 && modprobe r8125,dmesg 里搜 loaded firmware 确认加载成功。
离线编译驱动前必须核对的三件事
手动编译只在固件齐全但内核没合入驱动时才必要,比如 Realtek RTL8125B 在 5.4 内核里没原生支持。编译前务必确认:
-
uname -r输出的内核版本,必须和驱动 README 中声明的Supported kernels范围一致;不匹配硬编会报struct net_device_ops成员缺失 - 已安装对应版本的内核头文件:
linux-headers-$(uname -r)(Debian/Ubuntu)或kernel-devel-$(uname -r)(RHEL/CentOS/麒麟)——离线环境得提前下好 rpm/deb 包并dpkg -i或rpm -ivh - 驱动源码里的
pci_device_id表是否包含你的网卡 ID:用lspci -nn | grep Ethernet记下类似[10ec:8125]的 ID,再去源码中查static const struct pci_device_id xxx_id_table[],没有就手动加一行{PCI_DEVICE(0x10ec, 0x8125), .driver_data = 0},
make install 后 ip link 还是看不到网卡?
说明模块加载了,但内核没把它和硬件绑定上。常见原因和应对:
-
modprobe r8125成功,但lsmod | grep r8125显示 size 为 0 —— 驱动没 probe,基本就是上面说的 PCI ID 不在表里,补完 ID 重编译再试 - 执行
modinfo r8125 | grep alias,输出里应有类似alias: pci:v000010ECd00008125sv*sd*bc*sc*i*的行;没有说明模块没注册 alias,检查 Makefile 是否漏了KERNELRELEASE或EXTRA_CFLAGS设置错误 - 驱动模块路径不对:
make install默认装到/lib/modules/$(uname -r)/updates/,但有些旧发行版(如 CentOS 7)默认只扫描extra/目录,需手动cp r8125.ko /lib/modules/$(uname -r)/extra/再depmod -a
离线环境最易被忽略的验证点
很多人以为 modprobe 成功、lsmod 看到模块就结束了,其实关键在 dmesg 最后几行:
- 必须看到
r8125 0000:03:00.0: renamed from eth0或类似设备重命名日志,才算 probe 成功 - 如果只有
loading out-of-tree module taints kernel没后续,说明驱动 init 函数返回了错误,多半是固件路径不对或request_firmware失败 -
ip link列表里出现新接口(如enp3s0)后,别忘了ip link set up才能真正启用,否则状态一直是DOWN



















