Procfs

在許多類 Unix 電腦系統中， **procfs** 是 行程 檔案系統 (file system) 的縮寫，包含一個偽檔案系統（啟動時動態生成的檔案系統），用於通過核心存取行程資訊。這個檔案系統通常被掛載到 `/proc` 目錄。由於 /proc 不是一個真正的檔案系統，它也就不占用儲存空間，只是占用有限的記憶體。

以下作業系統支援 procfs :

* Solaris
* BSD
* Linux（將此概念擴充到了非行程相關資料）
* IBM AIX （其實現基於 Linux 以提高相容性）
* QNX
* 貝爾實驗室九號計畫（此概念之源頭）

## 歷史

### UNIX 8

Tom J. Killian 實現了 UNIX 8 版本的 `/proc`：他 1984 年 6 月向 USENIX 提交了一份題為 "Processes as Files" 的論文。procfs 的設計目標是用來替代進行行程跟蹤的 _ptrace_ 系統呼叫。 詳細文件請參考當時的 proc (4) 使用者手冊。

### SVR4

Roger Faulkner 和 Ron Gomes 將 Unix 8 的 `/proc` 移植到了 SVR4，並在 1991 年 1 月的 USENIX 上發表了一篇題為 "The Process File System and Process Model in UNIX System V" 的論文。 此類 procfs 在功能上已經足夠實現 `ps` 命令了， 但是其中的檔案只能通過 `read()`、 `write()` 和 `ioctl()` 系統呼叫來存取。從 1995 到 1996 年， Roger Faulkner 又為 Solaris 2.6 編寫了 procfs-2 介面， 提供了一個結構化的， 基於子目錄的 `/proc` 檔案系統。

### Plan 9

Plan 9 實現了一個行程檔案系統，但比 V8 做得更多。V8 的行程檔案系統中，對一個行程相關的所有函式都在一個檔案進行操作。九號計畫使用單獨的檔案，提供這些函式，使得 `/proc` 成為檔案系統真正的一部分。

### 4.4BSD

4.4BSD 從 Plan 9 復刻了 `/proc` 的實現。然而從 2011 年 2 月開始， FreeBSD 逐步淘汰了 procfs ，轉而使用 sysctl 介面來取得行程相關資訊。預設安裝的 base 系統不依賴 procfs，FreeBSD 原生 ports 也不再依賴 procfs。macOS 則完全棄用了 procfs，只支援 sysctl 介面。

為了提供對 Linux 使用者空間程式的二進位相容性，FreeBSD 核心也提供類似於 Linux /proc/ 的 **linprocfs**。

### Solaris

Solaris 從一開始就提供對 `/proc` 的支援。 在 1996 年， Solaris 2.6 引入了由 Roger Faulkner 編寫的 procfs2 。

### Linux

Linux 中的 `/proc` 實現也克隆了 九號計畫 中對應的部分。

每個正在執行的行程對應於 `/proc` 下的一個目錄，目錄名就是行程的 PID，每個目錄包含:

* /proc/PID/cmdline, 啟動該行程的命令列.
* /proc/PID/cwd, 當前工作目錄的符號連結.
* /proc/PID/environ 影響行程的環境變數的名字和值.
* /proc/PID/exe, 最初的可執行檔的符號連結，如果它還存在的話。
* /proc/PID/fd, 一個目錄，包含每個打開的檔案描述子的符號連結.
* /proc/PID/fdinfo, 一個目錄，包含每個打開的檔案描述子的位置和標記
* /proc/PID/maps, 一個文字檔案包含記憶體對映檔案與塊的資訊。
* /proc/PID/mem, 一個二進位圖像 (image) 表示行程的虛擬記憶體，只能通過 ptrace 化行程存取.
* /proc/PID/root, 該行程所能看到的根路徑的符號連結。如果沒有 chroot 監獄，那麼行程的根路徑是 /.
* /proc/PID/status 包含了行程的基本資訊，包括執行狀態、記憶體使用。
* /proc/PID/task, 一個目錄包含了硬連結到該行程啟動的任何任務

(使用者可以獲得 PID 使用工具如 pgrep, pidof 或 ps:

)

Linux 2.6 把 `/proc` 下大量的非進程相關的系統資訊移動到一個專門的偽檔案系統，稱為 sysfs（該檔案系統是掛載到 `/sys` 上面）:

* 電源管理系統（如果有的話）對應的目錄 /proc/acpi 或 /proc/apm
* /proc/buddyinfo, 資訊關於夥伴記憶體分配器用於處理記憶體碎片。
* /proc/bus, 包含對應於電腦上各種匯流排的目錄，如 input/PCI/USB. 在 /sys/bus 下包含更豐富的資訊。
* /proc/fb, 可利用的影格緩衝的列表
* /proc/cmdline, 傳遞給核心的啟動選項。
* /proc/cpuinfo, 包含 CPU 資訊，諸如廠商（vendor），型號 (family, model，model names), 速度，快取大小，邏輯核數，物理核數，CPU flags，以及 BogoMips. 對於多核 CPU，/proc/cpuinfo 的邏輯核數 "siblings" 與物理核數 "cpu cores" 分別表示:

```
"siblings" = (HT per CPU package) * (# of cores per CPU package)
"cpu cores" = (# of cores per CPU package)
```

CPU package 是指單獨封裝的一顆 CPU。這可以區分超執行緒與雙核，例如每顆 CPU 超執行緒數量為 _siblings / CPU cores_. 如果二者的值相等，則 CPU 不支援超執行緒.

* /proc/crypto, 可利用的加密模組列表
* /proc/devices, 字元裝置與塊裝置列表，按照裝置 ID 排序，但給出了 /dev 名字的主要部分
* /proc/diskstats, 給出了每一塊邏輯磁碟裝置的一些資訊
* /proc/filesystems, 當前時刻核心支援的檔案系統的列表
* /proc/interrupts, /proc/iomem, /proc/ioports, /proc/irq, 裝置的一些與中斷、記憶體存取有關的資訊
* /proc/kmsg, 用於跟蹤讀取核心訊息
* /proc/meminfo, 包含核心管理記憶體的一些匯總資訊
* /proc/modules, 是 /proc 最重要的檔案之一，包含了當前載入的核心模組列表
* /proc/mounts, 包含了當前安裝裝置及安裝點的符號連結
* /proc/net/, 一個目錄包含了當前網路棧的資訊，特別是 /proc/net/nf\_conntrack 列出了存在的網路連接 (對跟蹤路由特別有用，因為 iptables 轉發被用於重新導向網路連接)
* /proc/partitions, 一個裝置號、尺寸與 /dev 名的列表，核心用於辨別已存在的硬碟分割區
* /proc/scsi, 給出任何通過 SCSI 或 RAID 控制器掛接的裝置的資訊
* /proc/self (即 /proc/PID/ 其中行程 ID 是當前行程的) 為當前行程的符號連結
* /proc/slabinfo, Linux 核心頻繁使用的物件的統計資訊
* /proc/swaps, 活動交換分割區的資訊，如尺寸、優先級等。
* /proc/sys，動態可組態的核心選項。其下的目錄對應與核心區域，包含了可讀與可寫的虛擬檔案（virtual file）.
* /proc/sysvipc, 包括共享記憶體與行程間通訊 (IPC) 資訊
* /proc/tty, 包含當前終端資訊； /proc/tty/driver 是可利用的 tty 類型列表，其中的每一個是該類型的可用裝置列表。
* /proc/uptime, 核心啟動後經過的秒數與 idle 模式的秒數
* /proc/version, 包含 Linux 核心版本，發布號（distribution number）, 編譯核心的 gcc 版本，其他相關的版本
* 其他檔案依賴於不同的硬體，模組組態與核心改變

Linux 下使用 `/proc` 的基本工具是 procps (`/proc` processes) 中的程式，這個程式只對 procfs 具有意義。procfs 對部分功能從核心態移到使用者態的過程中產生重大的意義。像是 GNU 版本的 ps 只需在使用者態底下運作透過 procfs 取得資料便可以完成所有的工作。

相關命令：

* sysctl
* lsdev 收集相關裝置的 DMA, IRQ, I/O 埠資訊並匯總顯示
* procinfo

### Cygwin

Cygwin 實現的 `/proc` 與 Linux 基本一致。

### Cobalt

## 外部連結

* A MacFUSE-Based Process File System for Mac OS X（頁面存檔備份，存於網際網路檔案館）
* Access the Linux kernel using the Procfs（頁面存檔備份，存於網際網路檔案館） An IBM developerWorks article by M. Tim Jones
* Linux-Filesystem-Hierarchy（頁面存檔備份，存於網際網路檔案館） Linux Documentation Project

## 參考

* Red Hat, Inc. _Tips & Tricks Featured Article: /proc/meminfo Explained_, March 2003.（頁面存檔備份，存於網際網路檔案館）