/proc 和 /sys 是 linux 内核在内存中动态构建的两个核心虚拟文件系统,不占用磁盘空间,内容随系统运行实时生成;前者以文本快照形式暴露进程与内核状态,后者基于 kobject 模型提供结构化设备与驱动配置接口。

/proc 和 /sys 是 Linux 内核在内存中动态构建的两个核心虚拟文件系统,不占用磁盘空间,内容随系统运行实时生成。它们共同构成用户空间观察和控制内核行为的主要通道,但分工明确、设计逻辑不同。
/proc:进程与内核状态的文本化快照
/proc 本质是内核数据结构的“可读映射”,以人类易读的文本格式暴露运行时信息。它面向系统整体和单个进程,强调“当前正在发生什么”。
-
进程级信息:每个数字目录(如
/proc/1234)对应一个 PID,内含status、fd、environ等子项,反映该进程的资源使用、打开文件、环境变量等实时状态。 -
系统级统计:如
/proc/cpuinfo(CPU 架构与特性)、/proc/meminfo(内存总量、可用、缓存等)、/proc/loadavg(1/5/15 分钟平均负载),所有读取都触发内核即时拼装返回,结果可能随两次读取而变化。 -
少量可写接口:集中在
/proc/sys/下,例如echo 1 > /proc/sys/net/ipv4/ip_forward可即时启用 IP 转发。这类操作实际调用内核 handler 修改变量,不是通用写入机制,且不保证原子性。
/sys:设备与驱动的结构化对象模型
/sys 基于内核的 kobject 模型构建,路径体现物理或逻辑层级关系,聚焦“设备如何被组织、如何被配置”。它不展示状态快照,而是提供可管理的属性节点。
-
设备拓扑清晰可见:如
/sys/class/net/eth0/表示网卡设备类实例,/sys/devices/pci0000:00/0000:00:1f.2/对应具体 PCI 总线地址,路径本身就是设备关系的表达。 -
属性语义严谨:每个文件是一个 attribute,读写分别调用
show()和store()方法。值通常是单值(如power/state写入on或mem),权限由内核严格定义(只读、只写、读写)。 -
模块参数独立暴露:
/sys/module/[name]/parameters/提供已加载内核模块的运行时参数,例如/sys/module/xt_nat/parameters/zero_checksum控制特定模块行为,与/proc/sys中的全局参数互不重叠。
/proc/sys 与 /sys/module 的交集与边界
二者存在功能重叠但定位不同:前者是历史延续的全局 sysctl 接口封装,后者是模块粒度的配置入口。
-
/proc/sys/vm/swappiness修改影响整个虚拟内存子系统,立即生效;而/sys/module/kernel/parameters/swappiness仅当该参数来自可加载模块(未编译进内核)时才存在。 -
/proc/sys下的net.*参数由网络栈直接维护;/sys/class/net/eth0/下的speed、duplex等则由对应驱动实现,反映设备能力而非协议栈配置。 - udev 和 systemd 依赖
/sys中的 uevent 和 device 属性触发设备规则,/proc仅提供辅助信息(如进程打开的设备节点路径)。
实用操作提醒
两者均使用标准文件命令访问,但需注意底层机制差异:
- 读
/proc文件获取的是“某一时刻的快照”,多次读取可能不同;读/sys属性通常更稳定,因其反映设备或模块的当前设定值。 - 写操作必须确认目标文件是否支持——
/proc多数只读,/sys属性有明确权限限制,非法写入会报错Permission denied或Invalid argument。 - 修改前建议先查文档或用
man 7 sysfs、man 5 proc确认语义;生产环境避免直接 echo 修改关键参数,优先使用sysctl -w(对应/proc/sys)或模块专用工具。











