必须通过 /etc/modprobe.d/*.conf 文件(如 /etc/modprobe.d/nf_conntrack.conf)以 options module_name param=value 格式配置内核模块参数,文件名须以 .conf 结尾,参数间无逗号、等号不加空格;该配置仅在模块加载时生效,需配合自动加载或手动 modprobe 才起作用,不可写入 /etc/sysctl.conf。

如何通过 /etc/modprobe.d/ 设置内核模块参数
CentOS 7 中,内核模块(如 nf_conntrack、ip_vs、overlay)的启动时参数不能写进 /etc/sysctl.conf,必须单独配置。最可靠且永久生效的方式是新建或编辑 /etc/modprobe.d/*.conf 文件(例如 /etc/modprobe.d/nf_conntrack.conf),每行一条 options 指令。
常见错误是把模块参数误写进 /etc/sysctl.conf —— 那里只管 /proc/sys/ 下的运行时参数,对模块加载无影响;重启后模块仍用默认值,导致连接跟踪数不足、容器网络异常等隐蔽问题。
- 文件名必须以
.conf结尾,否则modprobe忽略 - 语法严格:
options <module_name><param1>=<value1><param2>=<value2></value2></param2></value1></param1></module_name>,中间无逗号,等号前后不能有空格 - 模块未被系统自动加载时,该配置不会生效;需配合
modprobe <module_name></module_name>或确保它被其他模块依赖触发 - 修改后无需重启,但已加载的模块需先
rmmod <module_name></module_name>再modprobe <module_name></module_name>才能应用新参数
modprobe 加载时传参与验证是否生效
临时测试某模块参数是否被识别,可直接用 modprobe 命令传参:
modprobe nf_conntrack hashsize=65536
然后检查是否成功加载并应用:
- 确认模块已载入:
lsmod | grep nf_conntrack - 查看当前参数值:
cat /sys/module/nf_conntrack/parameters/hashsize(注意:不是所有参数都暴露在/sys/module/*/parameters/,部分仅在初始化时生效且不可读) - 若返回
65536,说明参数已生效;若报错No such file or directory,可能是模块未导出该参数,或拼写错误(如把hashsize写成hash_size)
注意:modprobe -c | grep <module_name></module_name> 可查模块支持哪些参数,但输出较冗长,建议先看内核文档或 modinfo <module_name></module_name>。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
典型模块参数设置示例(nf_conntrack、overlay、br_netfilter)
生产环境常遇到的几个模块,参数设置有明确约束和副作用:
-
nf_conntrack:用于 NAT 和状态防火墙,hashsize决定连接跟踪哈希表大小,默认值太小易触发nf_conntrack: table full报错。options nf_conntrack hashsize=65536是常见调优项,但需搭配net.netfilter.nf_conntrack_maxsysctl 参数同步调整 -
overlay(Docker/Kubernetes 用):CentOS 7.9+ 默认启用,但若启用了overlay2存储驱动,需确保options overlay redirect_dir=on(修复某些旧内核下 rename() 失败问题) -
br_netfilter:Kubernetes 要求启用,但其参数极少;真正关键的是加载后触发iptables对桥接流量的处理,所以必须配options br_netfilter bridge-nf-call-iptables=1,否则 Pod 间通信不通
这些参数一旦写错(比如把 bridge-nf-call-iptables 拼成 bridge_nf_call_iptables),modprobe 不报错也不生效,排查起来非常耗时。
为什么 /etc/modules-load.d/ 不能替代 /etc/modprobe.d/
/etc/modules-load.d/*.conf 只负责「让模块开机自动加载」,不提供传参能力。例如写 nf_conntrack 在 /etc/modules-load.d/modules.conf 里,只会执行 modprobe nf_conntrack,用的全是内核编译时的默认参数。
容易踩的坑:
- 以为写了
/etc/modules-load.d/就万事大吉,结果nf_conntrack_max还是默认 65536,集群跑几天就满 - 把
options行误放进/etc/modules-load.d/,系统启动时静默忽略,毫无提示 - 多个
.conf文件定义同一模块参数,后加载的覆盖前一个,顺序由文件名 ASCII 排序决定(如a.conf先于b.conf),而非书写顺序
真正要控制模块行为,/etc/modprobe.d/ 是唯一正解;/etc/modules-load.d/ 只解决“要不要加载”,不管“怎么加载”。

















