/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 的输出或目录浏览结果为准。