linux proc文件系統學習

目錄:
摘要:
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 系統的關鍵。
參考文獻
 
================================================================
什麼是proc文件系統?
proc文件系統是一個僞文件系統,它只存在內存當中,而不佔用外存空間。它以文件系統的方式爲訪問系統內核數據的操作提供接口。用戶和應用程序可以通過proc得到系統的信息,並可以改變內核的某些參數。由於系統的信息,如進程,是動態改變的,所以用戶或應用程序讀取proc文件時,proc文件系統是動態從系統內核讀出所需信息並提交的。它的目錄結構如下:
目錄名稱 目錄內容
apm 高級電源管理信息
cmdline 內核命令行
Cpuinfo 關於Cpu信息
Devices 可以用到的設備(塊設備/字符設備)
Dma 使用的DMA通道
Filesystems 支持的文件系統
Interrupts 中斷的使用
Ioports I/O端口的使用
Kcore 內核核心印象
Kmsg 內核消息
Ksyms 內核符號表
Loadavg 負載均衡
Locks 內核鎖
Meminfo 內存信息
Misc 雜項
Modules 加載模塊列表
Mounts 加載的文件系統
Partitions 系統識別的分區表
Rtc 實時時鐘
Slabinfo Slab池信息
Stat 全面統計狀態表
Swaps 對換空間的利用情況
Version 內核版本
Uptime 系統正常運行時間
並不是所有這些目錄在你的系統中都有,這取決於你的內核配置和裝載的模塊。另外,在/proc下還有三個很重要的目錄:net,scsi和sys。 Sys目錄是可寫的,可以通過它來訪問或修改內核的參數(見下一部分),而net和scsi則依賴於內核配置。例如,如果系統不支持scsi,則scsi 目錄不存在。
除了以上介紹的這些,還有的是一些以數字命名的目錄,它們是進程目錄。系統中當前運行的每一個進程都有對應的一個目錄在/proc下,以進程的 PID號爲目錄名,它們是讀取進程信息的接口。而self目錄則是讀取進程本身的信息接口,是一個link。Proc文件系統的名字就是由之而起。進程目錄的結構如下:
目錄名稱 目錄內容
Cmdline 命令行參數
Environ 環境變量值
Fd 一個包含所有文件描述符的目錄
Mem 進程的內存被利用情況
Stat 進程狀態
Status 進程當前狀態,以可讀的方式顯示出來
Cwd 當前工作目錄的鏈接
Exe 指向該進程的執行命令文件
Maps 內存映象
Statm 進程內存狀態信息
Root 鏈接此進程的root目錄
用戶如果要查看系統信息,可以用cat命令。例如:
# cat /proc/interrupts
CPU0
0: 8728810 XT-PIC timer
1: 895 XT-PIC keyboard
2: 0 XT-PIC cascade
3: 531695 XT-PIC aha152x
4: 2014133 XT-PIC serial
5: 44401 XT-PIC pcnet_cs
8: 2 XT-PIC rtc
11: 8 XT-PIC i82365
12: 182918 XT-PIC Mouse
13: 1 XT-PIC fpu PS/2
14: 1232265 XT-PIC ide0
15: 7 XT-PIC ide1
NMI: 0
用戶還可以實現修改內核參數。在/proc文件系統中有一個有趣的目錄:/proc/sys。它不僅提供了內核信息,而且可以通過它修改內核參數,來優化你的系統。但是你必須很小心,因爲可能會造成系統崩潰。最好是先找一臺無關緊要的機子,調試成功後再應用到你的系統上。
要改變內核的參數,只要用vi編輯或echo參數重定向到文件中即可。下面有一個例子:
# cat /proc/sys/fs/file-max
4096
# echo 8192 > /proc/sys/fs/file-max
# cat /proc/sys/fs/file-max
8192
如果你優化了參數,則可以把它們寫成添加到文件rc.local中,使它在系統啓動時自動完成修改。
/proc文件系統中網絡參數
在/proc/sys/net/ipv4/目錄下,包含的是和tcp/ip協議相關的各種參數,下面我們就對這些網絡參數加以詳細的說明。
ip_forward 參數類型:BOOLEAN
0 - 關閉(默認值)
not 0 - 打開ip轉發
在網絡本地接口之間轉發數據報。該參數非常特殊,對該參數的修改將導致其它所有相關配置參數恢復其默認值(對於主機參閱RFC1122,對於路由器參見RFC1812)
ip_default_ttl 參數類型:INTEGER
默認值爲 64 。表示IP數據報的Time To Live值。
ip_no_pmtu_disc 參數類型:BOOLEAN
關閉路徑MTU探測,默認值爲FALSE
ipfrag_high_thresh 參數類型:整型
用來組裝分段的IP包的最大內存量。當ipfrag_high_thresh數量的內存被分配來用來組裝IP包,則IP分片處理器將丟棄數據報直到ipfrag_low_thresh數量的內存被用來組裝IP包。
ipfrag_low_thresh 參數類型:整型
參見ipfrag_high_thresh。
ipfrag_time 參數類型:整型
保存一個IP分片在內存中的時間。
inet_peer_threshold 參數類型:整型
INET對端存儲器某個合適值,當超過該閥值條目將被丟棄。該閥值同樣決定生存時間以及廢物收集通過的時間間隔。條目越多﹐存活期越低﹐GC 間隔越短
inet_peer_minttl 參數類型:整型
條目的最低存活期。在重組端必須要有足夠的碎片(fragment)存活期。這個最低存活期必須保證緩衝池容積是否少於 inet_peer_threshold。該值以 jiffies爲單位測量。
 
 
 
=============================================================
最近在學linux /proc文件系統的相關內容,特地挑選幾篇網上優秀的相關文章如下:
1.理解/proc文件系統
http://linux.chinaunix.net/doc/2004-10-05/16.shtml
2.什麼是/proc文件系統
http://blog.chinaunix.net/u1/55764/showart_1101797.html
3.使用/proc文件系統來訪問Linux內核的內容
http://www.ibm.com/developerworks/cn/linux/l-proc.html
4.linux /proc文件系統操作指南
http://www.lupaworld.com/22802/viewspace_42440.html
5.linux /proc文件系統
http://man.chinaunix.net/linux/mandrake/101/zh_cn/Command-Line.html/ch10s01.html
6.Linux內核模塊編程/proc 文件系統
http://www.itfensi.com/soft/linux/dev/11674075331844.html
7.linux /proc文件系統編程
http://www.clinux.org/node/28004
http://linux.sheup.com/linux/linux28.htm
8./proc文件系統分析(二)
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=200166&page=82&view=collapsed&sb=5&o=all
9./proc文件系統分析(四)
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=200168&page=82&view=collapsed&
10./proc文件系統5大功能
http://www.builder.com.cn/2004/0212/106646.shtml
11./proc目錄詳解
http://blog.csdn.net/ne2000/archive/2005/12/09/548009.aspx
在此感謝以上文章的作者!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章