Procfs

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

以下操作系统支持 procfs :

  • Solaris
  • BSD
  • Linux(将此概念扩展到了非进程相关数据)
  • IBM AIX (其实现基于Linux以提高兼容性)
  • QNX
  • 貝爾實驗室九號計畫(此概念之源头)

历史

UNIX 8

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

SVR4

Roger Faulkner 和 Ron Gomes 将 Unix 8 的 /proc 移植到了 SVR4,并在1991年1月的 USENIX 上发表了一篇题为 "The Process File System and Process Model in UNIX System V" 的论文。 此类 procfs 在功能上已经足够实现 ps 命令了, 但是其中的文件只能通过 read()write()ioctl() 系统调用来访问。从1995到1996年, Roger Faulkner 又为 Solaris 2.6 编写了 procfs-2 接口, 提供了一个结构化的, 基于子目录的 /proc 文件系统。

Plan 9

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

4.4BSD

4.4BSD 从 Plan 9 复刻了 /proc 的实现。然而从2011年2月开始, FreeBSD 逐步淘汰了 procfs [2],转而使用sysctl接口来获取进程相关信息。默认安装的 base 系统不依赖 procfs,FreeBSD 原生 ports 也不再依赖 procfs。macOS则完全弃用了procfs,只支持sysctl接口。[3]

为了提供对Linux用户空间程序的二进制兼容性,FreeBSD内核也提供类似于 Linux /proc/ 的linprocfs[4]

Solaris

Solaris 从一开始就提供对 /proc 的支持。 在1996年, Solaris 2.6 引入了由 Roger Faulkner 编写的 procfs2 。

Linux

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英语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' process
samtala 0
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 0 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 1 -> /dev/pts/3
lrwx------ 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

)

Linux 2.6把 /proc 下大量的非進程相關的系统信息移動到一個专门的偽文件系統,稱為 sysfs(該文件系統是掛載到 /sys 上面):

  • 电源管理系统(如果有的话)对应的目录/proc/acpi/proc/apm
  • /proc/buddyinfo, 信息关于伙伴内存分配器英语Buddy memory allocation用于处理内存碎片。[5]
  • /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"分别表示:[6]
"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不支持超线程.[7]

  • /proc/crypto, 可利用的加密模块列表
  • /proc/devices, 字符设备与块设备列表,按照设备ID排序,但给出了/dev名字的主要部分
  • /proc/diskstats, 给出了每一块逻辑磁盘设备的一些信息
  • /proc/filesystems, 当前时刻内核支持的文件系统的列表
  • /proc/interrupts, /proc/iomem, /proc/ioports, /proc/irq, 设备的一些与中断、内存访问有关的信息
  • /proc/kmsg, 用于跟踪读取内核消息 [8]
  • /proc/meminfo, 包含内核管理内存的一些汇总信息
  • /proc/modules, 是/proc最重要的文件之一, 包含了当前载入的内核模块列表
  • /proc/mounts, 包含了当前安装设备及安装点的符号链接
  • /proc/net/, 一个目录包含了当前网络栈的信息,特别是/proc/net/nf_conntrack列出了存在的网络连接(对跟踪路由特别有用,因为iptables转发被用于重定向网络连接)
  • /proc/partitions, 一个设备号、尺寸与/dev名的列表,内核用于辨别已存在的硬盘分区
  • /proc/scsi, 给出任何通过SCSIRAID控制器挂接的设备的信息
  • /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 (/proc processes) 中的程序,這個程序只對 procfs 具有意義。procfs 對部分功能從核心態移到用戶態的過程中產生重大的意義。像是 GNU 版本的 ps 只需在用戶態底下運作透過 procfs 取得資料便可以完成所有的工作。

相关命令:

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

Cygwin

Cygwin实现的 /proc 与Linux基本一致。

Cobalt

外部链接

  • A MacFUSE-Based Process File System for Mac OS X(页面存档备份,存于互联网档案馆
  • Access the Linux kernel using the Procfs(页面存档备份,存于互联网档案馆) An IBM developerWorks article by M. Tim Jones
  • Linux-Filesystem-Hierarchy(页面存档备份,存于互联网档案馆) Linux Documentation Project

参考

  1. ^ proc(4) manual page. [2011-01-05]. (原始内容存档于2012-02-19). 
  2. ^ procfs:已是过去式但仍未被遗忘. [2011-03-21]. (原始内容存档于2011-04-05). 
  3. ^ Amit Singh. /proc on Mac OS X. Mac OS X Internals: The Book. 2003 [2021-07-10]. (原始内容存档于2012-05-04). 
  4. ^ linprocfs(5). FreeBSD Manual Pages. The FreeBSD Project. 2019-11-13 [2021-06-12]. (原始内容存档于2021-06-12) (英语). 
  5. ^ 3.2.2. /proc/buddyinfo. centos.org. [2016-10-02]. (原始内容存档于2013-09-02). 
  6. ^ Baron, Jason. HT vs. dual-core. [2016-10-02]. (原始内容存档于2016-05-13). 
  7. ^ Understanding Linux /proc/cpuinfo. richweb.com. [2015-04-21]. (原始内容存档于2012-04-03). 
  8. ^ Nguyen, Binh. Linux Filesystem Hierarchy. Binh Nguyen: 63. 2004-07-30 [2016-07-18]. (原始内容存档于2016-12-14). /proc/kmsg[:] Messages output by the kernel. These are also routed to syslog. 
  • Red Hat, Inc. Tips & Tricks Featured Article: /proc/meminfo Explained, March 2003.(页面存档备份,存于互联网档案馆

磁盘
  • ADFS英语Advanced Disc Filing System
  • AdvFS
  • Amiga FFS英语Amiga Fast File System
  • Amiga OFS英语Amiga Old File System
  • APFS
  • AthFS英语AtheOS File System
  • Bcachefs
  • BFS
    • Be文件系统英语Be File System
    • 启动文件系统英语Boot File System
  • Btrfs
  • DFS英语Disc Filing System
  • EFS
  • Episode英语Episode filesystem
  • ext
  • FAT
  • Files-11英语Files-11
  • Fossil
  • HAMMER英语HAMMER
  • HFS
  • HFS+
  • HPFS
  • HTFS英语High Throughput File System
  • IBM通用并行文件系统英语IBM General Parallel File System
  • JFS
  • LFS英语Log-structured File System (BSD)
  • MFS
    • Macintosh文件系统英语Macintosh File System
    • Tivo媒体文件系统英语Tivo Media File System
  • MINIX
  • NetWare文件系统英语NetWare File System
  • Next3英语Next3
  • NILFS英语NILFS
    • NILFS2英语NILFS2
  • NSS英语Novell Storage Services
  • NTFS
  • OneFS英语OneFS distributed file system
  • PFS英语Professional File System
  • QFS英语QFS
  • QNX4FS英语QNX4FS
  • ReFS
  • ReiserFS
    • Reiser4英语Reiser4
  • Reliance英语Reliance (file system)
  • Reliance Nitro英语Reliance Nitro
  • RFS
  • SFS英语Smart File System
  • Soup英语Soup (Apple)
  • Tux3英语Tux3
  • UBIFS
  • UFS
  • VxFS英语Veritas File System
  • WAFL英语Write Anywhere File Layout
  • Xiafs英语Xiafs
  • XFS
  • Xsan英语Xsan
  • zFS英语zFS (z/OS file system)
  • ZFS
  • HSF英语High Sierra Format
  • ISO 9660
  • ISO 13490英语ISO 13490
  • UDF
  • CXFS英语CXFS
  • GFS2英语GFS2
  • Google檔案系統
  • OCFS2英语OCFS2
  • OrangeFS英语OrangeFS
  • PVFS英语Parallel Virtual File System
  • QFS英语Quantcast File System
  • Xsan英语Xsan
  • 更多...
NAS
特殊
  • Aufs
  • AXFS英语AXFS
  • 启动文件系统英语Boot File System
  • CDfs英语CDfs
  • 光盘文件系统英语Compact Disc File System
  • Cramfs
  • Davfs2英语Davfs2
  • EROFS
  • FTPFS
  • FUSE
  • GmailFS
  • Lnfs
  • LTFS英语Linear Tape File System
  • MVFS英语Rational MultiVersion File System
  • SquashFS
  • UMSDOS英语FAT filesystem and Linux
  • OverlayFS
  • UnionFS英语UnionFS
  • WBFS英语WBFS
  • configfs英语configfs
  • devfs英语Device file
  • debugfs英语debugfs
  • kernfs英语kernfs (BSD)
  • procfs
  • specfs
  • sysfs
  • tmpfs
  • WinFS
加密英语Filesystem-level encryption
类型
  • 集群
    • 全局英语Global file system
    • 网格英语Grid File System
    • 自我认证英语Self-certifying File System
  • 闪存
  • 日志
  • 日志结构英语Log-structured file system
  • 对象
  • 面向记录英语Record-oriented filesystem
  • 语义英语Semantic file system
  • 隐写英语Steganographic file system
  • 合成英语Synthetic file system
  • 版本英语Versioning file system
特性
访问控制英语Computer access control
接口
组织
内核
支持
技术
调试
  • CRIU英语CRIU
  • ftrace英语ftrace
  • kdump
  • Linux内核oops
  • SystemTap英语SystemTap
启动过程
ABI
API
用户空间
FS守护进程
封装库
内核部分
系统调用接口
内核内
  • ALSA
  • DRI
  • Video4Linux
  • New API英语New API
  • Crypto API英语Crypto API (Linux)
内核组件
  • 安全模块AppArmor
  • Exec Shield英语Exec Shield
  • grsecurity英语grsecurity
    • PaX英语PaX
  • seccomp英语seccomp
  • SELinux
  • Smack
  • TOMOYO Linux英语TOMOYO Linux
  • Linux PAM英语Linux PAM
  • initramfs
  • kexec
  • kGraft英语kGraft
  • kpatch英语kpatch
  • Ksplice
变种
虛擬化
采用
使用范围
采用者
  • Linux采用者列表
  • GENIVI联盟
  • Linux专有软件
人物
  • 分类 分类
  • 共享资源页面 共享资源
  • 维基百科图书 教科书
  • 维基学院页面 学院
  • 主题 主题