Proc File System



在许多类 Unix 计算机系统中, procfs 是 进程 文件系统 (file system) 的缩写,包含一个伪文件系统(启动时动态生成的文件系统),用于通过内核访问进程信息。这个文件系统通常被挂载到 /proc 目录。由于 /proc 不是一个真正的文件系统,它也就不占用存储空间,只是占用有限的内存。用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。 其中对我们一般作用最大的是/proc/PID问价夹的内容。
它广泛用在Solaris,BSD,Linux等操作系统中

一.procfs概述

1.procfs是虚拟文件系统,存储的是当前内核运行状态的一系列特殊文件,其中大部分文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为0字节。此外,这些特殊文件中大多数文件的时间及日期属性通常为当前系统时间和日期,它们随时会被刷新(存储于RAM中)有关。
如下,只有kcore,mtrr,self net等几个文件的大小不是0……

2.proc目录中包含许多以数字命名的子目录每一个数字id命名的文件夹对应一个进程pid,这个文件夹并不包含任何数据,该文件实际上不包含任何数据;它只是作为指向实际进程信息所在位置的指针,如下是sshd的进程相关:

3.proc/pid中的”文件”是当前进程运行状态的所有信息

二./proc目录

排除掉/proc/PID的子目录,在proc目录下其余文件的作用大致如下:

  • /proc/acpi或/proc/apm 电源管理
  • /proc/buddyinfo, 信息关于伙伴内存分配器用于处理内存碎片。[2]
  • /proc/bus, 包含对应于计算机上各种总线的目录, 如input/PCI/USB. 在/sys/bus下包含更丰富的信息。
  • /proc/fb, 可利用的帧缓冲的列表
  • /proc/cmdline, 传递给内核的启动选项。
  • /proc/cpuinfo, 包含CPU信息, 诸如厂商(vendor),型号 (family, model,model names), 速度, 缓存大小, 逻辑核数 , 物理核数, CPU flags,以及BogoMips.对于多核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版本,其他相关的版本

其中比较重要的介绍如下:
2.1、/proc/apm

高级电源管理(APM)版本信息及电池相关状态信息,通常由apm命令使用;

2.2、/proc/cmdline

在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递;

2.3、/proc/cpuinfo

处理器的相关信息的文件;

2.4、/proc/crypto

系统上已安装的内核使用的密码算法及每个算法的详细信息列表;

2.5、/proc/devices

系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名;

2.6、/proc/diskstats

每块磁盘设备的磁盘I/O统计信息列表;
2.7、/proc/dma

每个正在使用且注册的ISA DMA通道的信息列表;

2.8、/proc/filesystems

当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型;

2.9、/proc/interrupts

X86或X86_64体系架构系统上每个IRQ相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号;

2.10、/proc/ioports

当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;
如下面所示,第一列表示注册的I/O端口范围,其后表示相关的设备;

2.11、/proc/kcore

系统使用的物理内存,以ELF核心文件(core file)格式存储,其文件大小为已使用的物理内存(RAM)加上4KB;这个文件用来检查内核数据结构的当前状态,因此,通常由GBD通常调试工具使用,但不能使用文件查看命令打开此文件
2.12、/proc/locks
保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;如下输出信息中每行的第二列表示当前锁定使用的锁定类别,POSIX表示目前较新类型的文件锁,由lockf系统调用产生,FLOCK是传统的UNIX文件锁,由flock系统调用产生;第三列也通常由两种类型,ADVISORY表示不允许其他用户锁定此文件,但允许读取,MANDATORY表示此文件锁定期间不允许其他用户任何形式的访问;

2.13、/proc/meminfo

系统中关于当前内存的利用状况等的信息,常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值;

2.14、/proc/mounts

每个进程自身挂载名称空间中的所有挂载点列表文件的符号链接;

2.15、/proc/modules

当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看;如下所示,其中第一列表示模块名,第二列表示此模块占用内存空间大小,第三列表示此模块有多少实例被装入,第四列表示此模块依赖于其它哪些模块,第五列表示此模块的装载状态(Live:已经装入;Loading:正在装入;Unloading:正在卸载),第六列表示此模块在内核内存(kernel memory)中的偏移量

2.16、/proc/slabinfo

在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool
slab是操作系统针对小内存的一种内存分配算法。

2.17、/proc/stat
实时追踪自系统上次启动以来的多种统计信息;

2.18、/proc/swaps

当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于/proc/swap目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大;

三./proc/sys目录

与proc下其它文件的“只读”属性不同的是,管理员可对/proc/sys子目录中的许多文件内容进行修改以更改内核的运行特性。写入操作通常使用类似于“echo DATA > /path/to/your/filename”的格式进行。需要注意的是,即使文件可写,其一般也不可以使用编辑器进行编辑。

3.1、/proc/sys/debug
此目录通常是一空目录;

3.2、/proc/sys/dev

为系统上特殊设备提供参数信息文件的目录,其不同设备的信息文件分别存储于不同的子目录中,如大多数系统上都会具有的/proc/sys/dev /cdrom和/proc/sys/dev/raid(如果内核编译时开启了支持raid的功能) 目录,其内存储的通常是系统上cdrom和raid的相关参数信息文件。

四./proc/PID目录

首先,/proc中有一个self文件夹, 是读取进程本身的信息接口,是一个link,它指向的就是当前访问/proc的进程的/proc/PID
例:

这说明当前访问该/proc文件夹的进程PID=45820

/proc/PID中有众多我们比较关心的进程信息,总结如下:

1.1、cmdline — 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息;

1.2、cwd — 指向当前进程运行目录的一个符号链接;

1.3、environ — 当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示;

1.4、exe — 指向启动当前进程的可执行文件(完整路径)的符号链接
通过/proc/N/exe可以启动当前进程

1.5、fd — 这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接;

1.6、limits — 当前进程所使用的每一个受限资源的软限制、硬限制和管理单元;此文件仅可由实际启动当前进程的UID用户读取。此内容可能与unlimt -a 的内容不一致,不同的进程的limit可能不同。

1.7、maps — 当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表;maps非常重要,通过maps我们可Bypass ASLR,PIE,也可能泄露heap和stack的基地址

1.8、mem — 当前进程所占用的内存空间,由open、read和lseek等系统调用使用,不能被用户读取;
通过对mem的读写能够改写进程内存地址的anything,该操作也比较危险。

可以通过open,read,lsekk的含义就是可以在运行被文件操作注入代码执行。

1.9、root — 指向当前进程运行根目录的符号链接;在Unix和Linux系统上,通常采用chroot命令使每个进程运行于独立的根目录,chroot逃逸指的就是该地址。

1.10、stat — 当前进程的状态信息,包含一系统格式化后的数据列,可读性差,通常由ps命令使用;

**1.11、statm **— 当前进程占用内存的状态信息,通常以“页面”(page)表示;

1.12、status — 与stat所提供信息类似,但可读性较好,如下所示,每行表示一个属性信息

1.13、task — 目录文件,包含由当前进程所运行的每一个线程的相关信息,每个线程的相关信息文件均保存在一个由线程号(tid)命名的目录中,这类似于其内容类似于每个进程目录中的内容;

下面两个是访问内核的,必须root才能够访问
1.14、syscall – 显示当前进程正在执行的系统调用。举例如下:

1.15、stack显示当前进程的内核调用栈信息,内核编译时打开了CONFIG_STACKTRACE编译选项,才会生成这个文件。

最后,/proc/PID目录下还有许多操作相关的文件,例如mounts,io,timer,等,比较容易理解他们的含义。

参考资料

关于Linux下/proc目录的详细内容以及每个文件的格式,我们可以直接man linux page中找关于proc的文档。
深入理解linux系统下proc文件系统内容
/proc

发表评论