加載 proc 文件系統node
察看 /proc 的文件linux
獲得有用的系統/內核信息web
有關運行中的進程的信息api
/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 文件系統:
less
mount -t proc proc /procdom
上述命令將成功加載你的 proc 文件系統。更多細節請閱讀 mount 命令的 man page。
/proc 的文件能夠用於訪問有關內核的狀態、計算機的屬性、正在運行的進程的 狀態等信息。大部分 /proc 中的文件和目錄提供系統物理環境最新的信息。儘管 /proc 中的文件是虛擬的,但它們仍可使用任何文件編輯器或像'more', 'less'或 'cat'這樣的程序來查看。當編輯程序試圖打開一個虛擬文件時,這個文件就經過內核 中的信息被憑空地 (on the fly) 建立了。這是一些我從個人系統中獲得的一些有趣 結果:
$ ls -l /proc/cpuinfo -r--r--r-- 1 root root 0 Dec 25 11:01 /proc/cpuinfo $ file /proc/cpuinfo /proc/cpuinfo: empty $ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 6 cpu MHz : 1000.119 cache size : 256 KB fdiv_bug : no hlt_bug : no sep_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 mmx fxsr xmm bogomips : 1998.85 processor : 3 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 6 cpu MHz : 1000.119 cache size : 256 KB fdiv_bug : no hlt_bug : no sep_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 mmx fxsr xmm bogomips : 1992.29
這是一個從雙 CPU 的系統中獲得的結果,上述大部分的信息十分清楚地給出了這個系 統的有用的硬件信息。有些 /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'一下或讀參考文獻[1]獲取更多的有關 /proc 目錄中的文件的信息。我建議 使用'more'而不是'cat',除非你知道這個文件很小,由於有些文件 (好比 kcore) 可能 會很是長。
/proc 文件系統能夠用於獲取運行中的進程的信息。在 /proc 中有一些編號的子目錄。每一個編號的目錄對應一個進程 id (PID)。這樣,每個運行中的進程 /proc 中都有一個用它的 PID 命名的目錄。這些子目錄中包含能夠提供有關進程的狀態和環境的重要細節信息的文件。讓咱們試着查找一個運行中的進程。
$ ps -aef | grep mozilla root 32558 32425 8 22:53 pts/1 00:01:23 /usr/bin/mozilla
上述命令顯示有一個正在運行的 mozilla 進程的 PID 是 32558。相對應的,/proc 中應該有一個名叫 32558 的目錄
$ ls -l /proc/32558 total 0 -r--r--r-- 1 root root 0 Dec 25 22:59 cmdline -r--r--r-- 1 root root 0 Dec 25 22:59 cpu lrwxrwxrwx 1 root root 0 Dec 25 22:59 cwd -> /proc/ -r-------- 1 root root 0 Dec 25 22:59 environ lrwxrwxrwx 1 root root 0 Dec 25 22:59 exe -> /usr/bin/mozilla* dr-x------ 2 root root 0 Dec 25 22:59 fd/ -r--r--r-- 1 root root 0 Dec 25 22:59 maps -rw------- 1 root root 0 Dec 25 22:59 mem -r--r--r-- 1 root root 0 Dec 25 22:59 mounts lrwxrwxrwx 1 root root 0 Dec 25 22:59 root -> // -r--r--r-- 1 root root 0 Dec 25 22:59 stat -r--r--r-- 1 root root 0 Dec 25 22:59 statm -r--r--r-- 1 root root 0 Dec 25 22:59 status
文件 "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/sys 目錄存放全部可讀寫的文件 的目錄,能夠被用於改變內核行爲。
/proc/sys/kernel - 這個目錄包含反通用內核行爲的信息。 /proc/sys/kernel/{domainname, hostname} 存放着機器/網絡的域名和主機名。 這些文件能夠用於修改這些名字。
$ hostname machinename.domainname.com $ cat /proc/sys/kernel/domainname domainname.com $ cat /proc/sys/kernel/hostname machinename $ echo "new-machinename" > /proc/sys/kernel/hostname $ hostname new-machinename.domainname.com
這樣,經過修改 /proc 文件系統中的文件,咱們能夠修改主機名。不少其 他可配置的文件存在於 /proc/sys/kernel/。這裏不可能列出全部這些文件, 讀者能夠本身去這個目錄查看以獲得更多細節信息。
另外一個可配置的目錄是 /proc/sys/net。這個目錄中的文件能夠 用於修改機器/網絡的網絡屬性。好比,簡單修改一個文件,你能夠在網絡 上癮藏匿的計算機。
$ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
這將在網絡上癮藏你的機器,由於它不響應 icmp_echo。主機將不會響應其 他主機發出的 ping 查詢。
$ ping machinename.domainname.com no answer from machinename.domainname.com
要改回缺省設置,只要
$ echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
/proc/sys 下還有許多其它能夠用於改變內核屬性。讀者能夠經過參考文獻 [1], [2] 獲取更多信息。