/proc
文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux® 内核空间和用户空间之间进行通信。/proc 文件系统是一种内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。在/proc
文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件不同的是,这些虚拟文件的内容都是动态创建的。本文对
/proc 虚拟文件系统进行了介绍,并展示了它的用法。
最初开发/proc文件系统是为了提供有关系统中进程的信息。但是由于这个文件系统非常有用,因此内核中的很多元素也开始使用它来报告信息,或启用动态运行时配置。
/proc 文件系统包含了一些目录(用作组织信息的方式)和虚拟文件。虚拟文件可以向用户呈现内核中的一些信息,也可以用作一种从用户空间向内核发送信息的手段。实际上我们并不会同时需要实现这两点,但是本文将向您展示如何配置这个文件系统进行输入和输出。
尽
管像本文这样短小的一篇文章无法详细介绍 /proc 的所有用法,但是它依然对这两种用法进行了展示,从而可以让我们体会一下 /proc
是多么强大。清单 1 是对 /proc 中部分元素进行一次交互查询的结果。它显示的是 /proc
文件系统的根目录中的内容。注意,在左边是一系列数字编号的文件。每个实际上都是一个目录,表示系统中的一个进程。由于在 GNU/Linux
中创建的第一个进程是 init
进程,因此它的 process-id
为 1。然后对这个目录执行一个 ls
命令,这会显示很多文件。每个文件都提供了有关这个特殊进程的详细信息。例如,要查看 init
的 command-line 项的内容,只需对 cmdline
文件执行 cat
命令。
/proc 中另外一些有趣的文件有:cpuinfo
,它标识了处理器的类型和速度;pci
,显示在 PCI 总线上找到的设备;modules
,标识了当前加载到内核中的模块。
0[root@debian-ykj:yk]# ls /proc
1 1827 1974 2124 2231 2366 760 fs self
102 1828 1975 2125 2235 24 761 ide slabinfo
1177 1834 1976 2126 2237 2890 774 interrupts stat
1181 1843 1977 2127 2239 2951 831 iomem swaps
121 1850 1981 2128 2242 3 8797 ioports sys
122 1853 1991 2145 2245 337 acpi irq sysrq-trigger
123 1856 1998 2190 2247 4 asound kallsyms sysvipc
124 1860 2 2192 2249 452 buddyinfo kcore timer_list
14440 1876 2000 2195 2252 4920 bus key-users tty
1527 1883 2009 2196 2257 4923 cmdline kmsg uptime
15338 1890 2015 2199 2273 4925 cpuinfo loadavg version
1686 1938 2048 2203 2275 4927 crypto locks vmstat
1692 1967 2052 2204 2277 4957 devices meminfo zoneinfo
17472 1968 2057 2206 2279 5 diskstats misc
17475 1969 2060 2208 2286 6 dma modules
17482 1970 2073 2210 2287 6625 driver mounts
1793 1971 2086 2212 23 6635 execdomains mtrr
1811 1972 2093 2218 2308 7080 fb net
1819 1973 2123 2229 2328 7147 filesystems partitions
0[root@debian-ykj:yk]# ls /proc/1
attr cpuset exe mem oom_adj smaps status
auxv cwd fd mounts oom_score stat task
cmdline environ maps mountstats root statm wchan
0[root@debian-ykj:yk]# cat /proc/1/cmdline
init [2]0
[root@debian-ykj:yk]#
|
如果你察看文件 /proc/mounts (和 mount 命令一样列出所有已经加载的文件系统),你会看到其中 一行是这样的:
0[root@debian-ykj:yk]# grep proc /proc/mounts proc /proc proc rw,nosuid,nodev,noexec 0 0
|
/proc 由内核控制,没有承载 /proc 的设备。因为 /proc 主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。对 /proc 进行一次 'ls -l' 可以看到大部分文件都是 0 字节大的;不过察看这些文件的时候,确实可以看到一些信息。这怎么可能?这是因为 /proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层 (VFS) 了。然而,直到当 VFS 调用它,请求文件、目录的 i-node 的时候,/proc 文件系统才根据内核中的信息建立相应的文件和目录。
加载 proc 文件系统
如果系统中还没有加载 proc 文件系统,可以通过如下命令加载 proc 文件系统:
上述命令将成功加载你的 proc 文件系统。
察看 /proc 的文件
/proc 的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进程的状态等信息。大部分 /proc 中的文件和目录提供系统物理环境最新的信息。尽管 /proc 中的文件是虚拟的,但它们仍可以使用任何文件编辑器或像'more', 'less'或 'cat'这样的程序来查看。当编辑程序试图打开一个虚拟文件时,这个文件就通过内核中的信息被凭空地 (on the fly) 创建了。这是一些我从我的系统中得到的一些有趣结果:
0[root@debian-ykj:yk]# ls -l /proc/cpuinfo
-r--r--r-- 1 root root 0 2007-11-14 16:56 /proc/cpuinfo
0[root@debian-ykj:yk]# file /proc/cpuinfo
/proc/cpuinfo: empty
0[root@debian-ykj:yk]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 1
model name : Intel(R) Pentium(R) 4 CPU 1.70GHz
stepping : 2
cpu MHz : 1716.999
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm up
bogomips : 3437.43
clflush size : 64
|
上述大部分的信息十分清楚地给出了这个系统的有用的硬件信息。有些 /proc 的文件是经过编码的,不同的工具可以被用来解释这些编码过的信息并输出成可读的形式。这样的工具包括:'top', 'ps', 'apm' 等。
proc 文件系统可以被用于收集有用的关于系统和运行中的内核的信息。下面是一些重要的文件:
* /proc/cpuinfo - CPU 的信息 (型号, 家族, 缓存大小等)
* /proc/meminfo - 物理内存、交换空间等的信息
* /proc/mounts - 已加载的文件系统的列表
* /proc/devices - 可用设备的列表
* /proc/filesystems - 被支持的文件系统
* /proc/modules - 已加载的模块
* /proc/version - 内核版本
* /proc/cmdline - 系统启动时输入的内核命令行参数
该目录下还包括有许多目录,其相关的内容如下所示:
*数字1到X -- 各个以数字为名称的文件夹,代表的是运行进程的PID。例如,目录1记录了init进程
的一些统计信息。
*acpiapci- 是一个现代桌面和笔记本电脑的电源配置和管理接口,因为apci主要是一个个
人电脑的技术,所以在一些服务器系统上经常被禁用。可以访问下面链接获得
更多acpi的相关信息
*bus---- 这个子目录记录了系统的总线子系统的信息,例如pci总线或者usb接口。
*irq---- irq子目录下记录了系统的中断信息。
*net---- net子目录记录了一些关于你的网卡的重要信息,比如接收的多点广播封包或者
每个网卡的路由。
*scsi--- scsi子目录包含了关于系统的scsi子系统的信息,例如连接的设备或者驱动的
版本。ips子目录是记录关于IBM ServerRAID阵列卡信息的。
*sys---- sys目录下包含了一些可以调整的内核参数。
*tty---- tty子目录包含了系统虚拟终端的信息
proc 中的文件远不止上面列出的这么多。想要进一步了解的读者可以对 /proc 的每一个文件都'more'一下或读参考文献[1]获取更多的有关 /proc 目录中的文件的信息。我建议使用'more'而不是'cat',除非你知道这个文件很小,因为有些文件 (比如 kcore) 可能会非常长。
有关运行中的进程的信息
/proc 文件系统可以用于获取运行中的进程的信息。在 /proc 中有一些编号的子目录。每个编号的目录对应一个进程 id (PID)。这样,每一个运行中的进程 /proc 中都有一个用它的 PID 命名的目录。这些子目录中包含可以提供有关进程的状态和环境的重要细节信息的文件。让我们试着查找一个运行中的进程。
0[root@debian-ykj:yk]# ps -aef |grep firefox|grep -v grep
yk 6625 1 3 09:52 ? 00:16:48 /usr/lib/iceweasel/firefox-bin -a firefox
0[root@debian-ykj:yk]# ls -l /proc/6625
总计 0
dr-xr-xr-x 2 yk yk 0 2007-11-14 16:59 attr
-r-------- 1 yk yk 0 2007-11-14 16:59 auxv
-r--r--r-- 1 yk yk 0 2007-11-14 16:59 cmdline
-r--r--r-- 1 yk yk 0 2007-11-14 16:59 cpuset
lrwxrwxrwx 1 yk yk 0 2007-11-14 16:59 cwd -> /home/yk
-r-------- 1 yk yk 0 2007-11-14 16:59 environ
lrwxrwxrwx 1 yk yk 0 2007-11-14 16:59 exe -> /usr/lib/iceweasel/firefox-bin
dr-x------ 2 yk yk 0 2007-11-14 16:59 fd
-r--r--r-- 1 yk yk 0 2007-11-14 16:59 maps
-rw------- 1 yk yk 0 2007-11-14 16:59 mem
-r--r--r-- 1 yk yk 0 2007-11-14 16:59 mounts
-r-------- 1 yk yk 0 2007-11-14 16:59 mountstats
-rw-r--r-- 1 yk yk 0 2007-11-14 16:59 oom_adj
-r--r--r-- 1 yk yk 0 2007-11-14 16:59 oom_score
lrwxrwxrwx 1 yk yk 0 2007-11-14 16:59 root -> /
-r--r--r-- 1 yk yk 0 2007-11-14 16:59 smaps
-r--r--r-- 1 yk yk 0 2007-11-14 16:59 stat
-r--r--r-- 1 yk yk 0 2007-11-14 16:59 statm
-r--r--r-- 1 yk yk 0 2007-11-14 16:59 status
dr-xr-xr-x 10 yk yk 0 2007-11-14 16:59 task
-r--r--r-- 1 yk yk 0 2007-11-14 16:59 wchan
|
文件 "cmdline" 包含启动进程时调用的命令行。"envir" 进程的环境变两。 "status" 是进程的状态信息,包括启动进程的用户的用户ID (UID) 和组ID(GID) ,父进程ID (PPID),还有进程当前的状态,比如"Sleelping"和"Running"。每个进程的目录都有几个符号链接,"cwd"是指向进程当前工作目录的符号链接,"exe"指向运行的进程的可执行程序,"root"指向被这个进程看作是根目录的目录 (通常是"/")。目录"fd"包含指向进程使用的文件描述符的链接。 "cpu"仅在运行 SMP 内核时出现,里面是按 CPU 划分的进程时间。
/proc/self 是一个有趣的子目录,它使得程序可以方便地使用 /proc 查找本进程地信息。/proc/self 是一个链接到 /proc 中访问 /proc 的进程所对应的 PID 的目录的符号链接。
通过 /proc 与内核交互
上面讨论的大部分 /proc 的文件是只读的。而实际上 /proc 文件系统通过 /proc 中可读写的文件提供了对内核的交互机制。写这些文件可以改变内核的状态,因而要慎重改动这些文件。/proc/sys 目录存放所有可读写的文件的目录,可以被用于改变内核行为。
/proc/sys/kernel - 这个目录包含反通用内核行为的信息。 /proc/sys/kernel/{domainname, hostname} 存放着机器/网络的域名和主机名。这些文件可以用于修改这些名字。
0[root@debian-ykj:yk]# hostname
debian-ykj
0[root@debian-ykj:yk]# cat /proc/sys/kernel/hostname
debian-ykj
0[root@debian-ykj:yk]# echo "new-hostname" > /proc/sys/kernel/hostname
0[root@debian-ykj:yk]# hostname
new-hostname
|
这样,通过修改 /proc 文件系统中的文件,我们可以修改主机名。很多其他可配置的文件存在于 /proc/sys/kernel/。这里不可能列出所有这些文件,读者可以自己去这个目录查看以得到更多细节信息。
另一个可配置的目录是 /proc/sys/net。这个目录中的文件可以用于修改机器/网络的网络属性。
结论
/proc 文件系统提供了一个基于文件的 Linux 内部接口。它可以用于确定系统的各种不同设备和进程的状态。对他们进行配置。因而,理解和应用有关这个文件系统的知识是理解你的 Linux 系统的关键。
阅读(952) | 评论(1) | 转发(0) |