Linux 中的虛擬文件系統:為什麼需要它們以及它們如何工作? 第1部分

大家好! 我們繼續為您已經愛上的課程推出新的課程,現在我們急於宣布我們正在啟動一組新的課程 《Linux 管理員》將於四月底推出。 本次活動將有一份新出版物的日期。 使用原始材料,您可以 在這裡閱讀.

虛擬文件系統是一種神奇的抽象,它允許 Linux 的哲學說“一切都是文件”。

Linux 中的虛擬文件系統:為什麼需要它們以及它們如何工作? 第1部分

什麼是文件系統? 基於 Linux 最早的貢獻者和作者之一的話 羅伯塔·拉瓦,“文件系統是根據特定結構組裝的數據的分層存儲。” 儘管如此,這個定義同樣適合 VFAT(虛擬文件分配表)、Git 和 卡桑德拉 (NoSQL數據庫)。 那麼“文件系統”到底是什麼定義的呢?

文件系統基礎知識

Linux 內核對可被視為文件系統的實體有一定的要求。 它必須實現方法 open(), read() и write() 對於有名稱的持久對象。 從面向對象的角度來看 程式設計,內核將通用文件系統定義為抽象接口,而這三個大函數被認為是“虛擬的”,沒有具體的定義。 因此,默認的文件系統實現稱為虛擬文件系統(VFS)。

Linux 中的虛擬文件系統:為什麼需要它們以及它們如何工作? 第1部分

如果我們可以打開、讀取和寫入一個實體,那麼該實體就被視為一個文件,正如我們從上面控制台的示例中看到的那樣。
VFS 現像只是強調了類似 Unix 的觀察“一切都是文件”。 想想上面那個 /dev/console 的小例子展示了控制台的實際工作原理是多麼奇怪。 圖為交互式 Bash 會話。 將字符串發送到控制台(虛擬控制台設備)會將其顯示在虛擬屏幕上。 VFS 還有其他甚至更奇怪的特性。 例如,它允許您通過以下方式搜索 .

諸如 ext4、NFS 和 /proc 等熟悉的系統在 C 數據結構中具有三個重要函數,稱為 文件操作。 此外,某些文件系統以熟悉的面向對象的方式擴展和重新定義了 VFS 功能。 正如 Robert Love 指出的那樣,VFS 抽象允許 Linux 用戶輕鬆地將文件複製到第三方操作系統或抽象實體(例如管道),而無需擔心其內部數據格式。 在用戶端(用戶空間),使用系統調用,進程可以使用以下方法從文件複製到內核數據結構 read() 一個文件系統然後使用該方法 write () 用於數據輸出的另一個文件系統。

屬於基本 VFS 類型的函數定義位於文件中 文件系統/*.c 內核源代碼,而子目錄 fs/ 包含某些文件系統。 核心還包含實體,例如 cgroups, /dev и tmpfs,在啟動過程中需要,因此在內核子目錄中定義 init/。 請注意 cgroups, /dev и tmpfs 不要調用“三大”功能 file_operations,而是直接讀寫內存。
下圖顯示了用戶空間如何訪問 Linux 系統上通常安裝的不同類型的文件系統。 結構未顯示 pipes, dmesg и POSIX clocks,它也實現了結構 file_operations,通過VFS層訪問。

Linux 中的虛擬文件系統:為什麼需要它們以及它們如何工作? 第1部分

VFS 是系統調用和某些特定實現之間的“包裝層” file_operations例如 ext4 и procfs。 功能 file_operations 可以與設備驅動程序或內存訪問設備交互。 tmpfs, devtmpfs и cgroups 不使用 file_operations,而是直接訪問內存。
VFS 的存在提供了重用代碼的機會,因為與文件系統相關的基本方法不必由每種類型的文件系統重新實現。 代碼重用是軟件工程師的常見做法! 但是,如果可重用代碼包含 嚴重錯誤,所有繼承通用方法的實現都會受到它們的影響。

/tmp:簡單提示

檢測系統上是否存在 VFS 的一個簡單方法是輸入 mount | grep -v sd | grep -v :/,這將顯示所有已安裝的(mounted)非磁盤駐留且非 NFS 的文件系統,這在大多數計算機上都是如此。 列出的坐騎之一(mounts)VFS無疑 /tmp, 正確的?

Linux 中的虛擬文件系統:為什麼需要它們以及它們如何工作? 第1部分

大家都知道存儲 / tmp 在物理媒介上——瘋狂! .

為什麼不宜保存 /tmp 在物理媒體上? 因為文件在 /tmp 是臨時的,存儲設備比創建 tmpfs 的內存慢。 此外,物理介質在被覆蓋時比內存更容易磨損。 最後,/tmp 中的文件可能包含敏感信息,因此使它們在每次重新啟動時消失是一項重要功能。

不幸的是,某些 Linux 發行版安裝腳本默認在存儲設備上創建 /tmp。 如果您的系統也發生這種情況,請不要絕望。 請遵循一些簡單的說明 Arch Wiki要解決此問題,請注意分配的內存 tmpfs 無法用於其他目的。 換句話說,一個擁有巨大 tmpfs 和大文件的系統可能會耗盡內存並崩潰。 另一個提示:編輯文件時 /etc/fstab,記住它必須以換行符結尾,否則你的系統將無法啟動。

/proc 和 /sys

除了 /tmp、Linux用戶最熟悉的VFS(虛擬文件系統)是 /proc и /sys。 (/dev 駐留在共享內存中並且沒有 file_operations)。 為什麼有這兩個組件? 我們來看看這個問題。

procfs 創建內核及其監視的進程的快照 userspace。 在 /proc 內核打印有關其可用內容的信息,例如中斷、虛擬內存和調度程序。 除了, /proc/sys 是命令配置參數的地方 sysctl, 可以用來 userspace。 各個進程的狀態和統計數據顯示在目錄中 /proc/.

Linux 中的虛擬文件系統:為什麼需要它們以及它們如何工作? 第1部分

這裡 /proc/meminfo 是一個空文件,但包含有價值的信息。

行為 /proc 文件顯示了 VFS 磁盤文件系統的不同之處。 一方面, /proc/meminfo 包含可以使用命令查看的信息 free。 另一方面,卻是空的! 它是如何工作的? 這種情況讓人想起題為“ 當沒人看月亮時,月亮還存在嗎? 現實與量子理論》由康奈爾大學物理學教授 David Mermin 於 1985 年撰寫。 事實上,當發出請求時,內核會收集內存統計信息 /proc,實際上在文件中 /proc 當沒人看的時候,什麼也沒有。 正如所說 梅爾敏,“基本量子學說表明,測量通常不會揭示被測量財產的預先存在的價值。” (並將有關月亮的問題視為家庭作業!)
看似空虛 procfs 這是有道理的,因為那裡的信息是動態的。 情況略有不同 sysfs。 讓我們比較一下有多少個至少為 XNUMX 字節大小的文件 /proc/sys.

Linux 中的虛擬文件系統:為什麼需要它們以及它們如何工作? 第1部分

Procfs 有一個文件,即導出的內核配置,這是一個例外,因為它只需要在每次啟動時生成一次。 另一方面,在 /sys 有許多較大的文件,其中許多佔用了整個內存頁。 通常文件 sysfs 與通過讀取文件獲得的信息表不同,僅包含一個數字或行 /proc/meminfo.

目標 sysfs - 提供內核調用的讀/寫屬性 «kobjects» 在用戶空間中。 唯一的目標 kobjects 是鏈接計數:當一個kobject的最後一個鏈接被刪除時,系統將恢復與其關聯的資源。 儘管如此, /sys 組成了大部分著名的 “用戶空間的穩定 ABI” 核心,在任何情況下都沒有人能夠做到這一點 “休息”。 這並不意味著 sysfs 中的文件是靜態的,這與不穩定對象的引用計數不一致。
內核的穩定 ABI 限制了可以出現的內容 /sys,而不是在那個特定時刻實際存在的內容。 列出 sysfs 中的文件權限可以深入了解設備、模塊、文件系統等的可配置設置。 可以配置或讀取。 合乎邏輯的結論是,procfs 也是內核穩定 ABI 的一部分,儘管在 文件.

Linux 中的虛擬文件系統:為什麼需要它們以及它們如何工作? 第1部分

文件位於 sysfs 描述每個實體的一個特定屬性,並且可以是可讀的、可寫的或兩者兼而有之。 文件中的“0”表示SSD無法移除。

讓我們從如何使用 eBPF 和 bcc 工具監控 VFS 開始翻譯的第二部分,現在我們正在等待您的評論,並傳統上邀請您 開放網絡研討會,將於9月XNUMX日由我們老師舉辦—— 弗拉基米爾·德羅茲傑茨基.

來源: www.habr.com

添加評論