Fuchsia 中的 BlobFS 檔案系統會公開壓縮檔案,以便儲存 磁碟空間BlobFS 支援多種不同的壓縮策略, zstd 為預設值。
檔案壓縮的其中一個缺點,是它可以防止隨機存取 檔案。針對大部分的壓縮演算法,完整內容都必須讀取 以存取單位元組
對 BlobFS 而言,是在要求分頁檔案時,這是一項特殊的挑戰。廣告需求來源 分頁可讓檔案部分載入記憶體,以節省系統 記憶體用量完整檔案壓縮功能會造成檔案無法部分載入,
塊狀壓縮格式和程式庫 Fuchsia 將壓縮檔案拆解成可以獨立使用的影格 解壓縮。如此一來,BlobFS 即可實作壓縮檔案的需求分頁, 因為檔案可以部分載入及解壓縮。
本文件會說明區塊壓縮格式和 解釋它在 Fuchsia 中的用途。
設計目標與非目標
設計區塊壓縮時,請考量以下目標 格式和程式庫:
隨機存取解壓縮。因此必須能夠單獨處理 不需要解壓縮整個檔案。
彈性的解壓縮 API。這個程式庫旨在提供 以便客戶精細控管 擷取的影格速率這支援需求分頁等用途 用戶端 (BlobFS) 可取得有關存取模式的詳細資訊,且 具有控制預先讀取功能以及解壓縮特定影格,以精準地預先擷取內容。
相比之下,更代管的 API 會隱藏 影格包含哪些已解壓縮位元組。
可設定的影格大小。必須可以調整 資料框架,以配合不同用途 Google Cloud 就是最佳選擇
彈性壓縮版面配置:這種格式可支援更多異國情調的邊框 版面配置,例如:影格大小不統一或影格對齊 配合日後需要 靈活彈性舉例來說 將相互讀取的資料歸為一組,藉此進行本地性 或更大型的影格速率
與 zstd 相比的壓縮比率。 因為 zstd 是 BlobFS 目前預設的壓縮演算法, 此文件寫入時間,zstd 壓縮率是基準 要對區塊壓縮程式庫進行基準測試負擔 因此,您幾乎必須盡量減少使用影格和額外中繼資料。
可設定的壓縮積極程度。必須能夠 反之,壓縮速度較慢,且壓縮率較高。
跨平台程式庫。用來壓縮及解壓縮的程式庫 區塊壓縮封存檔必須能在 Fuchsia 和 編譯主機 (例如 Linux),以便在建構作業中使用程式庫 工具鍊。這是在建構期間壓縮檔案的必要步驟,例如 。
以下是非目標:
- 與 zstd 的格式層級相容性。區塊壓縮封存檔 格式不適用於 zstd 和一般 zstd 工具 不適用於區塊壓縮封存檔。
區塊壓縮
封存格式
區塊封存內容包含一個標頭,後面接著零或多個 zstd 影格。
標頭
標頭說明封存檔的格式,其中包含的跳轉表格 會將壓縮影格對應至已解壓縮的空間。
0 1 2 3 4 5 6 7
+-----+-----+-----+-----+-----+-----+-----+-----+
0 | Magic Number |
+-----+-----+-----+-----+-----+-----+-----+-----+
8 | Version | Reserved | Num Frames | // Reserved must be zero.
+-----+-----+-----+-----+-----+-----+-----+-----+
16 | Header CRC32 | Reserved | // Reserved must be zero.
+-----+-----+-----+-----+-----+-----+-----+-----+
24 | Reserved | // Reserved must be zero.
+-----+-----+-----+-----+-----+-----+-----+-----+
32 | |
40 | Seek Table |
48 | Entry |
56 | |
+-----+-----+-----+-----+-----+-----+-----+-----+
.. | |
.. | Seek Table |
.. | Entry |
.. | |
+-----+-----+-----+-----+-----+-----+-----+-----+
「Header CRC32」會根據整個標頭計算,包括跳轉 表格。
搜尋表格
每個搜尋資料表項目都代表壓縮中連續範圍的資料 空間,以及其展開在解壓縮資料中的哪個位置。
+-----+-----+-----+-----+-----+-----+-----+-----+
0 | Decompressed Offset |
+-----+-----+-----+-----+-----+-----+-----+-----+
8 | Decompressed Size |
+-----+-----+-----+-----+-----+-----+-----+-----+
16 | Compressed Offset |
+-----+-----+-----+-----+-----+-----+-----+-----+
24 | Compressed Size |
+-----+-----+-----+-----+-----+-----+-----+-----+
在解壓縮空間中,跳轉資料表項目是連續的,但可能包含 不連續。以便支援彼此對齊及 對輸出檔案的填補,以改善儲存空間存取效率。
跳轉表格最多可包含 1023 個項目 (會產生 32KiB 標頭) 和 必須包含至少 1 個項目 (會產生 64 位元組的標頭)。一般而言, 壓縮影格會立即顯示在跳轉表中 (但該格式支援 壓縮影格)。
跳轉資料表不變
I0:第一個跳轉資料表項目必須具有解壓縮的位移 0。
I1:第一個跳轉資料表項目的壓縮偏移值必須大於 或 都會根據標頭大小
I2:每個項目的解壓縮偏移必須等於 前一個影格 (亦即前一個影格的解壓縮偏移 + 長度)。
I3:每個項目的壓縮偏移值必須大於或等於結尾 (即前一個影格經過壓縮) 偏移 + 長度)。
I4:每個項目的解壓縮和壓縮長度均不得為零。
I5:不得超出檔案的結尾。
經過壓縮的影格
檔案中的每個壓縮影格都是一般的 zstd 壓縮影格。給予 影格會對應至解壓縮檔案中的一些連續位元組區塊。
系統會忽略檔案中未涵蓋的位元組範圍。
系統不會要求每個資料影格都具有相同的解壓縮大小。 但目前的壓縮方式 大小均相同影格大小可在壓縮期間設定。
隨機存取解壓縮
這個跳轉資料表可用來查詢包含指定解壓縮的影格 範圍。要求解壓縮檔案中的指定範圍時,系統會提供一或多個 壓縮過的影格必須載入並解壓縮。
以下列包含三個影格的檔案為例:
Decompressed Space Compressed Space
+-----------------+ +--------------+
| | <-------- | |
| | | +--------|
| | +-----+ |
+-----------------+ +------ | |
| | <-+ +--------------+
| | +-- | |
| | | +--------------=
+-----------------+ |
| | <-----+
| +---------|
+-------+
存取單一影格內的位元組範圍,只需要解壓縮其 對應的壓縮框:
Decompressed Space Compressed Space
+-----------------+ +--------------+
| | <-------- |xxxxxxxxxxxxxx|
| xxxxxxxx | |xxxxx+--------|
| | +-----+ |
+-----------------+ +------ | |
| | <-+ +--------------+
| | +-- | |
| | | +--------------=
+-----------------+ |
| | <-----+
| +---------|
+-------+
橫跨多個已解壓縮影格的範圍將需要解壓縮 多個壓縮影格:
Decompressed Space Compressed Space
+-----------------+ +--------------+
| | <-------- |xxxxxxxxxxxxxx|
| | |xxxxx+--------|
| xxx| +-----+xxxxxxxx|
+-----------------+ +------ |xxxxxxxxxxxxxx|
|xxxx | <-+ +--------------+
| | +-- | |
| | | +--------------=
+-----------------+ |
| | <-----+
| +---------|
+-------+
用於 BlobFS
在 BlobFS 中,檔案會使用區塊化壓縮程式庫壓縮,以便 協助隨機存取與需求分頁
目前,只有在已啟用需求分頁的情況下,系統才會使用隨機存取。有需求 已停用分頁功能,BlobFS 會先載入並解壓縮整個檔案 存取時,在記憶體中緩衝處理檔案。
啟用需求分頁後,BlobFS 會在部分檔案中延遲載入 允許或拒絕要求BlobFS 本身登錄為 pager zx_pager_create syscall。如果 系統會在 VMO 中存取非代表頁面,然後發生頁面錯誤,這時 BlobFS 控制代碼
BlobFS 會查詢含有目標頁面的已解壓縮框架,以及 就能解壓縮每個影格每個影格解壓縮後,系統就會驗證資料 提交完備權參與 VMO zx_pager_supply_pages syscall。