modprobe.d 完全指南
在 Linux 世界里,驱动与功能都以“模块”形式动态加载。
如何优雅地指定加载参数、别名、软依赖,甚至彻底“接管”加载流程?
答案就藏在/etc/modprobe.d/*.conf这一方小天地。
本文带你从语法到实战,一次性吃透 modprobe.d 的方方面面。
1. 快速索引
| 章节 | 内容 |
|---|---|
| 1 | 什么是 modprobe.d |
| 2 | 文件扫描顺序与优先级 |
| 3 | 五大核心指令 |
| 4 | 实战: blacklist、softdep、install 场景 |
| 5 | 调试与排坑 |
| 6 | 未来趋势与兼容性警告 |
| 7 | 一键速查表 |
1. 什么是 modprobe.d
modprobe 负责把内核模块(.ko)塞进内核,也能按需自动解决依赖。
但模块往往要带参数、起别名、有前置/后置依赖,甚至“加载前干点别的事”。
把这些规则写进“配置片段”就是 modprobe.d 的设计初衷:
- 纯文本、单行指令、支持续行
\ #开头即注释- 文件名随意,只要以
.conf结尾 - 支持通配符、支持“后写覆盖先写”
2. 文件扫描顺序与优先级
系统按固定顺序扫描目录,一旦同名文件被加载,后续目录中的同名文件直接忽略。
顺序如下(从上到下优先级递增):
/lib/modprobe.d/*.conf// 发行版打包默认/usr/local/lib/modprobe.d/*.conf/usr/lib/modprobe.d/*.conf/run/modprobe.d/*.conf// 运行时生成(如 systemd)/etc/modprobe.d/*.conf// 管理员终极定制
提示:
想无损覆盖发行版默认?在/etc/modprobe.d/建同名文件即可。
想追加规则?换一个新名字,如99-local.conf,按字典序排在最后即可。
3. 五大核心指令
| 指令 | 作用域 | 典型场景 |
|---|---|---|
alias |
全局别名 | 给长模块名起“小名” |
blacklist |
屏蔽内置别名 | 阻止驱动抢设备 |
options |
模块参数 | 传参给驱动 |
install |
完全接管加载 | 加载前后干私活 |
remove |
完全接管卸载 | 卸载时清理 |
softdep |
软依赖 | 推荐前置/后置模块 |
weakdep |
弱依赖 | initramfs 仅需“存在”即可 |
下面逐一举例。
3.1 alias —— 模块“小名”
# 把冗长的模块名缩短
alias my-wifi rtl8723de
# 支持通配
alias usb-serial* usbserial
加载时即可:
modprobe my-wifi
注意:
不能“别名套别名”,但别名可以自带 options,见下例。
3.2 blacklist —— 让驱动“闭嘴”
某些驱动内置别名太“积极”,一开机就抢设备;把它拉黑即可:
blacklist pcspkr # 关掉蜂鸣器
blacklist nouveau # 闭源党专用
仅屏蔽内置别名,手动
modprobe nouveau仍可加载。
若希望“彻底拒绝”,请配合install nouveau /bin/false。
3.3 options —— 模块参数固化
# 让 iwlwifi 关闭 11n
options iwlwifi 11n_disable=1 swcrypto=1
# 给 btrfs 开调试
options btrfs debug=1
参数可来自三处:
options指令alias自带的 options- 命令行
modprobe foo bar=3
最终合并,后写覆盖先写。
3.4 install / remove —— 加载/卸载“钩子”
当模块真正被插入前执行自定义脚本,完成“额外工作”。
# 加载 fuse 前先把 fuse 组建好
install fuse /sbin/modprobe fuse-group; /sbin/modprobe --ignore-install fuse $CMDLINE_OPTS
# 卸载 nvidia 时顺带清掉 DRM 节点
remove nvidia /usr/bin/nvidia-prune-cache; /sbin/modprobe -r --ignore-remove nvidia
要点:
- 必须带
--ignore-install/--ignore-remove,否则无限递归。 $CMDLINE_OPTS会被替换成命令行附加参数,保证用户传参不丢失。
⚠️ 兼容性警告
官方计划在未来移除install/remove指令,因其阻碍自动化依赖分析。
新内核已支持“软依赖” +softdep指令,请优先使用。
3.5 softdep —— 软依赖
# 加载 btrfs 前先拿 zlib 和 xxhash,加载后再上 btrfscheck
softdep btrfs pre: zlib xxhash post: btrfscheck
pre:模块失败不影响主模块继续post:模块失败不影响主模块继续- 若同一模块同时写
install与softdep,softdep 优先
3.6 weakdep —— 弱依赖(initramfs 场景)
内核可能在运行时才 request_module() 某个辅助模块,但用户空间不提前加载它。
weakdep 告诉 initramfs 制作者:“请把这些文件打包进去,以防内核回头要”。
# 驱动 c 可能随时需要 a 或 b
weakdep c a b
4. 实战场景
4.1 场景 A:屏蔽自带驱动 + 强制参数
机器有双显卡,想禁用 nouveau 并给 intel 指定亮度参数:
# /etc/modprobe.d/99-nvidia.conf
blacklist nouveau
options nouveau modeset=0
# /etc/modprobe.d/99-intel.conf
options i915 enable_guc=2 disable_power_well=0
更新 initramfs 后重启:
update-initramfs -u
4.2 场景 B:给 USB 串口批量起别名
alias usb-serial-ftdi ftdi_sio
alias usb-serial-cp210x cp210x
udev 规则配合 ENV{MODALIAS}="usb-serial-*" 即可自动加载。
4.3 场景 C:加载前拉起依赖服务
# open-iscsi 需要先在用户空间跑 iscsid
install scsi_transport_iscsi /usr/bin/systemctl start iscsid; /sbin/modprobe --ignore-install scsi_transport_iscsi
5. 调试与排坑
-
看加载顺序
modprobe -c | grep -E '^(alias|options|install|softdep)' -
模拟加载
modprobe -n -v your-module// 只打印不真插 -
查参数是否生效
systool -v -m your-module// 查看 parameters 节点 -
黑名单不生效?
确认是否被install脚本强行拉起;检查 initramfs 是否已更新。 -
install 死循环?
忘记--ignore-install导致脚本反复调用自己,系统卡死。
6. 未来趋势与兼容性警告
- install/remove 指令 已列入“弃用路线图”。
- 内核新增“软依赖”字段(
MODULE_SOFTDEP),与softdep指令互补。 - 发行版工具(dracut/mkinitrd)正逐步转向纯依赖关系,不再解析 shell 脚本。
→ 新项目请优先使用softdep/weakdep+ 内核内置参数,避免写 install。
7. 一键速查表
| 任务 | 配置示例 |
|---|---|
| 模块别名 | alias my-mod long_name |
| 屏蔽驱动 | blacklist driver |
| 传参 | options driver para=val |
| 软依赖 | softdep drv pre: a b post: c |
| 弱依赖 | weakdep drv a b |
| 加载钩子 | install drv /sbin/modprobe dep; /sbin/modprobe --ignore-install drv $CMDLINE_OPTS |
| 卸载钩子 | remove drv /usr/bin/cleanup; /sbin/modprobe -r --ignore-remove drv |

浙公网安备 33010602011771号