Linux Proc文件系统详解
Proc文件系统是一个伪文件系统,做为一个特殊接口来访问内核,常常挂载在/proc下,里面的大多数文件时只读的,但是我们仍然可以设置其中一些变量来改变内核设置。
通过Man5 proc 来进行查阅proc文件系统的详细信息。
我们可以用cat more grep等linux命令来进行查看proc文件系统的内容
I)进程相关
系统任何时刻正在运行的用户进程在/proc下都有自己的一个目录,目录的名称就是进程号的十进制表示。如/proc/1
/proc/self是链接到正在访问proc目录的那个进程的符号链接。
每个进程进程号目录下有以下的文件:
cmdline文件:进程的命令行,包括程序的名称和所有的参数,僵死进程或者被交换出去的进程可能没有任何内容。如cat ./self/cmdline
cwd目录:进程当前工作目录的符号链接
exe文件:指向当前进程运行的二进制可执行程序的符号链接,可以直接运行它
environ文件:记录了进程的环境信息,单个的环境字符串之间由空字节分隔,以文件结束标志作为环境结束的标志
fd目录:为每个打开得文件描述符提供一个入口,它是到实际文件的索引节点的符号链接。每个索引节点包含节点所在的设备信息、加锁信息、文件的模式和类型、到该文件的链接、文件所有者和所有组ID、文件字节数等。
maps文件:
address perms offset dev inode pathname
10000000-1064b000 r-xp 00000000 01:00 13 /ramdisk/kdvmt.linux (deleted)
1065b000-106c6000 rwxp 0064b000 01:00 13 /ramdisk/kdvmt.linux (deleted)
106c6000-1108d000 rwxp 106c6000 00:00 0
30000000-30120000 rw-p 30000000 00:00 0
30120000-30121000 rw-s 22000000 1f:09 8 /usr/dev/hpi2
30121000-30122000 rw-s 21000000 1f:09 7 /usr/dev/hpi1
30122000-30123000 rw-s 20000000 1f:09 6 /usr/dev/hpi0
30123000-30c83000 rw-p 30123000 00:00 0
r = read
w = write
x = execute
s = shared
p = private (copy on write)
offset是文件的偏移量, dev 是设备号(主设备号:从设备号), 而 inode 则是设备的节点号. 0 表明没有节点与内存相对应, 就象 bss 的情形.
root文件:root目录的符号链接,可以由chroot系统调用改变
stat文件:包含了通常由PS显示的有关某个进程的大多数信息。
pid %d
进程标识.
comm %s
可执行文件的文件名, 包括路径. 该文件是否可见取决于该文件是否已被交换出内存.
state %c
";RSDZT"; 中的一个, R 是正在运行, S 是在可中断的就绪态中睡眠, D 是在不可中断的等待或交换态中睡眠, Z 是僵死, T 是被跟踪或被停止(由于收到信号).
ppid %d
父进程 PID.
pgrp %d
进程的进程组 ID.
session %d
进程的会话 ID.
tty %d
进程所使用终端.
tpgid %d
当前拥有该进程所连接终端的进程所在的进程组 ID.
flags %u
进程标志,依赖内核版本
minflt %u
进程所导致的小错误(minor faults)数目, 这样的小错误(minorfaults)不需要从磁盘重新载入一个内存页.
cminflt %u
进程及其子进程所导致的小错误(minor faults)数目.
majflt %u
进程所导致的大错误(major faults)数目, 这样的大错误(majorfaults)需要重新载入内存页.
cmajflt %u
进程及其子进程所导致的大错误(major faults)数目.
utime %d
用户时间——进程被调度进用户态的时间(以 jiffy 为单位).
stime %d
系统时间——进程被调度进内核态的时间, 以 jiffy 为单位.
cutime %d
累计用户时间——进程及其子进程被调度进用户态的时间, 以 jiffy 为单位.
cstime %d
累计系统时间——进程及其子进程被调度进内核态的时间, 以 jiffy 为单位.
priority %d
标准优先数只再加上 15, 在内核里该值总是正的.
nice %ld
nice值
itrealvalue%u
下一个SIGALARM信号到来的延时,以 jiffy 为单位.
starttime %d
进程自系统启动以来的时间, 以 jiffy 为单位.
vsize %u
虚拟内存大小.
rss %u
Resident Set Size(驻留大小): 进程所占用的真实内存大小, 以页为单位, 为便于管理而减去了 3. rss 只包括代码段, 数据
以及堆栈的空间, 但不包括尚未要求装入内存的或已被交换出去的.
rlim %u
当前进程的 rss 限制, 以字节为单位, 通常为 2,147,483,647.
startcode %u
代码段部分地址下限.
endcode %u
代码段部分地址上限.
startstack %u
堆栈开始地址.
kstkesp %u
esp(32 位堆栈指针) 的当前值, 与在进程的内核堆栈页得到的一致.
kstkeip %u
EIP(32 位指令指针)的当前值.
signal %d
待处理信号的 bitmap(通常为 0).
blocked %d
被阻塞信号的 bitmap(对 shell 通常是 0, 2).
sigignore %d
被忽略信号的 bitmap.
sigcatch %d
被俘获信号的 bitmap.
wchan %u
进程睡眠的内核函数名
nswap %lu
交换出去的页数
cnswap %lu
累计交换出去的页数
exit_signal %d
退出时发送的信号名
processor %d
SMP处理器中最后执行的CPU ID
status文件:进程状态,以更好的可读格式显示出来。
statm文件:进程对内存的使用情况。
size total program size
resident resident set size
share shared pages
text text (code)
lib library
data data/stack
dt dirty pages (unused in Linux 2.6)
task目录:多线程程序中,task目录里面包含每个线程号的子目录,目录下内容与进程号目录相同
II)其他系统信息
/proc
cmdline文件:内核的启动命令行,通过bootloader设置,grub或者u-boot等
cpuinfo文件:提供CPU的多种信息
devices文件:列出字符设备和快设备的主设备号,以及分配到这些设备号的设备名称
dma文件:驱动程序保留的DMA通道和保留它们的驱动程序名称
file systems文件:列出可以使用的文件类型
interrupts文件:列出系统注册过的中断
ioports文件:列出了诸如磁盘驱动器、声卡等设备的IO端口范围
kcore文件:系统的物理内存以core文件格式保存的文件
kmsg文件:检索printk生成的内核信息,同dmesg
ksysm文件:列出已经登记的内核符号,给出了变量或者函数的地址
loadavg文件:列出以几个不同的时间间隔计算的系统平均负载,前三个数字表示过去1分钟、5分钟、15分钟运行队列的平均负载,随
后正在运行任务数/活跃任务数,最后是上次使用CPU的进程号
1.061.06 0.95 6/85 214
locks文件:包含在打开的文件上的加锁信息,由/linux/fs/lock.c中的get_locks_status函数产生
mdstat文件:md设备驱动程序控制的RAID设备信息
meminfo文件:给出了内存状态的信息,显示出系统中空闲内存、已用物理内存和交换内存的总量,还显示出内核使用的共享内存和缓
冲区总量,free命令就是读取这个的
misc文件:报告内核函数misc_register函数登记的设备驱动程序
modues文件:给出可加载内核模块的信息,lsmod由此得出
mounts文件:挂载信息
rtc文件:硬件实时时钟的信息
stat文件:cput利用率、磁盘、内存页、内存对换、全部中断、接触开关以及上次自举时间(1970.1.1以来的秒数)
version文件:说明系统正在运行的内核版本
slabinfo文件:内核slab控制器使用情况
III)net目录
arp文件:arp表
dev文件:来自网络设备的统计,ifconfig命令就是解析它而来
dev_mcast:列出链路层多播组
igmp:加入的IGMP多播组
netlink:netlingk套接口信息
netstat:网络流量的多种统计
raw:原始套接口的套接口表
route:静态路由表
rpc:包含RPC信息的目录
rt_cache:路由缓冲
snmp:snmpagent的ip/icmp/tcp/udp协议统计,各行交替给出字段名和值
sockstat:列出使用tcp/udp/raw/pac/syn_cookies的数量
tcp:TCP连接的套接口表
udp:UDP连接的套接口表
unix:UNIX域套接口的套接口表
其他网卡驱动加入的相关信息
IV)其他繁多的目录
proc/scsi子目录:包含一个列出所有检测到的scsi设备的文件,并且为每个控制器驱动程序建立一个目录,这个目录下面又为每个驱动实例提供一个子目录
proc/sys目录:该目录下的文件基本都是内核中的一些变量,我们可以通过改变这些变量的值来改变内核的参数。该目录内容较多,且一般不常用,例子:
./fs/file-max:内核分配的文件句柄的最大数目
./fs/file-nr:已经分配的文件句柄数、已使用的句柄数、最大数
./kernel/osrelase:内核版本号
./kernel/rtsig-nr:当前队列中实时信号的数目
./kernel/shmall:共享内存的最大值
./core/rmem_default:套接口读缓冲的默认值
./core/wmem_default:套接口写缓冲的默认值
./net/ipv4/ip_forward:是否允许内部转发(net目录包含繁多的各种网络参数)