/proc 文件系统是一种内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。 与其他文件系统不同,/proc 存在于内存之中而不是硬盘上。如果你察看文件 /proc/mounts (和 mount 命令一样列出所有已经加载的文件系统),你会看到其中 一行是这样的:
$ grep proc /proc/mounts
/proc /proc proc rw 0 0
/proc 由内核控制,没有承载/proc 的设备。因为 /proc 主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。对 /proc 进行一次 'ls -l' 可以看到大部分文件都是 0 字节大的;不过察看这些文件的时候,确实可以看到一些信息。这怎么可能?这是因为 /proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层 (VFS) 了。然而,直到当 VFS 调用它,请求文件、目录的i-node 的时候,/proc 文件系统才根据内核中的信息建立相应的文件和目录。
加载proc文件系统:
/proc 文件系统提供了一个基于文件的Linux 内部接口。它可以用于确定系统的各种不同设备和进程的状态。对他们进行配置。
如果系统中还没有加载 proc文件系统,可以通过如下命令加载:
mount -t proc proc /proc
proc的文件:
/proc 的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进程的状态等信息。大部分 /proc 中的文件和目录提供系统物理环境最新的信息。尽管 /proc 中的文件是虚拟的,但它们仍可以使用任何文件编辑器或像'more', 'less'或 'cat'这样的程序来查看。当编辑程序试图打开一个虚拟文件时,这个文件就通过内核中的信息被凭空地 (on the fly) 创建了。
有些 /proc 的文件是经过编码的,不同的工具可以被用来解释这些编码过的信息并输出成可读的形式。这样的工具包括:'top', 'ps', 'apm' 等。 proc 文件系统可以被用于收集有用的关于系统和运行中的内核的信息。下面是一些重要的文件:
/proc/cpuinfo:CPU 的信息 (型号, 家族, 缓存大小等) 、/proc/meminfo:物理内存、交换空间等的信息、/proc/mounts :已加载的文件系统的列表、/proc/devices :可用设备的列表、/proc/filesystems - 被支持的文件系统、/proc/modules: 已加载的模块、/proc/version:内核版本/proc/cmdline:系统启动时输入的内核命令行参数。proc 中的文件远不止上面列出的这么多。想要进一步了解的读者可以对 /proc 的每一个文件都'more'一下。
运行中的进程的信息:
/proc 文件系统可以用于获取运行中的进程的信息。在 /proc 中有一些编号的子目录。每个编号的目录对应一个进程 id (PID)。这样,每一个运行中的进程 /proc 中都有一个用它的 PID 命名的目录。这些子目录中包含可以提供有关进程的状态和环境的重要细节信息的文件,子目录例如下面的内容:
dr-xr-xr-x 2 oracle oinstall 0 Aug 31 11:30 attr -r-------- 1 oracle oinstall 0 Aug 31 11:30 auxv -r--r--r-- 1 oracle oinstall 0 Aug 28 17:45 cmdline # 内容是启动进程时调用的命令行 -r--r--r-- 1 oracle oinstall 0 Aug 31 11:30 cpuset lrwxrwxrwx 1 oracle oinstall 0 Aug 31 11:30 cwd -> /nrl/db/11g/dbs # 指向进程当前工作目录 -r-------- 1 oracle oinstall 0 Aug 31 11:30 environ # 环境变量 lrwxrwxrwx 1 oracle oinstall 0 Aug 28 17:45 exe -> /nrl/db/11g/bin/oracle # 运行进程的应用程序 dr-x------ 2 oracle oinstall 0 Aug 28 17:09 fd -rw-r--r-- 1 oracle oinstall 0 Aug 31 11:30 loginuid -rw------- 1 oracle oinstall 0 Aug 31 11:30 mapped_base -r--r--r-- 1 oracle oinstall 0 Aug 28 17:09 maps -rw------- 1 oracle oinstall 0 Aug 31 11:30 mem -r--r--r-- 1 oracle oinstall 0 Aug 31 11:30 mounts -r--r--r-- 1 oracle oinstall 0 Aug 31 11:30 numa_maps -rw-r--r-- 1 oracle oinstall 0 Aug 31 11:30 oom_adj -r--r--r-- 1 oracle oinstall 0 Aug 31 11:30 oom_score lrwxrwxrwx 1 oracle oinstall 0 Aug 31 11:30 root -> / -rw------- 1 oracle oinstall 0 Aug 31 11:30 seccomp -r--r--r-- 1 oracle oinstall 0 Aug 31 11:30 smaps -r--r--r-- 1 oracle oinstall 0 Aug 28 17:09 stat -r--r--r-- 1 oracle oinstall 0 Aug 28 17:09 statm -r--r--r-- 1 oracle oinstall 0 Aug 30 19:07 status # 进程的状态信息 dr-xr-xr-x 3 oracle oinstall 0 Aug 31 11:30 task |
/proc/self 是一个有趣的子目录,它使得程序可以方便地使用 /proc 查找本进程地信息。/proc/self 是一个链接到 /proc 中访问 /proc 的进程所对应的 PID 的目录的符号链接。
通过 /proc 与内核交互:
上面/proc 的文件是只读的。而实际上 /proc 文件系统通过 /proc 中可读写的文件提供了对内核的交互机制。写这些文件可以改变内核的状态,因而要慎重改动这些文件。/proc/sys 目录存放所有可读写的文件的目录,可以被用于改变内核行为。
/proc/sys/kernel - 这个目录包含反通用内核行为的信息。 /proc/sys/kernel/{domainname, hostname} 存放着机器/网络的域名和主机名。这些文件可以用于修改这些名字。通过修改 /proc 文件系统中的文件,可以修改主机名。很多其他可配置的文件存在于 /proc/sys/kernel/。
另一个可配置的目录是 /proc/sys/net。这个目录中的文件可以用于修改机器/网络的网络属性。比如,简单修改一个文件,就可以在网络上瘾藏匿的计算机。
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
这将在网络上瘾藏你的机器,因为它不响应 icmp_echo。主机将不会响应其他主机发出的 ping 查询。要改回缺省设置,只要执行下面的命令:
# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all