了解proc目录文件(设备管理)
/proc 文件系统是一种内核和内核模块用来向进程(process) 发送信息的机制 (所以叫做 /proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取有关进程的有用信息,在运行时访问内核内部数据结构、改变内核设置的机制。
/proc 由内核控制,没有承载 /proc 的设备,它只存在内存当中,而不占用外存空间,对 /proc 进行一次 'ls -l' 可以看到大部分文件都是 0 字节大的。
不过”cat /proc/partitions”这些文件的时候,确实可以看到一些信息,这怎么?
因为/proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层 (VFS) 。当用户或应用程序读取proc文件时(VFS 调用),比如,请求文件、目录的i-node 的,此时/proc 文件系统是动态根据内核中的信息读出所需信息来建立相应的文件和目录,所以我们才能得到“系统最新的物理环境、正在运行的进程状态等信息”。可以使用任何文件编辑器或像'more', 'less'或 'cat'这样的程序来查看。
下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。
另外,在/proc下还有三个很重要的目录:net,scsi和sys。
sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi 目录不存在。
一、常见的文件列表
/proc/partitions
这个文件给出分区信息。
示例:
[root@localhostproc]# cat partitions
majorminor #blocks name
8 0 76035645 sda
8 1 104391 sda1
8 2 5116702 sda2
8 3 20482875 sda3
8 4 1 sda4
8 5 20482843 sda5
8 6 10241406 sda6
8 7 10241406 sda7
8 8 2048256 sda8
8 9 2048256 sda9
8 10 497983 sda10
/proc/cmdline文件
这个文件给出了内核启动的命令行。它和用于进程的cmdline项非常相似。
示例:
[root@localhost proc]# cat cmdline
ro root=LABEL=/ rhgb quiet crashkernel=128M@16M
/proc/cpuinfo文件
这个文件提供了有关系统CPU的多种信息。这些信息是从内核里对CPU的测试代码中得到的。文件列出了CPU的普通型号(386,486,586,686等),以及能得到的更多特定信息(制造商,型号和版本)。文件还包含了以bogomips表示的处理器速度,而且如果检测到CPU的多种特性或者bug,文件还会包含相应的标志。
示例:
[root@localhost proc]# cat cpuinfo
/proc/devices文件
这个文件列出字符和块设备的主设备号,以及分配到这些设备号的设备名称。这块会重点说明,与目录/dev有联系,见下一篇。
示例:
[root@localhost proc]# cat /proc/devices
Character devices:
1mem
4/dev/vc/0
4tty
4ttyS
5/dev/tty
5/dev/console
5/dev/ptmx
6lp
7vcs
10misc
13input
14sound
21sg
29fb
116 alsa
128 ptm
136 pts
162 raw
180 usb
189 usb_device
216 rfcomm
254 pcmcia
Block devices:
1ramdisk
8sd
9md
22ide1
65sd
66sd
67sd
68sd
69sd
70sd
71sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp
/proc/dma文件
这个文件列出由驱动程序保留的DMA通道和保留它们的驱动程序名称。casade项用于把次DMA控制器从主控制器分出的DMA行所使用;
示例:
[root@localhostproc]# cat dma
4: cascade
/proc/filesystems文件
这个文件列出可供使用的文件系统类型,一种类型一行。虽然它们通常是编入内核的文件系统类型,但该文件还可以包含可加载的内核模块加入的其它文件系统类型。
示例:
[root@localhostproc]# cat filesystems
nodev sysfs
nodev rootfs
nodev bdev
nodev proc #没有承载的设备
nodev cpuset
nodev binfmt_misc
nodev debugfs
nodev securityfs
nodev sockfs
nodev usbfs
nodev pipefs
nodev anon_inodefs
nodev futexfs
nodev tmpfs
nodev inotifyfs
nodev eventpollfs
nodev devpts
ext2
nodev ramfs
nodev hugetlbfs
iso9660
nodev mqueue
nodev selinuxfs
ext3
nodev rpc_pipefs
nodev autofs
/proc/interrupts文件
这个文件的每一行都有一个保留的中断。每行中的域有:中断号,本行中断的发生次数,可能带有一个加号的域(SA_INTERRUPT标志设置),以及登记这个中断的驱动程序的名字。
可以在安装新硬件前,像查看/proc/dma和/proc/ioports一样用cat命令手工查看手头的这个文件。这几个文件列出了当前投入使用的资源(但是不包括那些没有加载驱动程序的硬件所使用的资源)。
示例:
[root@localhostproc]# cat interrupts
CPU0 CPU1
0: 210180596 0 IO-APIC-edge timer
1: 11 0 IO-APIC-edge i8042
8: 3 0 IO-APIC-edge rtc
9: 815 1712330 IO-APIC-level acpi
12: 125 0 IO-APIC-edge i8042
14: 63515 0 IO-APIC-edge ata_piix
15: 120 1885171 IO-APIC-edge ide1
169: 34 0 IO-APIC-level yenta,uhci_hcd:usb4
177: 2 0 IO-APIC-level ehci_hcd:usb1,uhci_hcd:usb2
185: 0 0 IO-APIC-level uhci_hcd:usb3
193: 0 0 IO-APIC-level uhci_hcd:usb5
201: 8 30243 IO-APIC-level eth0
225: 103 0 PCI-MSI hda_intel
NMI: 0 0
LOC: 210180504 210180483
ERR: 0
MIS: 0
/proc/ioports文件
这个文件列出了诸如磁盘驱动器,以太网卡和声卡设备等多种设备驱动程序登记的许多I/O端口范围。
示例:
[root@localhostproc]# cat ioports
/proc/kcore文件
这个文件是系统的物理内存以core文件格式保存的文件。例如,GDB能用它考察内核的数据结构。它不是纯文本,而是/proc目录下为数不多的几个二进制格式的项之一。
/proc/kmsg文件
这个文件用于检索用printk生成的内核消息。任何时刻只能有一个具有超级用户权限的进程可以读取这个文件。也可以用系统调用syslog检索这些消息。通常使用工具dmesg或守护进程klogd检索这些消息。
示例:
[root@localhost proc]# dmesg kmsg
/proc/ksyms文件
这个文件列出了已经登记的内核符号;这些符号给出了变量或函数的地址。每行给出一个符号的地址,符号名称以及登记这个符号的模块。程序ksyms,insmod和kmod使用这个文件。它还列出了正在运行的任务数,总任务数和最后分配的PID。
/proc/loadavg文件
这个文件给出以几个不同的时间间隔计算的系统平均负载,这就如同uptime命令显示的结果那样。前三个数字是平均负载。这是通过计算过去1分钟,5分钟,15分钟里运行队列中的平均任务数得到的。随后是正在运行的任务数和总任务数。最后是上次使用的进程号。
示例:
[root@localhostproc]# cat loadavg
0.000.00 0.00 1/122 13800
proc/locks文件
这个文件包含在打开的文件上的加锁信息。文件中的每一行描述了特定文件和文档上的加锁信息以及对文件施加的锁的类型。内核也可以需要时对文件施加强制性锁。
示例:
[root@localhost proc]# cat locks
proc/mdstat文件
这个文件包含了由md设备驱动程序控制的RAID设备信息。
示例:
[root@localhostproc]# cat mdstat
Personalities:
unuseddevices: <none>
/proc/meminfo文件
这个文件给出了内存状态的信息。它显示出系统中空闲内存,已用物理内存和交换内存的总量。它还显示出内核使用的共享内存和缓冲区总量。这些信息的格式和free命令显示的结果类似。
示例:
[root@localhostproc]# cat meminfo
/proc/misc文件
这个文件报告用内核函数misc_register登记的设备驱动程序。
示例:
[root@localhostproc]# cat misc
62 autofs
63 device-mapper
175agpgart
144nvram
228hpet
135rtc
231snapshot
proc/modules文件
这个文件给出可加载内核模块的信息。lsmod程序用这些信息显示有关模块的名称,大小,使用数目方面的信息。
示例:
[root@localhostproc]# cat modules
/proc/mounts文件
这个文件以/etc/mtab文件的格式给出当前系统所安装的文件系统信息。这个文件也能反映出任何手工安装从而在/etc/mtab文件中没有包含的文件系统。
示例:
[root@localhostproc]# cat mounts
rootfs/ rootfs rw 0 0
/dev/root/ ext3 rw,data=ordered 0 0
/dev/dev tmpfs rw 0 0
/proc/proc proc rw 0 0
/sys/sys sysfs rw 0 0
none/selinux selinuxfs rw 0 0
/proc/bus/usb/proc/bus/usb usbfs rw 0 0
devpts /dev/pts devpts rw 0 0
/dev/sda9/tmp ext3 rw,data=ordered 0 0
/dev/sda7/home ext3 rw,data=ordered 0 0
/dev/sda5/usr ext3 rw,data=ordered 0 0
/dev/sda6/usr/local ext3 rw,data=ordered 0 0
/dev/sda3/var ext3 rw,data=ordered 0 0
/dev/sda1/boot ext3 rw,data=ordered 0 0
tmpfs/dev/shm tmpfs rw 0 0
none/proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
sunrpc/var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
/etc/auto.misc/misc autofs rw,fd=7,pgrp=2984,timeout=300,minproto=5,maxproto=5,indirect 0 0
-hosts/net autofs rw,fd=13,pgrp=2984,timeout=300,minproto=5,maxproto=5,indirect 0 0
proc/pci文件
这个文件给出PCI设备的信息。用它可以方便地诊断PCI问题。你可以从这个文件中检索到的信息包括诸如IDE接口或USB控制器这样的设备,总线,设备和功能编号,设备延迟以及IRQ编号。
示例:
[root@localhostproc]# cat pci
proc/stat文件
这个文件包含的信息有CPU利用率,磁盘,内存页,内存对换,全部中断,接触开关以及赏赐自举时间(自1970年1月1日起的秒数)。
示例:
[root@localhostproc]# cat stat
/proc/uptime文件
这个文件给出自从上次系统自举以来的秒数,以及其中有多少秒处于空闲。这主要供uptime程序使用。比较这两个数字能够告诉你长期来看CPU周期浪费的比例。系统已经运行了多久。
示例:
[root@localhostproc]# cat uptime
212918.01212823.23
/proc/version文件
这个文件只有一行内容,说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息。
示例:
[root@localhostproc]# cat version
Linuxversion 2.6.18-238.el5 (mockbuild@ls20-bc2-13.build.redhat.com) (gcc version4.1.2 20080704 (Red Hat 4.1.2-50)) #1 SMP Sun Dec 19 14:24:47 EST 2010
proc/net子目录
此目录下的文件描述或修改了联网代码的行为。可以通过使用arp,netstat,route和ipfwadm命令设置或查询这些特殊文件中的许多文件。
示例:
[root@localhostproc]# ls net
[root@localhostproc]# ls net | sort
以下介绍此目录下常用的文件功能:
arp #转储每个网络接口的arp表中dev包的统计
dev #来自网络设备的统计
dev_mcast #列出二层(数据链路层)多播组
igmp #加入的IGMP多播组
netlink #netlink套接口的信息
netstat #网络流量的多种统计。第一行是信息头,带有每个变量的名称。接下来的一行保存相应变量的值
raw #原始套接口的套接口表
route #静态路由表
rpc #包含RPC信息的目录
rt_cache #路由缓冲
snmp #snmp agent的ip/icmp/tcp/udp协议统计;各行交替给出字段名和值
sockstat #列出使用的tcp/udp/raw/pac/syc_cookies的数量
tcp #TCP连接的套接口
udp #UDP连接的套接口表
unix #UNIX域套接口的套接口表
示例:
[root@localhostproc]# cat ./net/route
IfaceDestination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT
eth0 0001A8C0 00000000 0001 0 0 0 00FFFFFF0 0 0
eth0 0000FEA9 00000000 0001 0 0 0 0000FFFF0 0 0
eth0 00000000 0101A8C0 0003 0 0 0 000000000 0 0
/proc/scsi子目录
此目录下包含一个列出了所有检测到的SCSI设备的文件,并且为每种控制器驱动程序提供一个目录,在这个目录下又为已安装的此种控制器的每个实例提供一个子目录。
二、有关运行中的进程的信息
/proc文件系统可以用于获取运行中的进程的信息。
/proc中有一些编号的子目录,每个编号的目录对应一个进程 id (PID)。这样每一个运行中的进程 /proc 中都有一个用它的 PID 命名的目录。这些子目录中包含可以提供有关进程的状态和环境的重要细节信息的文件。
/proc目录中进程N的信息
/proc/N pid为N的进程信息
/proc/N/cmdline 进程启动命令
/proc/N/cwd 链接到进程当前工作目录
/proc/N/environ 进程环境变量列表
/proc/N/exe 链接到进程的执行命令文件
/proc/N/fd 包含进程相关的所有的文件描述符
/proc/N/maps 与进程相关的内存映射信息
/proc/N/mem 指代进程持有的内存,不可读
/proc/N/root 链接到进程的根目录
/proc/N/stat 进程的状态
/proc/N/statm 进程使用的内存的状态
/proc/N/status 进程状态信息,比stat/statm更具可读性
/proc/self 链接到当前正在运行的进程
三、有关与内核交互
上面讨论的大部分 /proc 的文件是只读的。而实际上 /proc 文件系统通过 /proc 中可读写的文件提供了对内核的交互机制。写这些文件可以改变内核的状态,因而要慎重改动这些文件。
/proc/sys目录存放所有可读写的文件的目录:
/proc/sys/kernel/ #可以用于改变内核行为;
/proc/sys/net #用可以于修改机器/网络的属性。
/proc/sys子目录
在此目录下有许多子目录。此目录中的许多项都可以用来调整系统的性能。这个目录包含信息太多,无法介绍全部。只在示例中展示目录下的一些文件。
示例:
[root@localhostproc]# ls sys
crypto debug dev fs kernel net sunrpc vm
示例:
[root@localhostproc]# ls ./sys/net
core ipv4 token-ring unix
/proc/sys/fs/file-max
这个文件指定了可以分配的文件句柄的最大数目。如果用户得到的错误消息声明由于打开文件数已经达到了最大值,从而他们不能打开更多文件,则可能需要增加该值。可将这个值设置成有任意多个文件,并且能通过将一个新数字值写入该文件来更改该值。
改变内核的参数,用vi编辑或echo参数重定向到文件中。
示例:
[root@localhostproc]# cat sys/fs/file-max
185252
[root@localhostproc]# echo 185253 > sys/fs/file-max
[root@localhostproc]# cat sys/fs/file-max
185253
/proc/sys/kernel/hostname
这个文件指定计算机名称,我们可以修改试试看。
示例:
[root@localhost~]# hostname
localhost
[root@localhost~]# echo "0xfffff" > /proc/sys/kernel/hostname
[root@localhost~]# hostname
0xfffff
/proc/sys/net/ipv4/icmp_echo_ignore_all
这个文件与主机响应网络icmp回应有关。简单修改这个文件,可以在网络上隐藏计算机。
示例:
##不响应 icmp_echo。主机将不会响应其他主机发出的 ping 查询,如下:
[root@localhost ~]# $ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
##恢复默认设置
[root@localhost ~]# $ echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
四、与/proc目录有关的命令(抛砖引玉)
free
显示内存信息
uptime
显示信息依次为:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载
示例:
[root@localhost~]# uptime
10:31:00 up 2 days, 21:38, 1 user, load average: 0.00, 0.00, 0.00
Uname -a
显示信息依次是:内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称
示例:
[root@localhost~]# uname -a
Linux0xfffff 2.6.18-238.el5 #1 SMP Sun Dec 19 14:24:47 EST 2010 i686 i686 i386GNU/Linux
top
显示系统当前的进程和其他状况
ps
主要用于监控后台进程的工作情况
vmstat
对内存使用监视
swapon -s
显示交换分区信息
sysctl -a
显示所有的系统参数
一般日常使用的,均需重点了解,如下:
/proc/cpuinfo #CPU的信息 (型号, 家族, 缓存大小等)
/proc/meminfo #物理内存、交换空间等的信息
/proc/mounts #已加载的文件系统的列表
/proc/devices #可用设备的列表
/proc/filesystems #被支持的文件系统
/proc/modules #已加载的模块
/proc/version #内核版本
/proc/cmdline #系统启动时输入的内核命令行参数