sysctl 内核参数72 条

/proc/sys 参数文件树

所有 sysctl 参数的运行时视图都在 /proc/sys 下,目录层级与点号命名严格对应,cat 读、echo 写,容器中多为命名空间隔离或只读。

/proc/sys 是什么

/proc/sys 是内核通过 procfs 暴露的运行时参数视图,每一层目录对应参数名里的一个点:net.ipv4.tcp_fin_timeout 就是 /proc/sys/net/ipv4/tcp_fin_timeout。读参数用 cat,写参数用重定向,效果与 sysctl 完全等价,区别只是 sysctl 会做名称检查并给出可读提示。部分目录只在对应模块加载后才出现,比如 net/netfilter 下的连接跟踪参数需要先加载相关模块。

基本信息

映射规则点号分段对应目录层级,如 net.core.somaxconn 对应 net/core/somaxconn
读取方式cat /proc/sys/<路径>,普通用户可读大部分参数
写入方式echo 值 > /proc/sys/<路径>,需要 root
权限表现文件权限多为 rw-r--r--,写入失败会给出明确错误
命名空间net 与部分子目录跟随 network namespace,容器内看到的是局部值
模块依赖模块未加载时对应目录不存在,写入前先确认路径存在

典型使用场景

  • 脚本里直接读写参数:不依赖 sysctl 命令是否安装,适合精简镜像
  • 确认参数是否存在:内核不支持该参数时目录里根本没有对应文件
  • 容器与命名空间排查:判断看到的网络参数属于宿主还是当前命名空间
  • 定位配置覆盖:直接读运行时文件,与配置文件里的声明值逐一比对
  • 临时试验:不进配置文件即可快速改值验证假设,重启自动回退

读写示例

读写示例
cat /proc/sys/vm/swappiness                  # 读单个参数
echo 10 > /proc/sys/vm/swappiness            # 写参数,需要 root 权限
ls /proc/sys/net/ipv4/ | head -20            # 浏览可用参数名
echo 1 > /proc/sys/net/ipv4/ip_forward 2>&1  # 写入报错时能直接看到原因
sysctl -w vm.swappiness=10                   # 等价写法,带名称检查
find /proc/sys/net -name 'somaxconn'         # 确认参数所在路径

常见现象与原因

现象原因处理方向
路径不存在内核未编译该功能或模块未加载先加载模块,或确认内核版本是否支持
写入报只读文件系统容器内 procfs 只读挂载属环境限制,需要调整挂载或容器特权
写入报权限不足非 root 或缺少能力位使用 root,或调整容器能力集
写入成功但读回旧值参数受更上层限制或值被约束到合法区间核对合法取值范围,必要时查内核文档
容器内的 /proc/sys/net 通常来自所属 network namespace,与宿主机的值可以不同,这也是容器里改网络参数不影响宿主的根本原因。排查前先确认自己处在哪个命名空间,否则会拿两套数据做无效对比。
点号与路径并非总能机械互转:net.netfilter.nf_conntrack_max 对应的是 /proc/sys/net/netfilter/nf_conntrack_max,属于 net 下独立的一层。拿不准时以 sysctl -a 的输出或目录浏览结果为准。

易错点

  • 认为点号与路径总能机械互转:部分参数层级特殊,按规则拼接会找不到文件
  • 在容器内改完后以为宿主机也变了:网络类参数属于命名空间,改动不会外溢
  • 写入后不回读:值超出允许范围时可能被约束或直接失败,需以回读值为准
  • 依赖 /proc/sys 做持久化:这里的写操作重启即失效,正式配置必须落到配置文件
  • 脚本里不判断路径是否存在:跨内核版本部署时同一段脚本可能直接报错中断

数据来源与参考

  • man 5 proc(Linux proc 文件系统)
  • Linux 内核 Documentation/filesystems/proc.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌