BlobFS 是可當做內容定址的檔案系統,已針對一次寫入最佳化。 經常讀取的檔案,例如二進位檔和程式庫在 Fuchsia 中,BlobFS 是 用於所有軟體套件的儲存系統
掛接時,BlobFS 會顯示單一邏輯目錄,當中包含所有檔案 (又稱為 blob):
blob/
├── 00aeb9b5652a4adbf630d04a6ca22668f9c8469746f3f175687b3c0ff6699a49
├── 01289d3e1d2cdbc7d1b4977210877c5bbdffdbad463d992badc149152962a205
├── 018951bcf92091fd5d294cbd1f3a48d6ca59be7759587f28077b2eb754b437c0
└── 01bad8536a7aee498ffd323f53e06232b8a81edd507ac2a95bd0e819c4983138
BlobFS 中的檔案如下:
- 不可變動:blob 建立後即無法修改 (移除除外)。
- Content-Addressable:Blob 名稱確定是衍生自 內容。
- 已驗證:系統會使用加密編譯檢查碼確保 blob 的完整性 資料。
這些 blob 的屬性使 BlobfS 成為 Fuchsia 安全性的重要元件 確保軟體套件內容可以直接驗證 新的 Pod
設計和實作 BlobFS
磁碟上格式
BlobFS 會將每個 blob 儲存在非相鄰範圍的連結清單中 (連續 資料區塊的範圍)。每個 blob 都有相關聯的 Inode,其中會說明 區塊資料會從磁碟開始,並啟動 blob 的其他中繼資料。
BlobFS 將磁碟 (或其中的分區) 分成五個區塊:
- 超級區塊:儲存整個檔案系統的中繼資料,
- Block Map 是一個點陣圖,用於追蹤免費和已分配的資料 方塊
- 「Node Map」:Inode 的扁平陣列 (參照 blob 資料的位置 會在磁碟中啟動) 或 ExtentContainers 部分 blob 資料)。
- 期刊,記錄確保檔案系統運作的檔案系統作業記錄 完整性。 和
- 資料區塊,其中 blob 內容及其驗證中繼資料 各個儲存範圍中
圖 1:BlobFS 磁碟配置
超級封鎖
超級區塊是 BlobFS 格式分區的第一個區塊。內容說明 其他檔案系統區塊的位置和大小 檔案系統層級的中繼資料
當掛接 BlobFS 格式的檔案系統時,此區塊會對應至記憶體 來判定檔案系統的其餘部分位於何處區塊是 會經過修改,只要建立新的 blob,以及 (適用於 FVM 管理的 BlobFS 執行個體) 每當 BlobFS 檔案系統大小縮減或成長時,系統就會傳送快訊。
圖 2:BlobFS 超級區塊
當 BlobFS 由 FVM 管理時,超區塊包含一些額外的中繼資料 說明包含 BlobFS 檔案系統的 FVM 配量。這些欄位 如果是非 FVM 和固定大小的 BlobFS 映像檔,系統會忽略 (上圖中的黃色)。
區塊地圖
區塊地圖是一種簡單的點陣圖,會將每個資料區塊標示為已配置或 而不是這張地圖在區塊分配期間使用,找出 稱為 extents 區塊的區塊,用於儲存 blob 內容。
圖 3:包含數個免費範圍的區塊地圖範例。
掛接 BlobFS 映像檔時,區塊地圖會對應至記憶體,其中可 就會由區塊分配器讀取每當 區塊分配 (在建立 blob 時) 或取消分配 (在 blob 刪除期間)。
節點對應
節點對應是檔案系統上所有節點的陣列,可分為 變化版本:
- 「Inodes」,描述檔案系統中的單一 blob,或
- ExtentContainers,指向包含 blob 部分部分的範圍 資料。
這兩種類型的節點會一起儲存在單一扁平陣列中。每個節點都有 說明節點的類型,以及節點 兩個節點類型的大小相同,因此沒有內部 陣列的分段。
節點數
檔案系統中的每個 blob 都有對應的 Inode 性質,也就是描述 blob 的資料會啟動,以及一些關於 blob 的其他中繼資料。
圖 4:BlobFS Inode 的版面配置。
就小型 blob 而言,Inode 可能是唯一說明
blob 位在磁碟中。此時,extent_count
為一個,就不能使用 next_node
inline_extent
則說明 blob 的單一範圍。
較大的 blob 可能會有多個範圍,尤其是在片段化時
BlobFS 圖片。在這種情況下,blob 的第一個範圍會儲存在
inline_extent
的所有後續範圍都會儲存在
next_node.
起的 ExtentContainer
圖 5:極端格式 (佔用 64 位元)。此格式都用在 Inodes 和 ExtentContainers
請注意,這個範圍表示一個程度 包含 2**16 個區塊 (最大大小值)。
ExtentContainers
ExtentContainer 保存了多個範圍 (最多 6 個) 的參照,這些範圍會儲存 blob 的部分內容
ExtentContainer 中的範圍在邏輯上是連續的 (即
儲存在 extents[0]
中的定定 blob 區塊位於 extents[1]
之前),且
填入各個字詞如果設定了 next_node
,則 ExtentContainer 必須已滿。
圖 6:BlobFS ExtentContainer 的版面配置。
節點連結清單的屬性
blob 的範圍儲存在單一 Inode 的連結清單中 (其中包含 第一個範圍) 以及零或多個 ExtentContainers 範圍)。
這份連結清單包含下列資源。違反下列任一屬性 會導致 blobf 將 blob 視為毀損。
- 極端是邏輯連續:
- 如果在清單中節點 A 之前,節點 A 位於節點 B 之前,則節點 A 中的所有範圍都必須 較低的邏輯偏移寫入 blob 的內容中。
- 在指定 ExtentContainer 中,範圍 x 和 y 表示,如果 x <Y,然後 x 對 blob 內容進行比範圍更相關的邏輯偏移值更低 Y 鍵。
- 系統會先封裝節點,再連結新節點。也就是說,如果節點
非空值
next_node
,則必須完整範圍 (*對於 Inode 而言為例外) 和 6 範圍 (適用於 ExtentContainers) - 連結清單中的範圍總數必須等於 Inode 的
extent_count
。 - 連結清單中的所有範圍大小總和必須等於
Inode 的
block_count
。 - 清單結尾會根據 I 節點中的
extent_count
決定 感到滿意最後一個節點中的next_node
不應使用。
範例節點版面配置
本節提供一些範例,說明 blob 節點可能採用的各種方式 格式化。
範例:單一極端 blob
圖 7:在單一範圍儲存的 blob 的節點版面配置
範例:多極端的 blob
圖 8:以多種範圍儲存的 blob 節點版面配置。請注意,blob 的 範圍可分散到整個磁碟中
Blob 片段化
新建立的 BlobFS 映像檔的所有資料區塊都是免費的,極端值 方便找出任意大小,而 blob 通常儲存在單一 或很大程度。
隨著 blob 的配置和取消配置,隨著時間的推移,區塊地圖 分割成許多較小的範圍。新建立的 blob 必須 多個儲存的資料
圖 9:片段化的區塊地圖。雖然自由塊有很多,但 可用的範圍相當多
不適合使用片段化的原因如下:
- 較慢讀取:讀取片段的 blob 時,必須在 節點對應功能。這會影響循序讀取和隨機存取讀取
- 縮短建立及刪除速度:建立 blob 時,必須空出尋找 適用範圍;如果必須找到許多小範圍,則花費的時間會更長。 同樣地,刪除片段的 blob 也會需要處理 範圍
- 中繼資料負擔:儲存切割 blob 時需要更多節點。有 節點對應中的節點數量有限,並可隨時用盡 可防止建立 blob
目前 BlobFS 不會執行資料重組。
日誌
待辦事項
資料區塊
最後,blob 的實際內容必須儲存在其他位置。 BlobFS 映像檔的剩餘儲存空間區塊已為此指定。
每個 blob 分配到足夠的範圍,以包含其所有資料, 為儲存 blob 驗證中繼資料而保留的資料區塊數量。 這項中繼資料一律會儲存在 blob 的第一個區塊中。中繼資料為 添加邊框,因此實際資料一律會從區塊對齊地址開始。
這項驗證中繼資料稱為「Merkle Tree」,這種資料結構 使用加密編譯雜湊來確保 blob 內容的完整性。
梅克爾樹
blob 的 Merkle Tree 的建構方式如下 (詳情請參閱 Fuchsia Merkle Roots):
- 每個分葉節點都是單一區塊資料的 sha256 雜湊。
- 每個非分葉節點都是結合其子項雜湊的 sha256 雜湊。
- 樹狀結構會在只有一個 SHA256 雜湊的層級終止。
最頂層節點的雜湊值稱為 blob 的「Merkle Root」。 這個值會做為 blob 的名稱。
圖 10:簡化的範例 Merkle Tree。請注意 包括區塊偏移和 而每個非分葉節點也明顯更寬 (特別是每個 非分葉節點最多可包含 8192 個 / 32 == 256 個子項。
實作 BlobFS
BlobFS 和其他 Fuchsia 檔案系統一樣,是以使用者空間程序的形式實作 透過 FIDL 介面為用戶端提供服務