Apple Sparse Image Format (ASIF) Technical Analysis
Apple Sparse Image Format (ASIF) Technical Analysis
Apple Sparse Image Format (ASIF) の概要
Apple の Sparse Image Format (ASIF) は、macOS 26 Tahoe で導入された仮想ディスクイメージ形式で、Virtualization フレームワーク内での使用を目的としています。ASIF はスパース仮想ディスクとして機能し、書き込まれたデータに対してのみ領域を確保することで、物理ストレージ上の小さなファイルで大容量ディスクを表現します。これは VMDK、VHDX、QCOW2 形式に似ています。
ASIF ヘッダー構造
ASIF ファイルは、ディスクのジオメトリ、バージョン情報、重要な割り当てデータへのオフセットを定義する構造化ヘッダーから始まります。ヘッダーはビッグエンディアンのバイト順序を使用します。
ヘッダー フィールド定義
| フィールド | 型 | 説明 |
|---|---|---|
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 ビットを使用します。ビットマップの 1 バイトは 4 ブロックをカバーします。ビットマップ自体が 1 チャンク分のサイズであるため、1 グループあたり
4 * chunk_sizeブロックを表現します。 - マッピングロジック: 仮想オフセットを物理チャンクに解決するには、テーブルインデックス、テーブル内の相対チャンクインデックスを計算し、埋め込まれたビットマップによって「スキップ」されたエントリを考慮して最終的な
entry_indexを求めます。
メタデータと制約
ASIF はディスク末端に小さな領域をメタデータ用に予約しています。ヘッダーの metadata_chunk オフセットは、理論上の最大ディスクサイズ(約 4 PiB から 1 チャンクを引いたサイズ)に近い位置を指すことが多いです。
このメタデータブロックは小さなヘッダーと XML plist で構成されます。plist には主に 2 つの辞書が格納されます:
- 内部メタデータ: システムレベルの構成と状態。
- ユーザーメタデータ: ディスクイメージ用にユーザーが定義した属性。
ディスク解決の技術的サマリー
ASIF イメージから特定のオフセットを読み取る際のロジックは次の通りです:
- テーブル選択:
table = directory.table(offset // size_per_table) - 相対インデックス計算:
block_sizeとテーブルの仮想オフセットに基づきrelative_chunk_indexを算出。 - グループ調整: 相対インデックスをグループあたりのチャンク数で割り、
chunk_groupを求める。 - 最終エントリ参照:
entry_index = relative_chunk_index + chunk_group。この調整により、テーブル内に散在するビットマップエントリを考慮します。