Linux 虚拟文件系统
Linux 中的虚拟文件系统(又称伪文件系统)是一类特殊的文件系统,它们不存储于磁盘,而是由内核在内存中动态生成,用作内核与用户空间之间的编程接口,设计它们,主要是为了避免“每加一个内核功能就加一个系统调用”。
核心思想是:用“文件”这个成熟、通用、可组合的接口,去统一复杂多变的内核功能、设备、资源和存储系统。用统一的文件抽象,把存储、设备、内核状态、配置、资源控制和调试接口全部纳入同一套编程模型。
例如:
| 目录 | 常见文件系统类型 | 性质 |
|---|---|---|
/proc |
procfs,挂载类型常显示为 proc |
内核提供的伪文件系统,动态展示进程、内核状态和部分可调参数 |
/sys |
sysfs,挂载类型常显示为 sysfs |
内核提供的伪文件系统,展示设备、驱动、总线、内核对象等 |
/run |
tmpfs |
内存临时文件系统,存放运行时数据,如 pid 文件、socket、锁文件;重启清空 |
所以:
/proc是 procfs/sys是 sysfs/run通常是 tmpfs
区别在于:
/proc、/sys的内容不是真实磁盘文件,而是内核动态生成的接口,读写它们通常是在和内核交互。/run是 tmpfs,内容存在内存和/或 swap 中,可以像普通目录一样创建、删除文件,但重启后消失。/var/run在现代 Linux 上通常是指向/run的符号链接。
查看命令:
findmnt /proc /sys /run
或:
stat -f -c '%n -> %T' /proc /sys /run
典型输出类似:
/proc -> proc
/sys -> sysfs
/run -> tmpfs
补充:/sys 下面还可能挂载其他虚拟文件系统,例如 /sys/fs/cgroup 可能是 cgroup2;/run/user/1000 通常也是 tmpfs。另外 /dev 通常是 devtmpfs 或 tmpfs。
📋 Linux 主要虚拟文件系统一览
| 文件系统类型 | 典型挂载点 | 主要作用 | 示例/说明 |
|---|---|---|---|
| 内核信息接口 | |||
proc (procfs) |
/proc |
暴露进程、内核状态及部分可调参数 | cat /proc/cpuinfo 查看 CPU 信息 |
sysfs |
/sys |
以树状结构导出设备、驱动、总线等内核对象 | /sys/class/net/eth0/ 下查看网卡属性 |
debugfs |
/sys/kernel/debug |
提供内核调试信息(通常仅 root 可访问) | 用于调试内核子系统 |
tracefs |
/sys/kernel/tracing |
专门用于 ftrace 跟踪框架的接口 | 与 debugfs 功能相关但更专一 |
securityfs |
/sys/kernel/security |
暴露安全模块(如 SELinux、AppArmor)的接口 | 用于安全策略管理 |
configfs |
/sys/kernel/config |
用于动态创建、配置内核对象(如 USB gadget) | 用户空间可主动配置内核对象 |
bpf |
/sys/fs/bpf |
持久化 BPF 文件系统对象 | 用于 eBPF 程序和映射的 pinning |
pstore |
/sys/fs/pstore |
在系统崩溃后保留内核日志的持久化存储 | 用于分析崩溃原因 |
efivarfs |
/sys/firmware/efi/efivars |
读写 UEFI 固件变量 | 仅 UEFI 系统可用 |
fusectl |
/sys/fs/fuse/connections |
暴露 FUSE 连接信息 | 用于管理 FUSE 文件系统连接 |
| 设备与终端 | |||
devtmpfs |
/dev |
由内核维护的设备节点文件系统 | 自动创建设备文件 |
devpts |
/dev/pts |
伪终端(PTY)设备节点 | 每个终端会话对应一个节点 |
| 内存与共享 | |||
tmpfs |
/run, /dev/shm, /tmp 等 |
基于内存/交换的临时文件系统,重启后消失 | 用于存放运行时数据、共享内存 |
ramfs |
(通常由 rootfs 使用) |
最简单的内存文件系统,大小可动态伸缩 | 是 tmpfs 的基础,但不使用交换空间 |
hugetlbfs |
/dev/hugepages |
用于分配“大页”内存的接口 | 高性能计算场景常用 |
| 进程间通信 (IPC) | |||
mqueue |
/dev/mqueue |
暴露 POSIX 消息队列对象 | 用于进程间消息传递 |
rpc_pipefs |
/run/rpc_pipefs |
用于 NFS 等 RPC 服务的管道通信 | 由 sunrpc 模块使用 |
| 控制与自动化 | |||
cgroup2 (或 cgroup) |
/sys/fs/cgroup |
控制组层次结构,用于资源限制与隔离 | 管理进程组的 CPU、内存等资源 |
autofs |
/proc/sys/fs/binfmt_misc 等 |
自动挂载文件系统,按需触发 | 常用于自动挂载远程目录或可执行格式 |
binfmt_misc |
/proc/sys/fs/binfmt_misc |
注册额外的二进制格式,使内核能执行非原生程序 | 例如运行 Windows 或 Java 程序 |
nsfs |
(通过 nsfs 类型挂载) |
命名空间文件系统,用于操作内核命名空间 | 与容器技术密切相关 |
💡 如何查看当前系统的虚拟文件系统
你可以使用以下命令,直观地看到系统中所有已挂载的虚拟文件系统及其类型:
# 查看所有挂载点及其类型
findmnt -t proc,sysfs,tmpfs,devtmpfs,devpts,cgroup,cgroup2,securityfs,debugfs,tracefs,configfs,fusectl,bpf,pstore,efivarfs,mqueue,hugetlbfs,autofs,binfmt_misc,rpc_pipefs,nsfs
# 或者更简单地,过滤 /proc/mounts
cat /proc/mounts | awk '{print $2, $3}' | sort
这些虚拟文件系统是 Linux 系统内部运作的“窗口”和“控制面板”,理解它们有助于你更深入地掌握系统管理、性能调优和容器化技术。
浙公网安备 33010602011771号