procfs

在许多类 Unix 计算机系统中, procfs 是 进程 文件系统 (file system) 的缩写,包含一个伪文件系统(启动时动态生成的文件系统),用于通过内核访问进程信息。这个文件系统通常被挂载到 /proc 目录。由于 /proc 不是一个真正的文件系统,它也就不占用存储空间,只是占用有限的内存。

在许多类Unix计算机系统中,procfs是进程文件系统(file system) 的缩写,包含一个伪文件系统(启动时动态生成的文件系统),用于通过内核访问进程信息。这个文件系统通常被挂载到/proc目录。由于/proc不是一个真正的文件系统,它也就不占用存储空间,只是占用有限的内存。

以下操作系统支持 procfs:

Solaris

BSD

Linux(将此概念扩展到了非进程相关数据)

IBM AIX(其实现基于Linux以提高兼容性)

QNX

贝尔实验室九号项目(此概念之源头)

Tom J. Killian实现了UNIX 8th Edition版本的/proc:他1984年6月向USENIX提交了一份题为 "Processes as Files" 的论文。procfs 的设计目标是用来替代进行进程跟踪的ptrace系统调用。 详细文档请参考proc(4) manual page。

Roger Faulkner和Ron Gomes将 V8 的/proc移植到了SVR4,并在1991年1月的USENIX上发表了一篇题为 "The Process File System and Process Model in UNIX System V" 的论文。此类 procfs 支持ps的创建,但是文件只能由如下函数访问:read(),write(),ioctl().

九号项目实现了一个进程文件系统,但比 V8 做得更多。V8 的进程文件系统中,对一个进程相关的所有函数都在一个文件进行操作。九号项目使用单独的文件,提供这些函数,使得/proc 成为文件系统真正的一部分。

4.4BSD基于九号项目 克隆得到了其/proc系统。注意,在 FreeBSD 中 procfs 已被放弃。默认安装的 base 系统不依赖 procfs,FreeBSD 原生 ports 也不再依赖 procfs。

Solaris 2.6 的/proc(完成于 1996)也克隆了九号项目.

Linux中的/proc实现也克隆了九号项目中对应的部分。

每个正在运行的进程对应于/proc下的一个目录,目录名就是进程的PID,每个目录包含:

/proc/PID/cmdline, 启动该进程的命令行.

/proc/PID/cwd, 当前工作目录的符号链接.

/proc/PID/environ影响进程的环境变量的名字和值.

/proc/PID/exe, 最初的可执行文件的符号链接, 如果它还存在的话。

/proc/PID/fd, 一个目录,包含每个打开的文件描述符的符号链接.

/proc/PID/fdinfo, 一个目录,包含每个打开的文件描述符的位置和标记

/proc/PID/maps, 一个文本文件包含内存映射文件与块的信息。

/proc/PID/mem, 一个二进制图像(image)表示进程的虚拟内存, 只能通过ptrace化进程访问.

/proc/PID/root, 该进程所能看到的根路径的符号链接。如果没有chroot监狱,那么进程的根路径是/.

/proc/PID/status包含了进程的基本信息,包括运行状态、内存使用。

/proc/PID/task, 一个目录包含了硬链接到该进程启动的任何任务

(用户可以获得PID使用工具如pgrep,pidof或ps:

$ ls -l /proc/$(pgrep -n python)/fd # List all file descriptors of the most recently started `python' processsamtala 0lrwx------ 1 baldur baldur 64 2011-03-18 12:31 0 -> /dev/pts/3lrwx------ 1 baldur baldur 64 2011-03-18 12:31 1 -> /dev/pts/3lrwx------ 1 baldur baldur 64 2011-03-18 12:31 2 -> /dev/pts/3$ readlink /proc/$(pgrep -n python)/exe # List executable used to launch the most recently started `python' process /usr/bin/python3.1

)

Linux2.6把/proc下大量的非进程相关的系统信息移动到一个专门的伪文件系统,称为sysfs(该文件系统是挂载到/sys上面):

电源管理系统(如果有的话)对应的目录/proc/acpi或/proc/apm

/proc/buddyinfo, 信息关于伙伴内存分配器用于处理内存碎片。

/proc/bus, 包含对应于计算机上各种总线的目录, 如input/PCI/USB. 在/sys/bus下包含更丰富的信息。

/proc/fb, 可利用的帧缓冲的列表

/proc/cmdline, 传递给内核的启动选项。

/proc/cpuinfo, 包含CPU信息, 诸如厂商(vendor),型号 (family, model,model names), 速度, 缓存大小, 逻辑核数 , 物理核数,CPU flags,以及BogoMips.对于多核CPU,/proc/cpuinfo的逻辑核数"siblings"与物理核数"cpu cores"分别表示:

"siblings" = (HT per CPU package) * (# of cores per CPU package)"cpu cores" = (# of cores per CPU package)

CPU package是指单独封装的一颗CPU。这可以区分超线程与双核,例如每颗CPU超线程数量为siblings / CPU cores. 如果二者的值相等,则CPU不支持超线程.

/proc/crypto, 可利用的加密模块列表

/proc/devices, 字符设备与块设备列表,按照设备ID排序,但给出了/dev名字的主要部分

/proc/diskstats, 给出了每一块逻辑磁盘设备的一些信息

/proc/filesystems, 当前时刻内核支持的文件系统的列表

/proc/interrupts,/proc/iomem,/proc/ioports,/proc/irq, 设备的一些与中断、内存访问有关的信息

/proc/kmsg, 内核输出的一些信息

/proc/meminfo, 包含内核管理内存的一些汇总信息

/proc/modules, 是/proc最重要的文件之一, 包含了当前加载的内核模块列表

/proc/mounts, 包含了当前安装设备及安装点的符号链接

/proc/net/, 一个目录包含了当前网络栈的信息,特别是/proc/net/nf_conntrack列出了存在的网络连接(对跟踪路由特别有用,因为iptables转发被用于重定向网络连接)

/proc/partitions, 一个设备号、尺寸与/dev名的列表,内核用于辨别已存在的硬盘分区

/proc/scsi, 给出任何通过SCSI或RAID控制器挂接的设备的信息

/proc/self(即/proc/PID/其中进程ID是当前进程的) 为当前进程的符号链接

/proc/slabinfo, Linux内核频繁使用的对象的统计信息

/proc/swaps, 活动交换分区的信息,如尺寸、优先级等。

/proc/sys,动态可配置的内核选项. 其下的目录对应与内核区域,包含了可读与可写的虚拟文件(virtual file).

/proc/sysvipc, 包括共享内存与进程间通信(IPC)信息

/proc/tty, 包含当前终端信息;/proc/tty/driver是可利用的tty类型列表,其中的每一个是该类型的可用设备列表。

/proc/uptime, 内核启动后经过的秒数与idle模式的秒数

/proc/version, 包含Linux内核版本,发布号(distribution number), 编译内核的gcc版本,其他相关的版本

其他文件依赖于不同的硬件,模块配置与内核改变

Linux下使用/proc的基本工具是procps(/procprocesses) 中的程序,这个程序只对 procfs 具有意义。procfs 对部分功能从核心态移到用户态的过程中产生重大的意义。像是 GNU 版本的 ps 只需在用户态底下运作透过 procfs 获取数据便可以完成所有的工作。

相关命令:

sysctl

lsdev 收集相关设备的DMA, IRQ, I/O端口信息并汇总显示

procinfo

相关词汇