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. 文件扫描顺序与优先级

系统按固定顺序扫描目录,一旦同名文件被加载,后续目录中的同名文件直接忽略

顺序如下(从上到下优先级递增):

  1. /lib/modprobe.d/*.conf // 发行版打包默认
  2. /usr/local/lib/modprobe.d/*.conf
  3. /usr/lib/modprobe.d/*.conf
  4. /run/modprobe.d/*.conf // 运行时生成(如 systemd)
  5. /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

参数可来自三处:

  1. options 指令
  2. alias 自带的 options
  3. 命令行 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: 模块失败不影响主模块继续
  • 若同一模块同时写 installsoftdepsoftdep 优先

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. 调试与排坑

  1. 看加载顺序
    modprobe -c | grep -E '^(alias|options|install|softdep)'

  2. 模拟加载
    modprobe -n -v your-module // 只打印不真插

  3. 查参数是否生效
    systool -v -m your-module // 查看 parameters 节点

  4. 黑名单不生效?
    确认是否被 install 脚本强行拉起;检查 initramfs 是否已更新。

  5. 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
posted @ 2025-11-26 11:08  LoftyAmbition  阅读(78)  评论(0)    收藏  举报