Linux sysctl 怎样持久化内核参数配置
Linux 中用 sysctl -w 修改内核参数,只改变当前运行中的内核状态;机器重启后,这个值通常会回到默认值。要让配置持久化,应把键值写进 /etc/sysctl.d/ 下的 .conf 文件,再用 sysctl --system 或 systemd 的 sysctl 服务重新加载。这样做的重点不是“把命令再执行一次”,而是把配置放进有明确优先级、可审查、可回滚的文件体系。
下面以一个不绑定具体发行版业务的内核参数为例,说明从临时修改到持久化的完整关系。示例值只用于展示格式,实际值必须根据目标内核参数的含义和机器负载决定。
先看清 sysctl 的两种状态
sysctl 读写的是 /proc/sys/ 中当前可用的内核参数。临时写入适合实验或故障处置;文件配置适合启动时自动恢复。两者可以使用相同的键名,但生命周期不同。
# 读取当前值,先记录基线,便于之后回滚
sysctl vm.swappiness
# 临时修改当前运行状态;重启后不会自动保留
sudo sysctl -w vm.swappiness=10
# 再次读取,确认当前内核返回的实际值
sysctl -n vm.swappiness
这里的关键判断是:最后一条命令读到的是当前状态,不等于已经完成持久化。配置文件还没有参与,重启后也没有恢复依据。

把本地配置放进 /etc/sysctl.d
推荐把本机管理员维护的设置放在 /etc/sysctl.d/,文件名使用清楚的数字前缀和 .conf 后缀。例如,创建一个只表达本次策略的文件:
# 创建本地配置文件;文件名用于表达排序意图,不要使用模糊的临时名称
sudo install -m 0644 /dev/null /etc/sysctl.d/60-local-network.conf
# 写入需要持久化的键值;井号后的内容是给维护者看的说明
sudo tee /etc/sysctl.d/60-local-network.conf >/dev/null
文件只放配置,不要把 sudo sysctl -w ... 命令写进去。sysctl.d 文件的职责是声明键值,启动时由加载组件把它们写入当前内核。
/etc/sysctl.d/ 的优先级高于 /run/sysctl.d/、/usr/local/lib/sysctl.d/ 和 /usr/lib/sysctl.d/ 中的同名文件;在同一优先级体系内,文件名按字典序处理,后出现的同一键可能覆盖前面的值。数字前缀不是装饰,而是让覆盖关系可读。

不重启也可以立即加载
配置文件写好后,当前内核不会自动读取磁盘上的新内容,需要显式加载。若希望按系统配置目录的规则统一读取,可以使用:
# 读取各配置目录中的 .conf,并按 sysctl 的系统规则应用
sudo sysctl --system
# 只加载当前文件,适合先处理一个改动范围较小的配置
sudo sysctl -p /etc/sysctl.d/60-local-network.conf
# 读取目标键的当前状态;不要只根据加载命令没有报错就下结论
sysctl vm.swappiness
sysctl fs.inotify.max_user_watches
sysctl -p 适合指定单个文件,sysctl --system 会处理系统配置目录和 /etc/sysctl.conf。如果多处定义了同一个键,单独加载某个文件时看到的结果,可能和完整系统加载后的结果不同,所以排查覆盖问题时应同时查看文件名和最终读回值。
为什么文件存在却没有生效
最常见的原因不是语法,而是“参数出现的时机”和“实际被加载的文件”不符合预期。
- 键在当前内核不存在:某些参数依赖内核模块或特定设备。启动早期加载时,目标键还没有出现,后续模块加载后需要再次应用,或按系统文档使用设备/模块出现时的钩子。
- 同一个键被后续文件覆盖:查看
/etc、/run和发行版提供的目录,确认是否有更晚排序的文件重新声明了同一键。 - 把持久化和立即生效混为一谈:修改磁盘文件只改变未来加载的输入,当前
/proc/sys的值要靠sysctl --system或 systemd-sysctl 重新写入。 - 值被内核规范化:内核可能接受一种输入格式,但读回时以另一种格式表示;判断时以语义和实际读回值为准。
在 systemd 系统上,可以重启 sysctl 服务重新应用配置:
# 让 systemd-sysctl 重新读取启动配置并写入 /proc/sys
sudo systemctl restart systemd-sysctl
# 需要更严格的失败判断时,限制到一个前缀并回读确认
sudo systemd-sysctl --prefix vm.swappiness --strict --verify
--verify 适合收敛到明确的文件或前缀;全量配置中如果存在内核规范化、模块时机或允许忽略失败的条目,不能把一次成功退出简单解释为所有参数都已经达到预期。
回滚和维护时保留什么信息
持久化配置的代价是它会影响后续启动,所以每次调整都应该留下旧值、文件名和变更理由。回滚时先移除或修改本地文件,再重新加载剩余配置:
# 先保存当前配置文件,便于审查和恢复,不直接删除历史证据
sudo cp -a /etc/sysctl.d/60-local-network.conf /etc/sysctl.d/60-local-network.conf.bak
# 回滚到维护者确认过的值;这里仍然使用合法的配置文件语法
sudo sed -i 's/^vm.swappiness[[:space:]]*=.*/vm.swappiness = 60/' /etc/sysctl.d/60-local-network.conf
# 重新加载并读取最终值,确认回滚进入当前内核状态
sudo sysctl --system
sysctl vm.swappiness
如果某个调整只为一次性排障,不要顺手写入 /etc/sysctl.d。如果它需要跨重启保持,就应纳入配置管理,并把“为什么改、适用于哪些机器、如何撤销”写在文件旁边或变更记录中。
一张清单判断持久化是否完成
| 检查点 | 应该看到的结果 |
|---|---|
| 临时值 | sysctl -n KEY 能读到当前状态,但不能证明会跨重启保留。 |
| 配置位置 | 本地策略位于 /etc/sysctl.d/*.conf,文件名和职责清楚。 |
| 加载动作 | 已用 sysctl --system、指定文件加载或 systemd-sysctl 重新应用。 |
| 覆盖关系 | 没有同名文件或更晚排序文件意外覆盖目标键。 |
| 时机边界 | 依赖模块/设备的参数在其可用之后再次应用,或采用对应的系统钩子。 |
| 回滚信息 | 旧值、变更理由和撤销方式已被记录。 |
常见问题
只改 /etc/sysctl.conf 可以吗?
可以,但它是系统加载规则的一部分且通常最后读取。把本地策略拆到带数字前缀的 /etc/sysctl.d/*.conf 更容易按职责管理,也更容易看出覆盖关系。
为什么执行 sysctl --system 后值还是没变?
先确认键是否存在,再检查是否被更晚文件覆盖;如果参数依赖尚未加载的模块或设备,启动阶段可能找不到它,后续需要在参数出现后再次应用。
配置文件中的点号和斜杠有什么区别?
sysctl 支持用点号或斜杠表示参数路径,但混合写法需要遵守其分隔规则。为了便于维护,普通键名通常统一使用点号形式,并以实际读回结果确认。
参考资料:https://man7.org/linux/man-pages/man8/sysctl.8.html、https://man7.org/linux/man-pages/man5/sysctl.d.5.html、https://www.freedesktop.org/software/systemd/man/latest/systemd-sysctl.service.html
Linux /proc/meminfo 怎样读取 HugePages 使用量
- 上一篇
- Linux /proc/meminfo 怎样读取 HugePages 使用量
- 下一篇
- Linux ionice 怎样给备份进程设置 IO 优先级
-
- 文章 · linux | 1小时前 | Linux NameSpace util-linux lsns 进程命名空间
- Linux lsns 怎样查看进程所属命名空间
- 215浏览 收藏
-
- 文章 · linux | 1小时前 |
- Linux ionice 怎样给备份进程设置 IO 优先级
- 219浏览 收藏
-
- 文章 · linux | 2小时前 |
- Linux /proc/meminfo 怎样读取 HugePages 使用量
- 261浏览 收藏
-
- 文章 · linux | 2小时前 |
- Linux tar --listed-incremental 怎样制作增量归档
- 284浏览 收藏
-
- 文章 · linux | 2小时前 |
- Linux xargs 怎样安全处理带空格的文件名
- 478浏览 收藏
-
- 文章 · linux | 2小时前 |
- journalctl 怎样输出 JSON 格式日志
- 422浏览 收藏
-
- 文章 · linux | 2小时前 | Linux · WorkingDirectory systemd.exec systemd服务工作目录
- systemd.exec WorkingDirectory 怎样固定服务工作目录
- 392浏览 收藏
-
- 文章 · linux | 2小时前 | Linux 定时任务 OnCalendar systemd.timer
- systemd.timer 怎样按日历表达式定时启动服务
- 285浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 720次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 728次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 804次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 765次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 602次使用
-
- 新能源汽车充电设施巡检记录的设置方法
- 2026-10-04 422浏览
-
- 详解golang执行Linuxshell命令完整场景下的使用方法
- 2023-01-07 426浏览
-
- go程序部署到linux上运行的实现方法
- 2023-01-02 387浏览
-
- Linux系统下Go语言开发环境搭建
- 2023-01-07 242浏览
-
- 使用golang获取linux上文件的访问/创建/修改时间
- 2022-12-31 238浏览

