使用 Btrfs – 一般概念

本文是深入研究 Btrfs 的系列文章的一部分。 自 Fedora Linux 33 以來,這是 Fedora Workstation 和 Fedora Silverblue 的默認文件系統。

介紹

文件系統是現代計算機的基礎之一。 它們是每個操作系統的重要組成部分,並且經常被忽視。 但是,像 Btrfs 這樣的現代文件系統提供了許多強大的功能,使使用計算機更加方便。 除了其他功能外,它們還可以透明地壓縮您的文件或為增量備份奠定堅實的基礎。

本文向您簡要概述了 Btrfs 文件系統的工作原理及其具有的一些功能。 它不會涉及許多技術細節或討論實現。 本系列後面的文章中包含對一些突出功能的更詳細解釋。

什麼是文件系統?

如果您以前聽說過文件系統在最基本的層面上是如何工作的,那麼這對您來說並不陌生,您可以跳到下一節。 否則,請繼續閱讀文件系統首先做什麼的簡要介紹。

簡而言之,文件系統允許您的 PC 找到它存儲在磁盤上的數據。 這聽起來像是一項微不足道的任務,但從本質上講,當今任何類型的非易失性存儲設備(例如 HDD、SSD、SD 卡等)在很大程度上仍然是 1970 年代 PC 發明時的樣子:一個(巨大的)存儲塊集合。

塊是最細粒度的可尋址存儲單元。 您 PC 上的每個文件都存儲在一個或多個塊中。 塊的大小通常為 4096 字節。 這取決於您擁有的硬件和其上的軟件(即文件系統)。

文件系統使我們能夠在大量可用的存儲塊中找到文件的內容。 這是通過所謂的 inode 完成的。 inode 包含有關特殊格式存儲塊中文件的信息。 這包括文件的大小、在哪裡可以找到構成文件內容的存儲塊、它的訪問規則(即,誰可以讀取、寫入或執行文件)等等。

下面是一個例子:

文本文件“myfile.txt”及其在磁盤上的假設示例。 所有方塊都是單獨的存儲塊。

inode 的結構對文件系統的功能有重大影響,使其成為任何文件系統的核心數據結構之一。 為此,每個文件系統都有自己的 inode 結構。 如果您想了解更多相關信息,請查看下面鏈接的 Btrfs 文件系統 inode 結構

. 更詳細的解釋各個字段的含義,可以參考ext4文件系統inode結構

.

寫時復製文件系統

例如,與 ext4 相比,Btrfs 的突出特點之一是它是一個 CoW(寫時復制)文件系統。 當一個文件被更改並寫回磁盤時,它不會被有意地寫回到它之前的位置。 相反,它被複製並存儲在驅動器上的一個全新位置。 從這個意義上講,將 CoW 視為一種“重定向”可能更容易,因為文件寫入被重定向到不同的存儲塊。

這似乎是一種浪費,但實際上並非如此。 這是因為無論文件系統如何工作,在任何情況下都必須將更改的數據寫回磁盤。 Btrfs 只是確保將數據寫入先前空出的塊,因此舊數據保持不變。 唯一真正的缺點是這種行為會比其他文件系統更快地導致文件碎片。 在常規桌面使用場景中,您不太可能注意到差異。

CoW的優勢是什麼? 簡單來說:可以保留修改和編輯文件的歷史記錄。 Btrfs 會將對以前文件版本(索引節點)的引用保留在易於訪問的位置。 此引用是一個快照:文件系統在某個時間點的狀態圖像。 這將是本系列中另一篇文章的主題,因此暫時保留在那裡。

除了保留文件歷史記錄之外,CoW 文件系統始終處於一致狀態,即使之前的文件系統事務(例如寫入文件)由於斷電等原因未完成也是如此。 這是因為文件系統元數據更新也是 CoW:文件系統本身永遠不會被覆蓋,因此中斷不能使其處於部分寫入狀態。

文件的寫時復制

您可以將文件名視為指向它們所屬文件的 inode 的指針。 寫入文件時,Btrfs 會創建修改後文件內容(數據)的副本,以及一個新的 inode(元數據),然後將其文件名指向這個新的 inode。 舊的 inode 保持不變。 這是另一個假設的例子來說明這一點:

上面示例的延續:添加了 3 個字節的數據

這裡“myfile.txt”添加了三個字節。 傳統的文件系統會更新中間的“數據”塊以包含新內容。 CoW 文件系統保持舊塊完好無損(變灰)並將更改的數據和元數據寫入(複製)到新的地方。 重要的是要注意,僅複製更改的數據塊而不是整個文件。

如果沒有更多未使用的塊來寫入新內容,Btrfs 將從舊文件版本佔用的數據塊中回收空間(除非它們是快照的一部分,請參閱本系列後面的內容)。

文件夾的寫時復制

從文件系統的角度來看,文件夾是一種特殊類型的文件。 與普通文件不同,文件系統直接解釋底層內容。 一個文件夾有一些與之關聯的元數據(一個 inode,如上面的文件所示),用於管理訪問權限或修改時間。 在最簡單的情況下,存儲在文件夾中的數據(所謂的“目錄條目”)是一個 inode 引用列表,其中每個 inode 本身就是另一個文件或文件夾。 然而,現代文件系統在目錄條目中至少存儲一個文件名,以及對相關文件的 inode 的引用。

之前註意到寫入文件會創建先前 inode 的副本並相應地修改內容。 本質上,這會生成一個與其前身無關的新 inode。 為了使修改後的文件出現在文件系統中,所有包含對它的引用的目錄條目也被更新。

這是一個遞歸過程! 由於文件夾本身就是一個帶有 inode 的文件,因此修改它的任何文件夾條目都會為文件夾文件創建一個新的 inode。 這種遞歸發生在整個文件系統樹中,直到它到達文件系統的根。

在未來的文章中會有什麼期待因此,只要保留對任何舊目錄的引用而不是刪除或覆蓋,就可以在其先前狀態遍歷文件系統樹。 同樣,這正是快照所做的。

  • Btrfs 不僅僅是一個 CoW 文件系統。 它的目標是實現“高級功能,同時還注重容錯性、可修復性和易於管理”(參見
  • ). 本系列的後續文章將特別關注這些功能:
  • 子卷:文件樹中的文件樹
  • 快照——時光倒流

RAID:替換您的 mdadm 配置壓縮:透明存儲節省空間Qgroups:限製文件系統的大小

這不是 Btrfs 功能的詳盡列表。 有關可用功能的完整概述,請參閱 Wiki

來源和文件
https://btrfs.wiki.kernel.org/index.php/Data_Structures#btrfs_inode_item.
https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Inode_Table結論
https://btrfs.readthedocs.io/en/latest/Introduction.html我希望我已經激發了您了解 PC 文件系統的興趣。 到目前為止,如果您有任何疑問,請對您的想法發表評論,以便在以後的文章中進行討論。 同時,請隨意研究文中鏈接的資源。 如果您偶然發現了您覺得特別有趣的 Btrfs 功能,也請在下方添加評論。 如果對特定主題有足夠的興趣,我可能會在該系列中添加一篇文章。 下篇文章見!

https://btrfs.wiki.kernel.org/index.php/Main_Page