proc文件系统
进程数据文件系统(process data filesystem, procfs)装载在 /proc,缩写为 procFS。
proc 文件系统是一种虚拟文件系统,其信息不能从块设备读取。只有在读取文件内容时才动态生成相应的信息。使用proc文件系统,可以获得有关内核各子系统的信息(如内存利用率、附接的外设,等等),也可以在不重新编译内核源代码的情况下修改内核的行为,或重启系统。
proc 文件系统提供一种接口,可用于该机制导出的所有选项,直接地修改参数无需开发专门程序,只需要一个shell和标准的 cat
、 echo
程序即可。
/proc信息
尽管proc文件系统的容量依系统而不同,其中仍然包含了许多深层嵌套的目录、文件、链接。信息可以分为以下几大类:
(1)内存管理;
(2)系统进程的特征数据;
(3)文件系统;
(4)设备驱动程序;
(5)系统总线;
(6)电源管理;
(7)终端;
(8)系统控制参数。
Linux系统上的/proc目录是一种文件系统,即proc文件系统。
/proc是一种伪文件系统(也即虚拟文件系统),具体目录如下:
proc 常见文件
buddyinfo
:用于诊断内存碎片问题。
cmdline
:在启动时传递至内核的相关参数信息,这些信息通常由lilo
或grub
等启动管理工具进行传递;
cpuinfo
:处理器的相关信息的文件;
crypto
:系统上已安装的内核使用的密码算法及每个算法的详细信息列表;
devices
:系统已经加载的所有块设备和字符设备的信息;
diskstats
:每块磁盘设备的磁盘 I/O 统计信息列表;
filesystems
:当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;
interrupts
:X86 或 X86_64 体系架构系统上每个 IRQ 相关的中断号列表;
iomem
:每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息;
ioports
:当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;
kallsyms
:模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;
locks
:保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;
meminfo
:系统中关于当前内存的利用状况等的信息,常由free命令使用;
mounts
:在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统;
modules
:当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看;
partitions
:块设备每个分区的主设备号(major)和次设备号(minor)等信息;
stat
:实时追踪自系统上次启动以来的多种统计信息;
swaps
:当前系统上的交换分区及其空间利用信息;
uptime
:系统上次启动以来的运行时间;
version
:当前系统运行的内核版本号;
vmstat
:当前系统虚拟内存的多种统计数据;
zoneinfo
:内存区域(zone)的详细信息列表;
proc 数据结构
1、proc 核心数据结构
实现 proc 文件系统的代码紧围绕这些结构而建立的,proc 大量使用 VFS 的数据结构,因为作为一种文件系统,它必须集成到内核的 VFS 抽象层中。
还有一些特定于 proc 的数据结构,用于组织内核提供的数据信息。还必须提供一个到内核各个子系统的接口,使得内核能从其数据结构中提取信息,然后借助 /proc
提供给用户空
间。proc 文件系统中的每个数据项都由proc_dir_entry
的一个实例描述,
2、装载proc文件系统
内核内部用于描述 proc 文件系统结构和内容的数据已初始化之后,下一步是将该文件系统装载到目录树中。在内核添加新文件系统时,会扫描一个链表,查找与该文件系统相关的file_system_type
实例。
proc 文件系统的超级块由proc_get_sb
提供。该函数基于另一个内核辅助例程( get_sb_single
),借助proc_fill_super
(主要负责用一些定义后从不改变的值来填充 super block 的每个成员)来填充一个super_block
的新实例。
proc_sops
中对超级块的各个操作,其中收集内核管理proc文件系统所需的各个函数,
静态的proc_dir_entry
实例:
管理 /proc 数据项
1、数据项的创建和注册
新数据项分两个步骤添加到proc文件系统。首先,创建proc_dir_entry
的一个新实例,填充描述该数据项的所有需要的信息。
使用fs/proc/generic.c
中的proc_register
将其注册到proc
文件系统当中:
创建数据项之后,注册到 /proc
文件系统步骤:
a.生成一个唯一 proc 内部编号,向数据项赋予身份。get_inode_number
返回一个未使用的编号,用于为动态生成的数据项;
b.必须适当地设备proc_dir_entry
实例的 next
和 parent
成员,将新数据项集成到 proc
文件系统的层次结构中;
c.如果此proc_dir_entry
成员的proc_iops
或proc_fops
为NULL
指针,那么需要根据文件类型,适当地设备指向file_operations
和inode_operations
结构实例的指针。
用于管理proc数据项:
proc_mkdir
创建一个新目录;
proc_mkdir_mode
创建一个新目录,目录的访问权限可以显式指定;
proc_symlink
生成一个符号链接;
remove_proc_entry
从proc目录中删除一个动态生成的数据项;