檔案系統與儲存

偽檔案系統(pseudo-filesystem,procfs/sysfs、tmpfs)

不是每個看起來像檔案的東西都由磁碟上的位元組支撐。當你讀 /proc/cpuinfo 看到你的 CPU 型號,或讀 /sys/class/net/eth0/statistics/rx_bytes 看到一個即時的封包計數,你正在用檔案介面——open、read、write——與核心本身對話,而非與儲存的資料對話。把非磁碟的東西呈現為檔案的檔案系統,就是偽檔案系統,它們是 Unix 最優雅的構想之一:一切皆檔案,所以核心狀態、裝置、甚至暫時的 RAM 儲存,都能用同樣熟悉的工具觸及。

有兩種風味要區分。像 procfs(掛載於 /proc)與 sysfs(掛載於 /sys)這樣的合成/資訊型偽檔案系統根本不含任何儲存的資料;每個檔案都是當場生成的。當你 open() 並 read() /proc/meminfo,核心當下執行一個函式、把目前的記憶體統計以文字產生出來——沒有任何磁碟上有 /proc,也沒有任何東西跨重開機而存續。procfs 揭露每行程與系統的資訊(每個執行中的行程一個數字命名的目錄,外加全域檔案),而 sysfs 把裝置與驅動模型揭露成一棵可巡覽的樹。相對地,tmpfs 是一個真正的、可讀寫的檔案系統,它儲存真實的檔案——但在 RAM 裡(由頁面快取與置換支撐)而非在磁碟上,這正是為何在 tmpfs 上的 /tmp 或 /dev/shm 很快、以及為何其中一切在重開機時消失。所有這些都透過真實磁碟檔案系統所用的同一個 VFS 介面插入核心;它們只是用計算、或用記憶體取代讀取區塊來實作檔案操作。

為何重要:偽檔案系統正是大量系統檢視與控制如何以普通指令發生的方式——cat /proc/loadavg 看負載、echo 一個值進一個 /sys 檔案來改一個裝置設定、df 看一個 tmpfs 填滿。誠實的提醒:一個 procfs/sysfs 檔案不是一個儲存的值、而是讀取時計算的即時視角,所以兩次讀取可能不同、而 stat 回報的大小常無意義(常是零)。而 tmpfs 計入 RAM(與置換),所以一個失控地寫入 /dev/shm 可能像任何其他配置一樣對記憶體施壓——它快,正是因為它其實不在磁碟上,連帶其所有的持久性後果。

$ cat /proc/loadavg # 讀取時生成、未存於任何地方 0.41 0.55 0.59 1/812 30421 $ stat -c %s /proc/cpuinfo # 對合成檔案而言大小無意義 0 $ mount | grep tmpfs tmpfs on /dev/shm type tmpfs # 真實的檔案,但在 RAM 裡——重開機即消失

procfs 檔案在讀取時計算(大小常為 0);tmpfs 持有真實檔案、但只在揮發性 RAM 裡。

一個 procfs/sysfs 檔案是讀取時計算的即時視角、而非儲存的資料——它回報的大小常為零、且兩次讀取可能不一致。tmpfs 則相反,它儲存真實檔案、但在 RAM(與置換)裡,所以它的內容在重開機時消失、它的用量計入記憶體而非磁碟。

又稱
virtual filesystem (in-memory)procfssysfstmpfs偽檔案系統虛擬檔案系統