程序信息与系统设置目录 /proc

proc 是由 procfs 产生出来的 , profs 是 Linux 用来存储所有开机后硬件 , 进程相关信息的方式 . 全名为 process file system . 主目录为 /proc/ , 是一个虚拟文件系统 , 可以在任意目录加载 :

# mount -t proc /mnt/ /mnt/
# ls /mnt/
列出的文件省略…

可以使用 # man proc 学习该目录 .

/proc/cpuinfo

CPU 的硬件信息文件 . 比如之前查看 cpu 是否支持 KVM 虚拟话 , 就是通过该文件来查看的 :

# cat /proc/cpuinfo | grep vmx    #AMD 则是svm

/proc/devices

记录了 /dev/ 下设备的文件的分类方式 , 以 Major ID 为标准 :

# head -5 /proc/devices
Character devices:
 1 mem
 4 /dev/vc/0
 4 tty
 4 ttyS

/proc/interrupts

记录了每一个 IRQ 的编号对应到哪一个硬件设备 .

/proc/ioports

该文件将目前系统上所有可以看到的硬件对应的内存位置的分配表的信息呈现出来 .

/proc/kcore

该 文件记录系统的物理内存 , 也就是说主机的内存是多大该文件就是多大 . 但是如果在启动时用 mem=xxxM 参数时 , 该文件大小也会变成相应的 xxxM 大小 . 由于是虚拟文件系统 , 所以该文件并不占用实际的物理硬盘空间 , 用 du 可以去检验 .

# ll -h kcore
-r——– 1 root root 384M 2011-01-16 16:00 kcore
# du -sh kcore
0    kcore

/proc/keys , /proc/users

Linux 上的密钥保留服务 (Linux Key Retention Service ) , 是 2.6 内核提出的新方案 , 目的是将一些身份验证的文件暂存到内核中 , 请猛击这里了解详情 .

/proc/kmsg

在 系统尚尚未进入操作系统阶段还在加载 kernel 执行 Initrd 时 , 会将信息先记录在 kmsg 文件中 , 等进入操作系统执行完 klogd 后 , klogd 再将 kmsg 记录到 /var/log/messages 文件中 , 这就是为何在 messages 的一开始可以看到加载 kernel 和 initrd 的信息的原因 .

/proc/meminfo

显示系统的内存信息 .

# cat /proc/meminfo
MemTotal:       385244 kB
MemFree:          5488 kB
Buffers:         42328 kB
Cached:         148908 kB

/proc/modules

该文件记录目前系统上使用的模块 , lsmod 就是通过该文件以较整齐的方式将其列出来 . 大家可以使用 # cat /proc/modules# lsmod 来对比一下 .

/proc/mtrr , /proc/iomem

观 察系统中内存的配置 , 必须检查两个在 /proc/ 中的文件 : mtrr 以及 iomem . 简单的说 , mtrr 是负责内存配置的机制而 iomem 是存储配置后所有内存存储的明细信息 , 如果再配合前面所提到的 ioports , 将会更加详细的描述的内存状况 .

/proc/partitions

实时提供目前系统的分区 .

/proc/[number]/

这些目录代表所有目前正在系统中运行的所有程序 , 打开任意的目录发现所有的内容都是一样的 , 因为没个程序该有哪些文件都已经被 procfs 定义好了 , 不可以随意更改 .

# pwd
/proc/1
# l
attr/    cpuset   exe@  loginuid  mounts      oom_score  smaps  status
auxv     cwd@     fd/   maps      mountstats  root@      stat   task/
cmdline  environ  io    mem       oom_adj     schedstat  statm  wchan

以 1/ 为例 , 因为这是 init 的进程 .

cmdline : 该程序所使用的完整的命令
cwd : 该程序所使用的目录 , 是个链接文件
maps , smaps : 该程序所在的内存地址段 , 后者更详细
stat , statm : 该程序的状态
status : 比上面的 stat 更详细的清单

更详细的可以 # man proc 查看每个字段的含义 .

/proc/acpi/

ACPI ( Advanced Configuration and Power Interface ) 下面存放的是一些省电技术的文件 , 如 CPU 的省电支持程度 , 可被唤醒 ( wake up ) 的接口等 .

/proc/bus/

系统上总线信息包括输入设备 , PCI 接口 , PCMCIA 扩展卡及 USB 都在其中 .

/proc/driver/

该目录下有一些零星的 driver 文件 , 也就是说并不是每一种硬件的 driver 都在该目录中 .

/proc/fs/

空目录 .

/proc/irq/

每一个子目录的名字就是 IRQ 的编号 , 其实可以不用看该目录的 , 直接读取 /proc/interrupts 文件即可 , 简洁清楚 , 不像该目录读取不方便 .

/proc/net/

该目录是一些网络相关的虚拟文件 , 均为 ACCII 文件 , 可以使用 cat 直接读取 . 下面列举几个重要的文件 .

arp : 就是使用 # arp 命令所看的结果 .
dev : # ifconfig 的信息来源 , 也就是各个网络接口的信息 .
ip_tables_names : iptables 支持的规则表
ip_tables_matches : iptables 支持的过滤模式
ip_tables_targets : iptables 支持的规则目标
sockstat : 系统 scoket 的状态 , 最基本的信息就是 TCP , UDP 有多少个 scoket 在使用中
tcp , udp : 使用 netstat 分别查看 tcp , udp 的结果

/proc/scsi/

系统上 SCSI 设备信息 , 让然从 IDE 以后的 SATA , USB 都会放在此目录中 .

/proc/sys/

该目录下放置的是一些系统内核所需的变量 , 可以通过 /etc/sysctl.conf 文件来做永久修改 .

dev/

存放的是一些硬件的信息 , 只有少部分的被放置在该目录中 .

fs/

一些和文件系统相关的文件 , 如文件数目 , inode 数目 , quota 限制等 . 现列举几个重要的文件 :

file-max : 定义了系统中所有用户的进程可使用的文件数 , 当服务开得越多时 , 所需要的文件就越多 , 可能出现开启的文件数量大于该文件定义的值 , 造成系统问题 .

$ whoami
jaseywang
现在在另一个 terminal 上
# echo 10 > /proc/sys/fs/file-max
$ ll
-bash: start_pipeline: pgrp pipe: Too many open files in system
-bash: /bin/ls: Too many open files in system

file-nr : 三个值分贝代表已被分配处理的文件数量 , 未被分配的数量 , 可被分配的最大值 (和 file-max 一样 , 更改 file-max , 该值同样会该改变 ) .
inode-nr : 该文件都两列组成 , 第一列代表已分配的 inodes 数量 , 第二列代表可使用的 inodes 数量 .
inode-state : 派生出 inode-nr .
overflowgid , overflowuid : 用户和用户组的数量限制就是这两个文件定义的 .

kernel/

ctrl-alt-del : 一般在使用 Ctrl+Alt+Del 时并不会直接重启 , 而是执行正常的重启启动程序 , 也就是先慢慢地将所有的进程关闭再开机 . 如果将该文件由默认的 0 该为 1 , 则是快速重启 , 就是不保留任何文件 , 不走正常的关机程序 .
domainname : 同命令 domainname .

# domainname

# echo blog.jaseywang.info > domainname
# domainname
blog.jaseywang.info

hostname : 同 hostname 这个命令 .

# hostname
jaseywang.info
# echo blog.jaseywang.info > hostname
# hostname
blog.jaseywang.info

osrelease : 同 $ uname -r 这个命令 , 显示内核的版本 .
ostype : 显示目前操作系统的文件 .
pidmax : 其内容代表一个系统可使用的最大的 pid 数 .
pty/max , pty/nr : 在 pty/ 目录下 , 这两个文件和 /dev/ptmx , /dev/pts/ 有关的文件 , 就是 max 和 nr . 一个联机需要一个 ptmx 产生出来的 pts , 因此 , max 代表系统可接受的最大联机数 ; nr 的值代表 pts/ 的使用数量 , 也就是目前系统所有的 terminal 的数量 . nr 的值显然不能超过 max 的值 .
threads-max : 该文件定义了系统可以同时使用多少线程 ( threads) .

# cat threads-max
12286
# echo 10 > threads-max
# ls
-bash: fork: Resource temporarily unavailable

version : 和前面的 ostype , osrelease 属于同类型 , 可以通过 $ uname -a 得到同样的结果 , 最前面的 # num 代表 kernel 已经被编译了多少次了 , SMP 代表 kernel 的类型 .

net/

该目录存放了大量的 TCP/IP 协议的参数资源 , 目前大部分使用的 IPv4 , 所以比较重要的是 ipv4/ 这个目录了. 很多的参数都是以模块的形式存在的 , 所以要使用的话要先加载相应的模块 . 比如 bonding 机制 ( 将多个网络接口合并的功能 ) , 如果要使用 , 要先加载如下的模块 :

# l
default/  eth0/  lo/
# modprobe bonding
# l
bond0/  default/  eth0/  lo/

bridge/

该目录下的文件主要是做桥接下的 firewall 角色 , 0 代表关闭而 1 代表打开 .
bridge-nf-call-arptables : 是否要将 ARP 的数据包桥接到 arptables 的 FORWARD 链 .
bridge-nf-call-iptables : 是否要将 IPv4 的数据包桥接到 iptables 的链接 .
之前做 KVM 桥接时 , 曾经遇到一个奇怪的现象 , 详细的请猛击我之前的这篇博客 .

core/

用来存放 TCP/IP 的核心参数 , 详细的解释请点击这里 .

ipv4/

这里存放的是 IPv4 的相关文件 , 比如开启转发机制的 ip_forawrd 文件等等 . 详细的请点击这里 , 这里 .

ipv6/

IPv6 协议相关的文件 , 详细的请参考这里 , 这里 .

netfilter/

netfilter 是一种针对数据包过滤的机制 , 最常用的就是 iptables 了 , 其他的比较少见还有 Qos 机制的 tc 命令也是其中的一种 .

token-ring/

目前只有一个文件 rif_timeout , 在该网络中 , RIF 使用来储存 Routing 的信息 .

unix/

该目录下也只有一个文件 max_dgram_qlen , datagram 是 TCP/IP 在封装时 IP 曾数据包的名称 , 此文件是用来指定 Unix Domain Socket 的接受缓冲区可接受 datagram 的最大数量 .

sunrpc/

该目录主要是将所有的 SUN NFS (Network File System) 以及 SUN RPC (Remote Procedure Call) 两种协议的相关参数放在其中 . 大部分文件都跟程序开发人员相关 . 了解更详细的内容请点击这里 .

vm/

此目录包含的文件类型有内存 , 缓冲文件和缓存的管理文件 , 通过这些文件可以实时地针对这些存储方式做微调 , 其中的大部分文件都和一般使用的 Swap 有很大的关系 .

drop_caches : 此文件主要将内存中的 caches , dentries , inodes 清除 , 里面的值可设为 1 , 2 或者3 .
1 是将 pagecache 清空 , pagecache 是实际在使用的文件的内容 , 正常清空下 , pagecache 应该会比其他两个占较大的空间 .
2 是将 dentries 及 inodes 清空 , dentry 是文件名转变为 inode 时的操作 , 而 inode 则是文件在系统中的实体代号 , 有点像用户和 UID 的对应关系 .
3 是将 pagecache , dentries , inodes 全部清空 .

下面我们做一个实验 :
先清空所有

# echo 3 > drop_caches
可以看到 buffers , cached 都降低了.
# find /
# free  -m
发现 buffers 正在逐渐变大而 cached 基本不变
再清空
# echo 3 > drop_caches  
打开一个比较大的文件或者
# dd if=/dev/zero of=~/test bs=100M count=10
我们可以发现此时 buffers 几乎不变而 cached 一下子彪升了上去 .
上述现象是因为 buffer 是记录文件的 metadata (也就是一些目录的清单 , 权限等文件属性) 而 cache 则是文件的实际内容 , 也就是我们在编辑文件时的内容 .

overcommit_memory : 该文件决定虚拟内存的监督模式 .
overcommit_ratio : 该文件用来调整上一个文件所参考的公式 , 其中的值会直接影响系统虚拟内存的使用总量 .

更详细的解释请点击这里 .

/proc/sysvipc/

该目录下都是 System V (就是 SUN Solaris 和 SCO UnixWare 的起源) 的IPC (InterProcess Communication) 所需的对象 . IPC 的意思是系统内部各 process 间的信息交流 . 详细资料请猛击这里 .

/proc/tty/

tty 这个名字出自 Teletype 这个公司 , 史上第一个终端设备就是由这家产生的 , 也就是因为当初这家公司将其设备文件放在 /dev/ 下, 因此现在所有的终端设备文件都在 /dev/ 下并以 tty 为命名规则 , 像 tty0 ,tty1 , ttyS0 等 , /proc/tty/ 目录则是存放目前正在使用的 tty 信息的目录 .

CentOS 官网有一份介绍 /proc/ 的 doc , 有兴趣的可以点击这里 .

参考自 : 邱世华 Linux 系统架构与目录解析

  • adam

    proc其实可以用来debug。
    ibm dw上就有篇文章讲如何用proc来判断程序是否内存溢出以及jionable thread是否被jion了

    • http://jaseywang.info jaseywang

      好装比啊…完全看不懂…