简介
/proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux内核空间和用户间之间进行通信。在 /proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件不同的是,这些虚拟文件的内容都是动态创建的。
最初开发/proc文件系统是为了提供有关系统中进程的信息。但是由于这个文件系统非常有用,因此内核中的很多元素也开始使用它来报告信息,或启用动态运行时配置。很多命令,都是通过读写 proc 文件系统,显示系统的当前运行信息
/proc文件系统包含了一些目录(用作组织信息的方式)和虚拟文件。虚拟文件可以向用户呈现内核中的一些信息,也可以用作一种从用户空间向内核发送信息的手段。实际上我们并不会同时需要实现这两点,但是本文将向您展示如何配置这个文件系统进行输入和输出。
[root@ljh2020 ~]# cd /proc
[root@ljh2020 proc]# ls
1 16 25 305 38 51 6403 7 buddyinfo driver kcore misc self
10 18 26 306 384 5156 6405 8 bus execdomains keys modules slabinfo
1035 19 27 311 39 52 6448 831 cgroups fb key-users mounts softirqs
11 2 28 326 396 5521 6450 894 cmdline filesystems kmsg mtrr stat
1148 20 29 327 415 563 6473 895 consoles fs kpagecount net swaps
12 21 3 3452 4376 568 648 9 cpuinfo interrupts kpageflags pagetypeinfo sys
1209 22 300 3494 47 597 65 900 crypto iomem loadavg partitions sysrq-trigger
1274 23 302 3592 49 599 661 944 devices ioports locks sched_debug sysvipc
13 24 303 36 5 600 669 96 diskstats irq mdstat schedstat timer_list
14 244 304 37 50 607 670 acpi dma kallsyms meminfo scsi timer_stats
/proc中另外一些可以注意的文件
cpuinfo
:它标识了处理器的类型和速度;
pci
:显示在PCI总线上找到的设备;
modules
:标识了当前加载到内核中的模块
/proc目录下常见的文件介绍:
/proc/apm
高级电源管理(APM)版本信息及电池相关状态信息,通常由apm命令使用;
/proc/ioports I/O
当前在用的已注册 I/O 端口范围;
proc/buddyinfo
用于诊断内存碎片问题的相关信息文件;
/proc/cmdline
在启动内核时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递
[root@ljh2020 ~]# cd /proc
[root@ljh2020 proc]# cat cmdline
BOOT_IMAGE=/boot/vmlinuz-3.10.0-957.21.3.el7.x86_64 root=UUID=1114fe9e-2309-4580-b183-d778e6d97397 ro crashkernel=auto rhgb quiet LANG=en_US.UTF-8 idle=halt biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200n8 noibrs
cmdline 文件记录相关进程的启动命令,包括这个命令后面带的参数 ,并描述这个进程的信息
[root@ljh2020 6520]# cat cmdline
/opt/jdk1.8.0_161/bin/java-Djava.util.logging.config.file=/root/apache-tomcat-9.0.31/conf/logging.properties-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager-Djdk.tls.ephemeralDHKeySize=2048-Djava.protocol.handler.pkgs=org.apache.catalina.webresources-Dorg.apache.catalina.security.SecurityListener.UMASK=0027-Dignore.endorsed.dirs=-classpath/root/apache-tomcat-9.0.31/bin/bootstrap.jar:/root/apache-tomcat-9.0.31/bin/tomcat-juli.jar-Dcatalina.base=/root/apache-tomcat-9.0.31-Dcatalina.home=/root/apache-tomcat-9.0.31-Djava.io.tmpdir=/root/apache-tomcat-9.0.31/temporg.apache.catalina.startup.Bootstrapstart
比如这里就可以看到相应启动tomcat程序后所产生的tomcat这个进程的信息
/proc/cpuinfo
CPU的硬件信息 (型号, 家族, 缓存大小等);
/proc/crypto
系统上已安装的内核使用的密码算法及每个算法的详细信息列表;
/proc/devices
系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名;
/proc/dma
每个正在使用且注册的ISA DMA通道的信息列表;
/proc/fb
帧缓冲设备列表文件,包含帧缓冲设备的设备号和相关驱动信息;
/proc/filesystems
当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型;
/proc/interrupts
ARM体系架构系统上每个IRQ相关的中断号列表,中断的使用及触发次数,调试中断时很有用;
/proc/iomem
每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息;
/proc/kmsg
此文件用来保存由内核输出的信息,可以用该文件取代系统调用 syslog(2) 来记录内核日志信息,对应dmesg命令;
/proc/meminfo
系统中关于物理内存、交换空间等的信息,系统内存占用情况;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值;
/proc/modules
当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看;如下所示,其中第一列表示模块名,第二列表示此模块占用内存空间大小,第三列表示此模块有多少实例被装入,第四列表示此模块依赖于其它哪些模块,第五列表示此模块的装载状态(Live:已经装入;Loading:正在装入;Unloading:正在卸载),第六列表示此模块在内核内存(kernel memory)中的偏移量;
/proc/partitions
块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目,如下图所示;
/proc/slabinfo
在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo文件列出了这些对象相关slap的信息;
/proc/uptime
系统上次启动以来的运行时间,如下所示,其第一个数字表示系统运行时间,第二个数字表示系统空闲时间,单位是秒;
/proc/version
当前系统运行的内核版本号;
/proc/zoneinfo
内存区域(zone)的详细信息列表,信息量较大;
/proc/kcore
该伪文件以 core 文件格式给出了系统的物理内存映象(比较有用),可以用 GDB 查探当前内核的任意数据结构。该文件的总长度是物理内存 (RAM) 的大小再加上 4KB;
/proc/kallsym
内核符号表,该文件保存了内核输出的符号定义, modules(X)使用该文件动态地连接和捆绑可装载的模块
/proc/loadavg
负载均衡,平均负载数给出了在过去的 1、 5,、15 分钟里在运行队列里的任务数、总作业数以及正在运行的作业总数。
/proc/locks
内核锁 ;
/proc/mounts
已加载的文件系统的列表,对应mount命令,无参数;
/proc/stat
全面统计状态表,CPU内存的利用率等都是从这里提取数据,对应ps命令;
/proc/swaps
对换空间的利用情况;