天天看點

linux 下proc虛拟檔案系統

/prco是proc中process的縮寫,隻存在記憶體中,它以檔案系統的方式存在,為通路系統核心的操作提供一個接口,使用者和應用程式可以通過/proc得到系統的資訊,并可以通過此來改變核心的一些參數。

cat /proc/cpuinfo

#展示現在cpu的資訊

grep -E '(vmx|svm)' /proc/cpuinfo # 檢視cpu是否支援虛拟化 cat /proc/meminfo

   #檢視記憶體資訊

cat /proc/filesystem

 #列出可供使用的檔案系統資訊

cat /proc/mounts     # 列出現在系統挂載的裝置 cat  /proc/uptime

     # 顯示系統啟時間

cat /proc/version

#擷取系統核心資訊

了解 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 cpu MHz         : 1000.119 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca 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 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/sys/net/ipv4/ip_forward中的檔案可以控制kernel是否可以轉發IP資料包,也就是說扮演網關的角色,可以對它進行修改及重置,例如

#cat /proc/sys/net/ipv4/ip_forward

說明沒有IP資料包的轉發功能

# echo 1 > /proc/sys/net/ipv4/ip_forward

将在運作的kernel中打開IP轉發功能。

除了使用cat和echo來檢查和更正/proc/sys下的資訊,還可以通過指令sysctl來進行

例如檢視是否有iP轉發功能利用指令為

#sysctl net.ipv4.ip_forward

Net.ipv4.ip_forward=0

利用sysctl設定,指令為:#sysctl –w net.ipv4.ip_forward=1

就完成了設定

需要注意的是,以這種方式你所做的設定改變隻能影響目前運作的kernel的,當reboot的時候就不再有效。如果想讓設定永久有效,将它們放置在/etc/sysctl.conf檔案中。在boot time時,sysctl将自動重新确定它在此檔案下找到的任何設定。

/etc/sysctl.conf下的代碼行大概是這樣的:net.ipv4.ip_forward=1

結論

/proc 檔案系統提供了一個基于檔案的 Linux 内部接口。它可以用于确定系統 的各種不同裝置和程序的狀态。對他們進行配置。因而,了解和應用有關這個 檔案系統的知識是了解你的 Linux 系統的關鍵。

繼續閱讀