1. 程式人生 > >核心proc檔案系統簡介

核心proc檔案系統簡介

/proc檔案系統是一個特殊的由核心建立的檔案系統,她僅存在於記憶體之中而不在外存(硬碟、flash)上。核心用她來向用戶空間程序輸出訊息,可以說是核心向用戶空間開啟的一扇窗戶。
最初開發/proc檔案系統是為提供一種核心及其模組向程序 (process) 傳送資訊的機制 (這就是proc名字的由來)。這個虛擬檔案系統讓你可以和核心內部資料結構進行互動,獲取對於程序的有用資訊,並可在執行時改變設定核心引數。後來,由於這個檔案系統使用方便,核心中其餘元件也開始用它來報告資訊或實現動態配置。正由於proc檔案系統在核心開發者看來有點混亂和失控,已經偏離了創造她的初衷,所以新核心模組程式碼中建議利用基於Linux裝置模型的sysfs檔案系統實現核心資訊向用戶空間的匯出。例如模組引數,EXPORT_SYMBOL巨集本身就會為你建立sysfs介面檔案。
/proc檔案系統中的檔案既可讀也可寫。但是, 大部分/proc 檔案是隻讀的。這些完全看建立介面時使用的是核心API。/proc 下的每個檔案的操作函式最後都對映一個核心函式上,當檔案被讀取的時候此函式負責實時產生檔案內容(一般是核心結構體中的資料)返回給procfs,之後由procfs通過VFS返回給使用者空間。
比如平時我們通過lsmod命令列出當前已載入的模組列表,而這個命令就是通過/proc/modules獲取資訊的,只不過lsmod將資訊顯示得比較好看罷了
而/proc/modules所對應的proc實現函式位於kernel/module.c,其中的原理就是利用核心struct modules結構體的表頭遍歷核心模組連結串列,從所有模組的struct module結構體中獲取模組的相關資訊。從這個例子中我們就可以真實地體會到procfs就是和核心內部資料結構進行互動的視窗。
除此之外,/proc 在 Linux 系統中還有非常多應用,很多Linux 使用者空間工具,如 ps, top, 以及 uptime,都是從 /proc 中獲取資訊的,一些裝置驅動也通過 /proc 輸出資訊
這裡寫圖片描述


下面是一些重要的檔案,她們都是用於收集關於系統和執行中的核心的資訊:
/proc/cpuinfo - CPU 的資訊 (型號, 構架, 快取大小等)
/proc/mounts - 已載入的檔案系統的列表
/proc/devices - 可用裝置列表
/proc/filesystems - 被支援的檔案系統
/proc/modules - 已載入的模組列表
/proc/version - 核心版本字串
/proc/cmdline - 系統啟動時輸入的核心命令列引數
/proc/config.gz - 核心配置壓縮檔案
/proc/zoneinfo - 記憶體域資訊
/proc/buddyinfo - 夥伴系統資訊
/proc/slabinfo - slab分配器資訊
/proc/meminfo - 實體記憶體、交換空間等的資訊
/proc/vmstat - 虛擬記憶體的統計資訊
/proc/vmallocinfo - 虛擬地址分配對映資訊
/proc/iomem - IO記憶體對映資訊
/proc/ioports - IO埠對映資訊
/proc/softirqs - 核心軟中斷資訊
/proc/interrupts - 硬體中斷資訊
/proc/kallsyms - 核心符號資訊,主要用於除錯
/proc/kmsg - 核心日誌介面檔案
/proc/sysrq-trigger - SysRq觸發檔案
/proc/uptime - 系統上電啟動時間和空閒時間統計
/proc/partitions - 系統硬碟或flash分割槽資訊
/proc/stat - 核心和系統的統計資訊
/proc/mtd - MTD系統分割槽資訊,主要在嵌入式系統中
/proc/loadavg - 系統負載統計資料
/proc/locks - 被核心鎖定的檔案
/proc/timer_list - 核心各種計時器資訊
/proc/misc - 被註冊文misc雜項裝置的資訊
出此之外,其中還有一些子系統的目錄也記錄了一些核心資訊,其中比較重要的是/proc/sys 目錄。上面討論的大部分 /proc 檔案是隻讀的。而/proc/sys 目錄存放幾乎所有可讀寫的檔案,實際上 /proc 檔案系統就是通過這些可讀寫的檔案提供了對核心的互動機制,可被用於改變核心行為和行為。
/proc/sys/kernel - 這個目錄包含通用核心行為的資訊。如/proc/sys/kernel/{domainname, hostname} 存放著機器的網路域名和主機名,她們可以被修改;再比如其中的printk*檔案,用於控制核心日誌系統的行為。
/proc/sys/net - 用於修改核心網路子系統的一些屬性。比如讓核心不響應其他主機發出的 ping 可以做如下操作:
$ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
/proc/sys/vm - 用於修改核心記憶體管理子系統的相關配置

/proc/sys 下還有許多其它可以用於改變核心屬性的檔案。

介紹了這麼多的proc的檔案用途,而創造她的初衷:用於獲取對於程序的有用資訊,這點還沒有介紹。如果你執行ls /proc命令,你可以看到很多數字編號的目錄。每個編號的目錄都對應一個程序 id (PID),而每一個執行中的程序 在/proc 中都有一個用其 PID 命名的目錄。這些子目錄中包含可以提供有關程序的狀態和環境的重要細節資訊的檔案。例如我們看看系統中都有的init程序(PID為1)的資訊。

[email protected]:/proc# cd 1
[email protected]:/proc/1# ls -l
dr-xr-xr-x 2 root root 0 Dec 9 16:38 attr
-r——– 1 root root 0 Dec 9 16:38 auxv
–w——- 1 root root 0 Dec 9 16:38 clear_refs
-r–r–r– 1 root root 0 Dec 9 16:38 cmdline
-rw-r–r– 1 root root 0 Dec 9 16:38 comm
-rw-r–r– 1 root root 0 Dec 9 16:38 coredump_filter
lrwxrwxrwx 1 root root 0 Dec 9 16:38 cwd -> /
-r——– 1 root root 0 Dec 9 16:38 environ
lrwxrwxrwx 1 root root 0 Dec 9 16:38 exe -> /sbin/init.sysvinit
dr-x—— 2 root root 0 Dec 9 16:38 fd
dr-x—— 2 root root 0 Dec 9 16:38 fdinfo
-r–r–r– 1 root root 0 Dec 9 16:38 limits
-r–r–r– 1 root root 0 Dec 9 16:38 maps
-rw——- 1 root root 0 Dec 9 16:38 mem
-r–r–r– 1 root root 0 Dec 9 16:38 mountinfo
-r–r–r– 1 root root 0 Dec 9 16:38 mounts
-r——– 1 root root 0 Dec 9 16:38 mountstats
dr-xr-xr-x 7 root root 0 Dec 9 16:38 net
-rw-r–r– 1 root root 0 Dec 9 16:38 oom_adj
-r–r–r– 1 root root 0 Dec 9 16:38 oom_score
-rw-r–r– 1 root root 0 Dec 9 16:38 oom_score_adj
-r——– 1 root root 0 Dec 9 16:38 pagemap
-r——– 1 root root 0 Dec 9 16:38 personality
lrwxrwxrwx 1 root root 0 Dec 9 16:38 root -> /
-r–r–r– 1 root root 0 Dec 9 16:38 smaps
-r–r–r– 1 root root 0 Dec 9 16:38 stat
-r–r–r– 1 root root 0 Dec 9 16:38 statm
-r–r–r– 1 root root 0 Dec 9 16:38 status
dr-xr-xr-x 3 root root 0 Dec 9 16:38 task
-r–r–r– 1 root root 0 Dec 9 16:38 wchan
“cmdline” 包含啟動程序時呼叫的命令列。
“envir” 程序的環境變數。
“status” 是程序的狀態資訊,包括啟動程序的使用者ID (UID) 和組ID(GID) 、父程序ID (PPID),以及程序當前的狀態,比如”Sleelping”和”Running”。

每個程序的目錄都有幾個符號連結:
“cwd”是指向程序當前工作目錄的符號連結,
“exe”指向執行的程序的可執行程式,
“root”指向被這個程序看作是根目錄的目錄 (通常是”/”)。
目錄”fd”包含指向程序使用的檔案描述符的連結。
而proc中還有一個子目錄/proc/self ,它儲存當前訪問這個目錄的程序自身的資訊。/proc/self 是一個連結到 /proc 中訪問 /proc 的程序所對應的 PID 的目錄的符號連結。其實這個self目錄中獲取資訊的procfs介面函式就是通過“current”巨集來實現的。