procfs
在許多類 Unix 電腦系統中, procfs 是 行程 檔案系統 (file system) 的縮寫,包含一個偽檔案系統(啟動時動態生成的檔案系統),用於通過核心訪問行程資訊。這個檔案系統通常被掛載到 /proc
目錄。由於 /proc 不是一個真正的檔案系統,它也就不占用儲存空間,只是占用有限的主記憶體。
以下作業系統支援 procfs :
歷史
UNIX 8
Tom J. Killian 實現了 UNIX 8 版本的 /proc
:他1984年6月向 USENIX 提交了一份題為 "Processes as Files" 的論文。procfs 的設計目標是用來替代進行行程跟蹤的 ptrace 系統呼叫。 詳細文件請參考當時的 proc(4) 使用者手冊[1]。
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 [2],轉而使用sysctl介面來取得行程相關資訊。預設安裝的 base 系統不依賴 procfs,FreeBSD 原生 ports 也不再依賴 procfs。macOS則完全棄用了procfs,只支援sysctl介面。[3]
為了提供對Linux使用者空間程式的二進制相容性,FreeBSD核心也提供類似於 Linux /proc/ 的linprocfs。[4]
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:
$ ls -l /proc/$(pgrep -n python)/fd # List all file descriptors of the most recently started `python' process
samtala 0
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 0 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 1 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 2 -> /dev/pts/3
$ readlink /proc/$(pgrep -n python)/exe # List executable used to launch the most recently started `python' process
/usr/bin/python3.1
)
Linux 2.6把 /proc
下大量的非進程相關的系統資訊移動到一個專門的偽檔案系統,稱為 sysfs(該檔案系統是掛載到 /sys
上面):
- 電源管理系統(如果有的話)對應的目錄/proc/acpi或/proc/apm
- /proc/buddyinfo, 資訊關於夥伴主記憶體分配器用於處理主記憶體碎片。[5]
- /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"分別表示:[6]
"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不支援超執行緒.[7]
- /proc/crypto, 可利用的加密模組列表
- /proc/devices, 字元裝置與塊裝置列表,按照裝置ID排序,但給出了/dev名字的主要部分
- /proc/diskstats, 給出了每一塊邏輯磁碟裝置的一些資訊
- /proc/filesystems, 當前時刻核心支援的檔案系統的列表
- /proc/interrupts, /proc/iomem, /proc/ioports, /proc/irq, 裝置的一些與中斷、主記憶體訪問有關的資訊
- /proc/kmsg, 用於跟蹤讀取核心訊息 [8]
- /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
參考
- ^ proc(4) manual page. [2011-01-05]. (原始內容存檔於2012-02-19).
- ^ procfs:已是过去式但仍未被遗忘. [2011-03-21]. (原始內容存檔於2011-04-05).
- ^ Amit Singh. /proc on Mac OS X. Mac OS X Internals: The Book. 2003 [2021-07-10]. (原始內容存檔於2012-05-04).
- ^ linprocfs(5). FreeBSD Manual Pages. The FreeBSD Project. 2019-11-13 [2021-06-12]. (原始內容存檔於2021-06-12) (英語).
- ^ 3.2.2. /proc/buddyinfo. centos.org. [2016-10-02]. (原始內容存檔於2013-09-02).
- ^ Baron, Jason. HT vs. dual-core. [2016-10-02]. (原始內容存檔於2016-05-13).
- ^ Understanding Linux /proc/cpuinfo. richweb.com. [2015-04-21]. (原始內容存檔於2012-04-03).
- ^ Nguyen, Binh. Linux Filesystem Hierarchy. Binh Nguyen: 63. 2004-07-30 [2016-07-18]. (原始內容存檔於2016-12-14).
/proc/kmsg[:] Messages output by the kernel. These are also routed to syslog.
- Red Hat, Inc. Tips & Tricks Featured Article: /proc/meminfo Explained, March 2003.(頁面存檔備份,存於網際網路檔案館)