首页 > Sysadmin > 正文

Linux 系统网卡模块加载:从 modprobe 到开机自启

huyuanwen 2026-11-04 Sysadmin

网卡驱动没识别?3 条命令手动加载内核模块,并配置开机自动加载。

TL;DR:先确认模块文件名,用 modprobe 加载;要持久化就写 modules-load.d;要排除冲突就黑名单;卸载用 rmmod。

先确认网卡模块名

不是所有网卡都需要手动加载。先用 lspci -k | grep -A3 Ethernet 找到当前网卡对应的驱动名。如果内核已经加载了对应模块,这条会显示 Kernel driver in use: ...。

更直接的方式是 modinfo,它从模块文件里读元数据,不需要先加载:[5]

modinfo e1000

如果返回 filename: ...e1000.ko 这样的信息,说明这个模块存在,可以加载。

手动加载与卸载

推荐用 modprobe,不要用 insmod。 [1]

modprobe 会自动处理依赖、读取 modprobe.d 里的选项配置,并查找 /lib/modules/$(uname -r) 下的模块。

modprobe e1000 && lsmod | grep e1000 && rmmod e1000

insmod 也能加载单个模块,但不会解析依赖,也不会读配置。只在调试极特殊场景才用。[2]

卸载时优先用 rmmod,它会检查使用计数,避免把正在用的模块扯掉:[3][4]

如果提示 Module e1000 is not currently loaded,说明它已经不在内核里了;如果提示 Resource temporarily unavailable,通常有进程还在占用该驱动,先停掉相关服务再试。

配置开机自动加载

/etc/modules 已经过时。systemd 用 modules-load.d 目录下的 .conf 文件做静态列表。[7]

cat > /etc/modules-load.d/network.conf <<'EOF'
e1000
EOF
systemctl restart systemd-modules-load
systemctl status systemd-modules-load

这个文件里的每一行都是一个模块名,空格和注释会被忽略。不需要带 .ko 后缀。

黑名单与选项

如果某个模块加载后和硬件冲突,或者你明确想禁用它,在 /etc/modprobe.d/ 下建 .conf 文件黑名单:[1]

cat > /etc/modprobe.d/blacklist-conflict.conf <<'EOF'
blacklist ath_pci
options e1000 InterruptThrottleRate=3000
EOF

黑名单只阻止自动加载;如果已经手动 modprobe 过了,黑名单不会把它踢掉,得先 rmmod。

排错速查

现象 常见原因 处理
modprobe 报 unknown symbol 模块依赖的另一个模块没装/版本不匹配 检查内核版本和模块路径是否一致
rmmod 报 Resource temporarily unavailable 有进程持有该设备 lsof、fuser 或停掉相关服务
lsmod 看不到刚 modprobe 的模块 可能被黑名单拦了 查 /etc/modprobe.d/ 有没有 blacklist
depmod 报 warning: duplicate 多个目录有同名模块 清理旧内核目录:rm -rf /lib/modules/旧版本 [6]

局限性

  • WSL2 的虚拟网卡由 Hyper-V 直接管理,不经过 Linux 内核的网络模块,所以手动加载 vmxnet3、hv_netvsc 这类 WSL 宿主机驱动在 WSL 里无效。以下验证均在原生 Linux 物理机或 KVM 宿主机上成立。
  • insmod 的行为在 2.6 以后和 modprobe 差异不大,但依然不建议替代 modprobe。
  • 某些厂商闭源固件(如某些 NVIDIA 网卡)需要额外 firmware 包,仅 modprobe 驱动模块不够。
  • 实测记录:WSL2 Ubuntu-24.04,内核 6.6.114.1,modprobe e1000 成功加载,rmmod e1000 成功卸载,lsmod、modinfo、systemctl status systemd-modules-load 均正常返回。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测,个别条目(未装工具/安装类命令)仅核对官方文档,未实际执行。