systemd-modules-load.service加载失败主因是模块未正确放入/lib/modules/$(uname -r)/目录或未运行depmod -a更新依赖,而非配置错误;配置文件中必须写模块逻辑名(如xdma),而非xxx.ko文件名。

只要模块已正确编译并兼容当前内核,systemd-modules-load.service 就能可靠加载它——但多数失败不是因为配置错,而是模块根本没放对位置或没更新依赖。
模块名必须与 modinfo -n 输出的 basename 一致
配置文件里写的不是 xxx.ko,也不是路径,而是模块的“逻辑名”。比如 xdma.ko 的实际模块名可能是 xdma,可通过以下命令确认:
modinfo /path/to/xdma.ko | grep ^name
如果输出是 name: xdma,那配置文件里就只能写 xdma;如果模块用了 MODULE_ALIAS 或导出了多个符号,名字可能不同(如 ip_vs_rr 不等于 ip_vs.ko)。
- 错误写法:
echo 'xdma.ko' | sudo tee /etc/modules-load.d/xdma.conf - 正确写法:
echo 'xdma' | sudo tee /etc/modules-load.d/xdma.conf - 验证方式:
sudo modprobe xdma && lsmod | grep xdma,成功后再配自动加载
/lib/modules/$(uname -r)/kernel/ 下必须存在该模块文件
systemd-modules-load.service 不会从任意路径加载模块,它只查系统模块目录。如果你的 xxx.ko 还在 home 或 tmp 目录下,直接写进 /etc/modules-load.d/ 会静默失败(journalctl -u systemd-modules-load 里能看到 “Module not found”)。
- 复制命令必须带完整路径:
sudo cp xxx.ko /lib/modules/$(uname -r)/kernel/drivers/(或更细的子目录如/pci/) - 复制后必须运行:
sudo depmod -a,否则modprobe找不到符号依赖,systemd-modules-load也会跳过 - 检查是否入库:
modprobe -n -v xxx应输出类似insmod /lib/modules/.../xxx.ko
两种机制别混用:/etc/modules-load.d/ vs /etc/sysconfig/modules/
CentOS 7 同时支持两种方式,但行为不同:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
-
/etc/modules-load.d/*.conf:由systemd-modules-load.service在 early boot 阶段调用modprobe加载,**不执行 shell 脚本,只认模块名列表** -
/etc/sysconfig/modules/*.modules:是可执行 shell 脚本,需chmod +x,由rc.sysinit或自定义服务调用,适合需要条件判断(如检查模块是否存在)或加载多个关联模块的场景
常见误操作:把 modprobe ip_vs_rr 写进 .conf 文件——这会当作模块名去查,结果找不到;或者把纯模块名写进 .modules 脚本却不加 modprobe 命令——脚本根本不会触发加载。
调试失败时优先看 systemd-modules-load 日志
模块没加载,lsmod 看不到,不代表配置无效。先查真实报错:
sudo journalctl -u systemd-modules-load --since "1 hour ago"
典型错误包括:
-
Failed to find module 'xxx'→ 模块不在/lib/modules/$(uname -r)/下,或depmod没更新 -
Module xxx is blacklisted→ 检查/etc/modprobe.d/下是否有blacklist xxx -
modprobe: ERROR: could not insert 'xxx': Invalid argument→ 模块与内核版本不匹配,或 init 函数失败(此时即使手动insmod也失败)
真正麻烦的不是配置步骤,而是模块本身是否能在当前 kernel 上跑通;自动加载只是最后一步,前面任何一环断了,它都不会动。










