要让 sysctl 参数永久生效,必须完成“落盘 + 加载”两步:将配置写入 /etc/sysctl.d/99-custom.conf 等合规路径并确保语法正确,再执行 sudo sysctl --system 加载验证。

要让 sysctl 参数永久保存并真正生效,不能只写配置文件,也不能只用 sysctl -w 临时修改。关键在于“落盘 + 加载”两步都到位,且路径、格式、权限都要合规。
写进正确的配置位置
现代 Linux 发行版(如 Ubuntu 20.04+、CentOS 8+/RHEL 8+、Debian 11+)优先读取 /etc/sysctl.d/ 下的 .conf 文件,而不是仅依赖 /etc/sysctl.conf。推荐做法是:
- 新建独立配置文件,例如:
sudo tee /etc/sysctl.d/99-custom.conf net.ipv4.ip_forward = 1<br>vm.swappiness = 10<br>EOF
- 文件名建议带数字前缀(如
99-),确保加载顺序靠后,避免被其他配置覆盖 - 必须以
.conf结尾,否则sysctl --system会忽略
严格遵守配置语法
参数行格式看似简单,但细节决定成败:
- 必须是
key = value形式,等号两侧可有空格,但不能有 shell 注释在行尾(#必须独占一行或开头) - 键名拼写必须准确,比如
net.ipv4.ip_forward写成ip_forwad就会报unknown key并跳过整文件 - 值类型要匹配:布尔类(如
kernel.sysrq)填0或1;整数类(如net.core.somaxconn)不能填on/off
执行加载命令并验证
写完文件只是“存下来”,还没“起作用”。必须主动触发加载:
- 运行
sudo sysctl --system—— 这是唯一能同时加载/etc/sysctl.conf和全部/etc/sysctl.d/*.conf的命令 - 不要用
sysctl -p单独加载某个文件,它不扫描/etc/sysctl.d/目录,容易漏配 - 加载后立即验证:执行
sysctl net.ipv4.ip_forward或cat /proc/sys/net/ipv4/ip_forward,输出必须和你写的值一致
检查常见失效原因
如果 sysctl --system 没报错但参数没变,大概率是这些地方出了问题:
- 文件权限不对:非 root 可读即可,但若设为
600且属主不是 root,sysctl 会静默跳过(查看dmesg或journalctl -u systemd-sysctl可见 ignoring file 提示) - 内核不支持该参数:旧内核可能没有
net.ipv4.tcp_fastopen等新字段,会提示 unknown key - 参数被只读锁定:如
kernel.sysrq在某些加固内核中编译为只读,sysctl -w会报 Permission denied











