要让内核参数重启后生效,必须写入启动时自动加载的配置文件:推荐使用/etc/sysctl.d/99-custom.conf并执行sudo sysctl --system,或兼容性编辑/etc/sysctl.conf后运行sudo sysctl -p,最后务必用sysctl 参数名验证真实生效。

要让内核参数在重启后依然生效,关键不是运行命令,而是把参数写进系统启动时自动读取的配置文件里。临时用 sysctl -w 设置的值只存在内存中,关机就清空。
推荐方式:用 /etc/sysctl.d/ 下的独立配置文件
这是现代主流发行版(RHEL 8+/CentOS 8+、Ubuntu 20.04+、Debian 11+)默认采用的方式,模块化、易管理、优先级可控。
- 创建自定义配置文件,例如:
sudo nano /etc/sysctl.d/99-custom.conf - 在里面按行写入参数,格式为
参数名 = 值,比如:net.ipv4.ip_forward = 1vm.swappiness = 10 - 保存后执行
sudo sysctl --system立即加载全部配置(包括/etc/sysctl.d/下所有.conf文件) - 下次开机时,systemd 会自动调用
sysctl --system加载这些设置
兼容方式:编辑 /etc/sysctl.conf
该方法在旧系统或部分定制环境中仍有效,但注意它可能被 /etc/sysctl.d/ 中的同名参数覆盖。
- 用编辑器打开:
sudo nano /etc/sysctl.conf - 在文件末尾添加参数,如:
net.core.somaxconn = 65535 - 保存后运行
sudo sysctl -p生效(仅加载此文件) - 系统启动时也会自动执行
sysctl -p /etc/sysctl.conf
验证是否真正生效
不能只看配置文件有没有写对,必须确认内核实际已加载:
- 检查单个参数:运行
sysctl net.ipv4.ip_forward,输出应为net.ipv4.ip_forward = 1 - 查看当前运行值:直接读
/proc/sys/对应路径,例如cat /proc/sys/net/ipv4/ip_forward - 若值仍是默认值,说明文件未被加载,或参数名拼错、权限不对、或内核不支持该参数(如
kernel.sysrq在某些加固内核中为只读)
避开常见误区
有些做法看似能用,但不可靠或已被淘汰:
- 只执行
sysctl -w就以为“配好了”——重启必丢 - 把
sysctl -w命令塞进/etc/rc.local——执行时机太晚,可能因网络未就绪失败 - 手动修改
/proc/sys/xxx节点却不写入配置文件——同样不持久 - 依赖已弃用的机制,如 RHEL 7+ 中的
/etc/sysconfig/sysctl或早期的/etc/default/boot











