/proc 和 /sys 是内核提供的虚拟文件系统,/proc 侧重进程与内核状态的文本化快照(含少量可写参数),/sys 则基于对象模型提供设备与子系统的结构化配置接口,二者定位不同但协同互补。

/proc 和 /sys 是 Linux 内核提供的两个核心虚拟文件系统,它们不占用磁盘空间,内容由内核在运行时动态生成,用于用户空间与内核状态、配置和控制接口的交互。二者定位不同、设计目标各异,但存在协同关系。
procfs:进程与内核状态的只读快照(含少量可写接口)
/proc 主要暴露运行时内核和进程信息,本质是内核数据结构的“文本化视图”。例如 /proc/cpuinfo 显示 CPU 特性,/proc/meminfo 反映内存统计,/proc/[pid]/status 展示进程状态。多数文件只读,少数如 /proc/sys/net/ipv4/ip_forward 允许写入以调整内核参数——这类路径实际是 旧式 sysctl 接口的 procfs 封装,并非 /proc 的原始设计本意。
- 所有读操作触发内核回调函数(如 show()),实时拼装字符串返回
- 写操作仅限明确支持的节点,调用对应 handler 修改内核变量或触发动作(如 echo 1 > /proc/sys/net/ipv4/ip_forward 启用 IP 转发)
- 不保证原子性或强一致性;多次读取可能得到不同结果(如 /proc/loadavg)
sysfs:设备、驱动与子系统统一的面向对象配置接口
/sys 是 2.6 内核引入的结构化接口,围绕 kobject、kset、attribute 等内核对象模型构建,聚焦于设备拓扑、驱动绑定、电源管理、热插拔等硬件相关配置。路径体现层级关系,如 /sys/class/net/eth0/ 表示网卡设备,/sys/devices/pci0000:00/0000:00:1f.2/ 对应 PCI 设备实例。
- 每个文件对应一个 attribute,读写通过 store()/show() 方法实现,语义更严谨
- 属性值通常为单值(如 enable、power/state),强调可配置性而非状态展示
- 严格区分只读(state)、只写(trigger)、读写(enable)属性,权限由内核定义
二者交互的关键交集:/proc/sys 与 /sys/module
/proc/sys 是历史遗留接口,将部分内核可调参数(net、vm、fs 等子系统)映射为文件树。而 /sys/module/*/parameters 提供模块级参数的运行时读写能力。两者互补但不重叠:
- /proc/sys 中的 net.* 参数由网络子系统直接维护,修改立即生效;/sys/module/xt_nat/parameters/zero_checksum 则控制特定模块行为
- 某些参数存在双重暴露(如 /proc/sys/vm/swappiness 和 /sys/module/kernel/parameters/swappiness),但后者仅当模块未编译进内核时可见
- udev 和 systemd 依赖 /sys 中的 uevents 和 device attributes 触发规则,而 /proc 提供辅助信息(如 /proc/sys/kernel/modprobe 指定模块加载器)
用户空间工具如何协同使用二者
真实运维中常组合调用:systemctl status 读取 /proc/[pid]/stat 获取进程资源,再查 /sys/fs/cgroup/ 验证 cgroup 分配;lspci 解析 /sys/devices/pci* 下的 vendor/device ID,同时参考 /proc/bus/pci/devices 做兼容适配;sysctl 命令底层既访问 /proc/sys(默认),也可通过 -w 指定 /sys/module/… 路径(需内核支持)。
- 调试驱动问题时,先看 /sys/bus/pci/devices/*/uevent 是否有 change 事件,再检查 /proc/interrupts 确认中断分发
- 容器运行时(如 runc)通过 /sys/fs/cgroup/ 创建隔离组,同时读取 /proc/self/cgroup 获取当前进程归属
- 避免直接写 /proc/sys 或 /sys 下非文档化文件,优先使用 sysctl(8)、echo + tee、或专用工具(ip、ethtool)封装的逻辑











