sysctl 会加载哪些目录下的配置文件?加载顺序是什么?
这是一个很关键、但经常被说错的问题。下面是一份 RHEL / AlmaLinux / Debian / Ubuntu 通用、且准确到实现层面的说明。
sysctl 的配置来源分三类:
/etc/sysctl.conf
- 单一文件
- 早期 Linux 只支持它
- 仍然被支持
- 优先级 低于
/etc/sysctl.d/
sysctl 会扫描以下目录(不是所有发行版路径都一样,但顺序一致):
/usr/lib/sysctl.d/*.conf
/run/sysctl.d/*.conf
/etc/sysctl.d/*.conf
📌 这是 systemd 规定的标准顺序
/proc/sys/*
sysctl -w或echo写入- 重启即失效
- 优先级最高(但不可持久)
按目录顺序加载 -> 同名参数后加载的覆盖先加载的
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
📌 数字前缀是事实上的“优先级机制”
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.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/中维护配置。