跳到主要内容

Proc 文件系统

概述

Linux 系统上的 /proc 目录是一种文件系统,即 proc 文件系统(procfs),它以文件系统的方式为用户提供访问系统内核数据的操作接口。proc 文件系统是一种内核和内核模块用来向进程(process)发送信息的机制,因此被称为 proc。

与其它常见的文件系统不同的是,proc 是一种伪文件系统(也即虚拟文件系统),它只存在于内存当中,因此它会在系统启动时创建并挂载到 /proc 目录,在系统关闭时卸载并释放。

下面是某设备上 /proc 的挂载信息。

$ mount | grep proc
proc on /proc type proc (rw,relatime)

Proc 文件系统存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看系统和进程的信息,或者改变内核的运行状态,因此可以把它视为 Linux 内核开放给用户的控制和信息中心。实际上,proc 文件系统是内核空间和用户空间之间的一种通信媒介。

Linux Proc 文件系统

/proc 目录

进程目录

在 Linux 系统中,每一个运行的进程在 /proc 下都有一个以该进程 PID 命名的专属目录,包括内核进程。

$ ls -l /proc/ | head
total 0
dr-xr-xr-x 9 root root 0 61 08:48 1
dr-xr-xr-x 9 root root 0 63 13:52 10
dr-xr-xr-x 9 www-data www-data 0 63 13:52 1000
dr-xr-xr-x 9 www-data www-data 0 63 13:52 1001
dr-xr-xr-x 9 rudy rudy 0 63 13:52 100743
dr-xr-xr-x 9 root root 0 63 13:52 101
dr-xr-xr-x 9 rudy rudy 0 63 13:52 101638
dr-xr-xr-x 9 rudy rudy 0 63 13:52 101640
dr-xr-xr-x 9 rudy rudy 0 63 13:52 101641

进程目录是读取进程信息的接口,其中包含许多文件和子目录。

total 0
-rw-r--r-- 1 mandeep mandeep 0 Apr 1 01:14 oom_score_adj
dr-xr-xr-x 13 mandeep mandeep 0 Apr 1 01:14 task
-r--r--r-- 1 mandeep mandeep 0 Apr 1 01:16 status
-r--r--r-- 1 mandeep mandeep 0 Apr 1 01:16 stat
-r--r--r-- 1 mandeep mandeep 0 Apr 1 01:16 cmdline
-r--r--r-- 1 mandeep mandeep 0 Apr 1 01:17 wchan
-rw-r--r-- 1 mandeep mandeep 0 Apr 1 01:17 uid_map
-rw-rw-rw- 1 mandeep mandeep 0 Apr 1 01:17 timerslack_ns
-r--r--r-- 1 mandeep mandeep 0 Apr 1 01:17 timers
-r-------- 1 mandeep mandeep 0 Apr 1 01:17 syscall
-r--r--r-- 1 mandeep mandeep 0 Apr 1 01:17 statm
-r-------- 1 mandeep mandeep 0 Apr 1 01:17 stack
-r--r--r-- 1 mandeep mandeep 0 Apr 1 01:17 smaps
-rw-r--r-- 1 mandeep mandeep 0 Apr 1 01:17 setgroups
-r--r--r-- 1 mandeep mandeep 0 Apr 1 01:17 sessionid
-r--r--r-- 1 mandeep mandeep 0 Apr 1 01:17 schedstat
-rw-r--r-- 1 mandeep mandeep 0 Apr 1 01:17 sched
lrwxrwxrwx 1 mandeep mandeep 0 Apr 1 01:17 root -> /proc/2341/fdinfo
-rw-r--r-- 1 mandeep mandeep 0 Apr 1 01:17 projid_map
-r-------- 1 mandeep mandeep 0 Apr 1 01:17 personality
...

下表是 /proc/<PID> 进程目录常用文件和子目录说明。

目录描述
/proc/PID/cmdline启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息。
/proc/PID/cwd指向当前进程运行目录的一个符号链接。
/proc/PID/environ进程环境变量列表。
/proc/PID/exe指向启动当前进程的可执行文件(完整路径)的符号链接,可以通过它来启动当前进程的一个拷贝。
/proc/PID/fd包含进程相关的所有的文件描述符。
/proc/PID/maps与进程(可执行文件和库)相关的内存映射信息。
/proc/PID/mem指代进程持有的内存,不可读。
/proc/PID/root链接到进程的根目录。
/proc/PID/stat进程状态信息。
/proc/PID/statm进程使用的内存状态信息。
/proc/PID/status进程状态信息,比 stat/statm 更具可读性。
/proc/self链接到当前正在执行的进程。

除了通过 /proc/<PID> 来获取指定进程的信息,Linux 还提供了一个有趣的 /proc/self 目录。这个目录的特别之处在于,不同的进程访问该目录时获得的信息是不同的,进程通过访问 /proc/self 目录可以获取该进程自己的信息,而不用每次都获取 PID,内容等价于 /proc/<self-pid>。在 fork、daemon 等 PID 可能发生变化的情形下很实用。

子文件

除了获取进程信息,我们通常还会用 /proc 来追踪进程的状态、内核的状态、内存信息、CPU 使用率、系统启动时间(可以使用系统正常运行时间)等相应的信息。

/proc 目录中的文件及其说明如下:

文件描述
/proc/buddyinfo每个内存区中的每个 order 有多少块可用,和内存碎片问题有关。
/proc/cmdline启动时传递给 kernel 的参数信息。
/proc/cpuinfoCPU 信息。
/proc/crypto内核可用的加密模块及细节。
/proc/devices已装载的设备(包括字符设备和块设备)。
/proc/diskstats每个逻辑磁盘设备的信息(包括设备编号) 。
/proc/dma已注册使用的 ISA DMA 通道列表。
/proc/execdomainsLinux 内核当前支持的 execution domains。
/proc/fb帧缓冲设备列表,包括数量和控制它的驱动。
/proc/filesystems内核当前支持的文件系统类型。
/proc/interrupts当前系统使用的中断信息。
/proc/iomem每个物理设备当前在系统内存中的映射。
/proc/ioports一个设备的输入输出所使用的注册端口范围。
/proc/kcore代表系统的物理内存,存储为核心文件格式。
/proc/kmsg等待内核输出信息,可以通过 /sbin/klogd 或 /bin/dmesg 来处理。
/proc/loadavg依据过去一段时间内 CPU 和 IO 的状态得出的负载形态,与 uptime 命令有关。
/proc/locks内核锁住的文件列表。
/proc/mdstat多硬盘,RAID 配置信息(md=multiple disks)。
/proc/meminfo内核管理内存的信息。
/proc/misc在杂项设备(设备号为10)上注册的驱动。
/proc/modules所有装载到内核的模块列表。
/proc/mounts系统当前的所有挂载信息。
/proc/mtrr系统使用的 Memory Type Range Registers(MTRRs)。
/proc/partitions磁盘分区中的块分配信息。
/proc/slabinfo系统中所有活动的 slab 缓存信息。
/proc/stat所有的 CPU 活动信息。
/proc/sysrq-trigger该文件是只写的。使用 echo 命令来写这个文件的时候,远程 root 用户可以执行大多数的系统请求关键命令,就好像在本地终端执行一样。要写入这个文件,需要把 /proc/sys/kernel/sysrq 设置为1,开启 SysRq(Magic System Request Key)功能。
/proc/uptime系统自开机以来的运行时间。
/proc/schedstatkernel 调度器的统计信息。
/proc/swaps交换区域的使用情况。
/proc/version当前 Linux 内核版本、发行版号、gcc 版本号、更新时间等信息。
/proc/vmcore内核 panic 时的内存映像。
/proc/vmstat虚拟内存统计信息。
/proc/zoneinfo显示内存空间的统计信息,对分析虚拟内存行为很有用。

子目录

/proc 目录中的子目录及其说明如下:

子目录描述
/proc/acpi高级配置和电源接口。如果内核在引导系统时检测到 ACPI BIOS,将会自动激活 ACPI。
/proc/asoundALSA 声卡设备信息。
/proc/bus系统总线(Bus)信息,例如 /proc/bus/input/、/proc/bus/pci 等。
/proc/device-tree设备树信息。
/proc/driver驱动信息。
/proc/dynamic_debug控制动态打印调试。
/proc/fs文件系统信息。
/proc/irq中断请求设备信息。
/proc/net网卡设备信息。例如 /proc/net/dev 显示网络适配器及统计信息。
/proc/pressure系统资源的压力信息,包括 cpu、io 和 memory。
/proc/scsiscsi 设备信息(通过 SCSI 或 RAID 控制器连接的所有设备)。
/proc/sys包括所有的内核参数信息,与 sysctl -a 相似
/proc/sysvipc系统 ipc 信息,包括 msg、sem 和 shm。
/proc/ttytty 设备信息。

注意:上述文件和目录并不一定都会出现在你的系统,这取决于 Linux 系统内核的配置和装载的模块。