proc目录介绍(一):目录结构

proc目录介绍(一):目录结构

Linux系统的/proc目录介绍

在GUN/Linux操作系统中,/proc是一个位于内存中的伪文件系统(in-memory pseudo-file system)。该目录下保存的不是真正的文件和目录,而是一些“运行时”信息,如系统内存、磁盘io、设备挂载信息和硬件配置信息等。proc目录是一个控制中心,用户可以通过更改其中某些文件来改变内核的运行状态。proc目录也是内核提供给我们的查询中心,我们可以通过这些文件查看有关系统硬件及当前正在运行进程的信息。在Linux系统中,许多工具的数据来源正是proc目录中的内容。例如,lsmod命令就是cat /proc/modules命令的别名,lspci命令是cat /proc/pci命令的别名。

proc目录被称作虚拟文件系统,自然有些独特的属性。如果读者使用ls命令查看proc目录下的文件,会发现该目录下的绝大部分文件大小为0。如下所示:

dr-xr-xr-x  2 root root               0 Apr 29 16:26 acpi
dr-xr-xr-x  4 root root               0 Apr 29 16:26 asound
-r--r--r--  1 root root               0 Apr 29 16:26 buddyinfo
dr-xr-xr-x  5 root root               0 Apr 29 16:26 bus
-r--r--r--  1 root root               0 Apr 29 16:26 cgroups
-r--r--r--  1 root root               0 Apr 29 16:26 cmdline
-r--r--r--  1 root root               0 Apr 29 16:26 consoles
-r--r--r--  1 root root               0 Apr 29 16:26 cpuinfo
-r--r--r--  1 root root               0 Apr 29 16:26 crypto
-r--r--r--  1 root root               0 Apr 29 16:26 devices
-r--r--r--  1 root root               0 Apr 29 16:26 diskstats
-r--r--r--  1 root root               0 Apr 29 16:26 dma
dr-xr-xr-x  2 root root               0 Apr 29 16:26 driver
-r--r--r--  1 root root               0 Apr 29 16:26 execdomains
-r--r--r--  1 root root               0 Apr 29 16:26 fb
-r--r--r--  1 root root               0 Apr 29 16:26 filesystems
dr-xr-xr-x 10 root root               0 Apr 29 16:26 fs
-r--r--r--  1 root root               0 Apr 29 16:26 interrupts
-r--r--r--  1 root root               0 Apr 29 16:26 iomem
-r--r--r--  1 root root               0 Apr 29 16:26 ioports
dr-xr-xr-x 32 root root               0 Apr 29 16:26 irq
-r--r--r--  1 root root               0 Apr 29 16:26 kallsyms
-r--------  1 root root 140737486262272 Apr 29 16:26 kcore

虽然这些文件大小为0,但是,我们却可以使用cat、more或less命令查看其中的内容。例如,在上面的文件中,cmdline保存了操作系统的启动参数。可以使用cat命令查看该文件中的内容以获取操作系统的启动参数:

root@host1:/proc# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.2.73-amd64 root=/dev/vda1 ro console=tty0 console=ttyS0,115200 quiet

关于每一个文件的含义,可以使用下面的命令查看帮助信息:

# man proc

通过的上面的命令查看kcore文件的解释,我们知道,/proc/kcore是物理内存的镜像,它会显示文件大小的,但是不占用实际的磁盘空间,所以,看到该文件非常大,也不用担心。kcore文件的大小等于已被使用的物理内存的大小加上4k,该文件可以使用gdb工具调试以查看内核中的数据结构。

proc目录中包含了若干文件,以及多个名字是数字的目录。proc目录下的文件,保存的是整个系统的信息。名字是数字的目录,保存的是进程的信息。目录的名字正是进程的pid。因此,我们可以通过读取proc目录下有多少个以数字命名的目录,来判断当前系统中有多少进程。如下所示:

In [1]: import os

In [2]: pids = [ item for item in os.listdir('.') if item.isdigit() ]

In [3]: len(pids)
Out[3]: 158

proc目录下常用文件介绍

proc目录包含了许多的文件,每个文件保存了系统中某一部分内容。为了节省篇幅,我们仅介绍部分常用文件。

在编写Linux的监控系统时,最基本的监控包括cpu、内存、磁盘和网络等信息。这些信息可以从下面几个文件中获得:

  • /proc/loadavg 保存了系统负载的平均值,其前三列分别表示最近1分钟、5分钟及15分的平均负载。反映了当前系统的繁忙情况。
  • /proc/meminfo 当前内存使用的统计信息,常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值;
  • /proc/diskstats 磁盘设备的磁盘I/O统计信息列表;
  • /proc/net/dev 网络流入流出的统计信息,包括接收包的数量、发送包的数量,发送数据包时的错误和冲突情况等。

除了使用proc目录获取系统的监控信息以外,我们也会经常使用proc目录查询系统信息。例如,我们可以通过/proc/filesystem目录查看当前系统中支持的文件系统:

# cat /proc/filesystems

通过/proc/cpuinfo文件查看cpu的详细信息。例如,使用下面的命令可以查看逻辑cpu的个数:

# cat /proc/cpuinfo | grep  'processor'

其他一些常用的proc文件包括:

  • /proc/cmdline 在启动时传递至内核的启动参数,通常由grub启动管理工具进行传递;
  • /proc/devices 系统已经加载的所有块设备和字符设备的信息;
  • /proc/mounts 系统中当前挂载的所有文件系统;
  • /proc/partitions 块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目;
  • /proc/uptime 系统上次启动以来的运行时间;
  • /proc/version 当前系统运行的内核版本号,在作者的Debian系统中,还会显示系统安装的gcc版本;
  • /proc/vmstat 当前系统虚拟内存的统计数据。

进程目录下常用文件介绍

proc目录下有很多名字为数字的目录,目录的名称与进程的pid一一对应(形如/proc[pid]),我们可以通过这些目录查看进程相关的信息。显然,目录的名称随着进程的生命周期变化,当进程退出时,相应的目录也就会消失。

进程目录下也包含了较多的文件和目录,其中,比较常用的有:

  • cmdline 与/proc/cmdline文件类似,保存了当前进程的启动命令;

      # cat cmdline
      udevd--daemon
    
  • cwd cwd是一个符号链接,指向进程的运行目录;

  • exe exe也是一个软链接,指向启动进程的可执行文件,通过/proc/[pid]/exe可以启动当前进程的一个拷贝;

  • environ 包含于进程相关联的环境变量,变量名用大写字母表示,其值用小写字母表示;

      # cat environ
      CONSOLE=/dev/consoleHOME=/init=/sbin/initrunlevel=SINIT_VERSION=sysvinit-2.88TERM=linuxBOOT_IMAGE=/boot/vmlinuz-3.2.73-amd64PATH=/sbin:/binRUNLEVEL=SPREVLEVEL=NSHELL=/bin/shPWD=/previous=Nrootmnt=/root
    
  • fd fd目录包含了进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接;

    fd目录下的文件,与文件一一对应,我们可以通过fd目录下的文件个数,统计当前进程打开的文件句柄数。此外,也可以直接读取文件的内容,就像读取真实文件一样。

      /proc/334/fd# ls
      0  1  10  2  3	4  5  6  7  8  9
    
  • limits 保存了进程使用资源的限制信息,包括软限制、硬限制以及取值的单位;

      # cat limits
      Max open files            1024                 4096                 files
      Max locked memory         65536                65536                bytes
    
  • task 该目录下包含了当前进程所运行的每一个线程的相关信息,每个线程的相关信息文件均保存在一个由线程号(tid)命名的目录中。

欢迎加入MySQL+Python+大数据+NoSQL技术交流QQ群(群号:306706593)。

发布于 2017-05-16