modprobe 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,属于硬件与内核族。给网卡/存储加载驱动、开启内核特性(如 ipvsadm 依赖的
ip_vs)、开机自动加载模块都靠它。
内核模块(.ko)是可动态插拔的驱动/功能。modprobe 从 /lib/modules/$(uname -r)/ 取模块,并根据 modules.dep 自动先加载依赖——这是它优于 insmod 的核心。
一、加载、查看、卸载
bash
sudo modprobe ip_vs # 加载模块(自动带上依赖模块)
sudo modprobe -v br_netfilter # -v 显示加载过程/依赖
lsmod # 列出已加载模块(来自 /proc/modules)
lsmod | grep ip_vs
modinfo ip_vs # 查模块路径、版本、参数、签名
cat /proc/modules # 底层原始信息
sudo modprobe -r ip_vs # 卸载(连同不再被引用的依赖)
sudo modprobe -rn ip_vs # 演练卸载不真执行| 命令 | 作用 | 与 modprobe 的关系 |
|---|---|---|
insmod xxx.ko | 按完整路径加载单个模块 | 不处理依赖,缺依赖直接失败 |
rmmod xxx | 卸载单个模块 | 不自动处理依赖 |
modprobe | 按模块名 + 自动依赖 | 日常首选 |
modinfo | 查模块元信息/参数 | 不改状态 |
二、开机自动加载与传参/禁用
bash
# 开机加载:在 modules-load.d 放模块名(一行一个)
echo br_netfilter | sudo tee /etc/modules-load.d/k8s.conf
# 传参数 / 起别名 / 拉黑:/etc/modprobe.d/*.conf
echo 'options nf_conntrack nf_conntrack_max=1048576' | sudo tee /etc/modprobe.d/conntrack.conf
echo 'blacklist pcspkr' | sudo tee /etc/modprobe.d/nobeep.confoptions <模块> 参数=值:设置模块加载参数。blacklist:阻止 udev 按别名自动加载(但被显式依赖时仍可能加载;要彻底禁用可配install xxx /bin/true)。- 改完 initramfs(早期引导阶段加载的模块)需
update-initramfs -u(Debian/Ubuntu)或dracut -f(RHEL)。
三、常见排障
Module not found:模块名错、内核版本与/lib/modules不匹配(uname -r对照),或该功能已内建(=y,无 .ko,grep CONFIG_XXX /boot/config-*)。Operation not permitted/被锁:安全启动签名校验、容器无 CAP_SYS_MODULE(容器内一般不能加载宿主模块,要在宿主操作)。- 模块加载了但功能不生效:确认参数、看 dmesg 中该驱动日志、设备是否绑定(lspci -k/
lsmod)。 - 模块被占用无法
modprobe -r:有进程/其他模块在用(lsmod的 Used by 列)。
相关命令
查设备驱动绑定用 lspci -k,调内核运行参数(区别于模块)用 sysctl,看内核日志用 dmesg,网络模块示例见 conntrack/ipvsadm。
总结
modprobe 模块名 按名加载内核模块并自动解决依赖,-r 卸载,lsmod 看已加载、modinfo 查参数;开机加载写 /etc/modules-load.d/,传参/禁用写 /etc/modprobe.d/ 的 options/blacklist,initramfs 相关改动要重建。它相比只按路径单装、不管依赖的 insmod/rmmod 更智能;找不到模块时核对内核版本与是否已内建(CONFIG=y),容器内通常无权加载。