模块名必须用 modinfo 查看 name 或 alias 字段,不可直接用 .ko 文件名;/etc/sysconfig/modules/ 脚本需以 .modules 结尾、含 shebang、权限 755;systemd 系统应使用 /etc/modules-load.d/;depmod -a 不可省略。

模块名必须先确认,不能只写文件名
很多用户把 helloworld.ko 直接当成模块名传给 modprobe,结果报错 modprobe: FATAL: Module helloworld.ko not found。这是因为 modprobe 查找的是模块的 alias 名或编译时声明的 MODULE_LICENSE 之外的正式名称(即 KBUILD_MODNAME),不是文件后缀名。正确做法是:先用 modinfo /lib/modules/$(uname -r)/extra/helloworld.ko 查看输出里的 name: 行;若没这行,就看 alias: 或直接读源码里 MODULE_LICENSE 上方的 MODULE_NAME 定义。常见错误是误用 .ko 后缀、大小写不一致、或模块未被 depmod -a 索引。
/etc/sysconfig/modules/ 下的 .modules 脚本要可执行且带 shebang
在 RHEL/CentOS/Fedora 等 SysVinit 或早期 systemd 系统中,/etc/sysconfig/modules/ 是标准位置。但脚本必须满足三个硬性条件才能被 rc.sysinit 执行:文件名以 .modules 结尾、有 #!/bin/sh 开头、权限为 755(chmod +x)。例如加载 ip_vs 模块:
#!/bin/sh modprobe ip_vs >/dev/null 2>&1 modprobe ip_vs_rr >/dev/null 2>&1
注意:modprobe 的退出码不等于失败——有些模块已加载或被内置,modprobe 会静默返回 0;真正要捕获的是 stderr 中的 “not found” 或 “invalid parameter”。建议加 || true 避免脚本因单个模块失败而中断后续加载。
systemd 系统优先用 /etc/modules-load.d/,而非 rc.local
在使用 systemd 的现代发行版(如 Ubuntu 20.04+、RHEL 8+、Arch)中,/etc/rc.local 已被弃用,且执行时机太晚——很多服务(如 network、lvm2)启动时依赖模块已就绪。正确方式是写一个 .conf 文件到 /etc/modules-load.d/,每行一个模块名(不含路径、不含 .ko):
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
# /etc/modules-load.d/ipvs.conf ip_vs ip_vs_rr ip_vs_sh
systemd 会在 early boot 阶段调用 systemd-modules-load.service 加载这些模块,比任何用户级服务都早。这个机制不执行 shell 逻辑,所以无法做 CPU 特性判断(如 grep vmx /proc/cpuinfo);需要条件加载时,仍得退回 /etc/sysconfig/modules/ 或写 systemd service 单元。
依赖顺序和 modprobe.conf 不再主导自动加载
/etc/modprobe.d/*.conf 里的 install 或 alias 指令,只影响按需触发(如设备插入、协议请求),不控制开机加载顺序。比如你写了 alias net-pf-10 ip6_tables,它只在创建 AF_INET6 socket 时触发,不是开机就拉起。真正决定“开机必加载”的,只有三处:① /etc/modules-load.d/(systemd)、② /etc/sysconfig/modules/*.modules(SysVinit)、③ /etc/rc.modules(兼容兜底)。别把 options 行误当加载指令——它只传参数,不触发加载本身。
实际部署时最容易忽略的是 depmod -a 这一步:新模块拷进 /lib/modules/$(uname -r)/ 后,不运行它,modprobe 就找不到依赖链,甚至报 “module not found” 而不是 “no such file”。尤其当你手动复制 .ko 文件、没走 make modules_install 流程时,这步绝对不能跳。

















