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。