Apple 稀疏映像格式(ASIF)技術分析
Apple 稀疏映像格式(ASIF)技術分析
Apple 稀疏映像格式(ASIF)概述
Apple 的稀疏映像格式(ASIF)是一種隨 macOS 26 Tahoe 推出的虛擬磁碟映像格式,專為 Virtualization 框架設計。ASIF 作為稀疏虛擬磁碟,透過僅為已寫入的資料分配空間,使大型磁碟能以較小的實體檔案表示,類似於 VMDK、VHDX 或 QCOW2 等格式。
ASIF 標頭結構
ASIF 檔案以結構化的標頭開始,定義磁碟的幾何資訊、版本以及關鍵分配資料的偏移。標頭使用大端序(big‑endian)位元組順序。
標頭欄位說明
| 欄位 | 型別 | 說明 |
|---|---|---|
header_signature |
uint32 |
檔案魔術字元('shdw') |
header_version |
uint32 |
格式版本 |
header_size |
uint32 |
標頭區段的大小 |
header_flags |
uint32 |
標頭專屬旗標 |
directory_offsets |
uint64[2] |
分配目錄的偏移位置 |
guid |
char[16] |
映像的唯一識別碼 |
sector_count |
uint64 |
虛擬磁碟目前的磁區數量 |
max_sector_count |
uint64 |
磁碟可增長的最大磁區數量 |
chunk_size |
uint32 |
資料區塊大小(通常為 1 MiB) |
block_size |
uint16 |
磁區/區塊大小(通常為 512 位元組) |
total_segments |
uint16 |
總段數 |
metadata_chunk |
uint64 |
元資料區塊的偏移 |
read_only_flags |
uint32 |
表示唯讀狀態的旗標 |
metadata_flags |
uint32 |
一般元資料旗標 |
metadata_read_only_flags |
uint32 |
專屬於元資料的唯讀旗標 |
分配與資料映射
ASIF 透過分層的目錄與表格系統將虛擬偏移映射到實體區塊。此架構透過維持多個目錄來支援原子更新;版本號最高的目錄被視為目前使用的目錄。
表格與條目系統
- 目錄與表格:目錄包含多個表格的清單,而每個表格則包含多個
uint64資料條目。 - 資料條目:每個條目指向 ASIF 檔案中的實體區塊。條目使用 55 位元表示區塊編號,另外 9 位元作為旗標。
- 條目旗標:
0b00:未初始化0b01:已完整初始化0b10:未映射0b11:具有位圖
區塊群組與位圖
與某些稀疏格式將位圖獨立存放不同,ASIF 直接在資料表內嵌入分配位圖。
- 區塊群組:資料條目被組織成「區塊群組」。每個群組由一組區塊條目,後接單一位圖條目組成。
- 位圖規格:位圖每個區塊使用 2 位元。位圖中的單一位元組可覆蓋 4 個區塊。因為位圖本身佔用一個區塊的大小,它每個群組可覆蓋
4 * chunk_size個區塊。 - 映射邏輯:為了將虛擬偏移解析為實體區塊,系統會計算表格索引、該表格內的相對區塊索引,並考慮嵌入位圖所產生的「跳過」條目,以取得最終的
entry_index。
元資料與限制
ASIF 在磁碟末端保留一小段空間作為元資料。標頭中的 metadata_chunk 偏移通常指向接近最大理論磁碟大小(約 4 PiB 減去一個區塊)末端的區域。
此元資料區塊包含一個小標頭,之後是一個 XML plist。該 plist 保存兩個主要字典:
- 內部元資料:系統層級的設定與狀態。
- 使用者元資料:使用者自訂的磁碟映像屬性。
磁碟解析的技術摘要
要從 ASIF 映像讀取特定偏移,會套用以下邏輯:
- 表格選取:
table = directory.table(offset // size_per_table) - 相對索引:根據
block_size與表格的虛擬偏移計算relative_chunk_index。 - 群組調整:將相對索引除以每群組的區塊數,以取得
chunk_group。 - 最終條目查找:
entry_index = relative_chunk_index + chunk_group。此調整考慮了表格中交錯的位圖條目。
摘要: Apple 的 ASIF 是在 macOS 26 Tahoe 為 Virtualization 框架推出的稀疏虛擬磁碟格式,採用基於區塊的分配機制,並內嵌位圖以提升儲存效率。
標題: Apple 稀疏映像格式(ASIF)技術分析