解析Linux系統中的/proc虛擬檔案系統

來源:互聯網
上載者:User

   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 系統的關鍵。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.