理解 Proc 檔案系統(轉)

post0發表於2007-08-10
理解 Proc 檔案系統(轉)[@more@]

摘要:

Linux 核心提供了一種透過 /proc 檔案系統,在執行時訪問核心內部資料結構、改變核心設定的機制。儘管在各種硬體平臺上的 Linux 系統的 /proc 檔案系統的基本概念都是相同的,但本文只討論基於 intel x86 架構的 Linux /proc 檔案系統。

_________________ _________________ _________________

/proc --- 一個虛擬檔案系統

/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 檔案系統,可以透過如下命令載入 proc 檔案系統:

mount -t proc proc /proc

上述命令將成功載入你的 proc 檔案系統。更多細節請閱讀 mount 命令的 man page。

察看 /proc 的檔案

/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 中可讀寫的檔案提供了對核心的互動機制。寫這些檔案可以改變核心的狀態,因而要慎重改動這些檔案。/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] 獲取更多資訊。

結論

/proc 檔案系統提供了一個基於檔案的 Linux 內部介面。它可以用於確定系統的各種不同裝置和程式的狀態。對他們進行配置。因而,理解和應用有關這個檔案系統的知識是理解你的 Linux 系統的關鍵。

參考文獻

* [1] 有關Linux proc 檔案系統的文件位於: /usr/src/linux/Documentation/filesystems/proc.txt

* [2] RedHat Guide: The /proc File System:

對這篇文章發表評論

每篇文章都有各自的反饋頁面。在這個頁面裡,您可以提交評論,也可以檢視其他讀者的評論

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-940538/,如需轉載,請註明出處,否則將追究法律責任。

相關文章