Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

sysctl 会加载哪些目录下的配置文件?加载顺序是什么?

这是一个很关键、但经常被说错的问题。下面是一份 RHEL / AlmaLinux / Debian / Ubuntu 通用、且准确到实现层面的说明


一、sysctl 实际会加载哪些目录?

sysctl 的配置来源分三类:

1️⃣ /etc/sysctl.conf(传统主配置)

/etc/sysctl.conf
  • 单一文件
  • 早期 Linux 只支持它
  • 仍然被支持
  • 优先级 低于 /etc/sysctl.d/

2️⃣ sysctl.d 目录(推荐方式)

sysctl 会扫描以下目录(不是所有发行版路径都一样,但顺序一致):

/usr/lib/sysctl.d/*.conf
/run/sysctl.d/*.conf
/etc/sysctl.d/*.conf

📌 这是 systemd 规定的标准顺序


3️⃣ 内核运行时接口(不算“配置文件”)

/proc/sys/*
  • sysctl -wecho 写入
  • 重启即失效
  • 优先级最高(但不可持久)

二、完整加载顺序(非常重要)

✅ 官方正确加载顺序(systemd-sysctl)

按目录顺序加载 -> 同名参数后加载的覆盖先加载的

1. /usr/lib/sysctl.d/*.conf   (系统 / 发行版默认)
2. /run/sysctl.d/*.conf       (运行时生成,临时)
3. /etc/sysctl.d/*.conf       (管理员自定义,最高优先级)
4. /etc/sysctl.conf           (最后加载,但优先级低于 /etc/sysctl.d)

⚠️ 重点:

  • 后加载的同名参数会覆盖先加载的
  • /etc/sysctl.conf 是最后读,但优先级低于 /etc/sysctl.d/*.conf

这点很多文章写反了,你这里要记住正确结论。


三、目录内部的加载顺序

同一目录内

按文件名 ASCII 字典序加载

例如:

10-network.conf
20-vm.conf
99-custom.conf

加载顺序:

10 -> 20 -> 99

📌 数字前缀是事实上的“优先级机制”


四、为什么推荐用 /etc/sysctl.d/ 而不是 sysctl.conf?

原因总结一句话

sysctl.conf 是“单文件时代”的遗留方案,sysctl.d 是现代 systemd 化、可维护、可分层的方案。

对比

方式 推荐度 说明
/etc/sysctl.conf ❌ 不推荐新增 易混乱、不可模块化
/etc/sysctl.d/*.conf ✅ 强烈推荐 可分类、可覆盖
/usr/lib/sysctl.d ⚠️ 不要改 发行版默认
/run/sysctl.d ⚠️ 临时 程序自动生成

五、典型最佳实践(你这种用户必看)

示例目录规划

/etc/sysctl.d/
├── 10-kernel.conf        # kernel / pid / numa
├── 20-vm.conf            # 内存 / OOM / swap
├── 30-fs.conf            # 文件系统 / inotify
├── 40-net-base.conf      # 基础网络
├── 50-net-tcp.conf       # TCP 调优
├── 60-netfilter.conf     # conntrack / nftables
├── 99-custom.conf        # 应急覆盖

六、systemd 是什么时候加载 sysctl 的?

systemd-sysctl.service
  • 启动阶段:非常早
  • 网络、容器、数据库启动前
  • 属于 基础系统初始化

查看状态:

systemctl status systemd-sysctl

重新加载(不重启):

sysctl --system

等价于:

systemd-sysctl

七、如何查看“最终生效值”来自哪里?

查看当前值

sysctl net.ipv4.tcp_tw_reuse

查找是哪个文件设置的

grep -R "net.ipv4.tcp_tw_reuse" \
  /etc/sysctl.conf \
  /etc/sysctl.d \
  /run/sysctl.d \
  /usr/lib/sysctl.d

八、一句话终极总结(背下来)

sysctl 参数按 /usr/lib -> /run -> /etc 目录顺序加载,同目录按文件名排序,后加载的值覆盖先加载的,生产系统应只在 /etc/sysctl.d/ 中维护配置。