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 つの辞書が格納されます:

  1. 内部メタデータ: システムレベルの構成と状態。
  2. ユーザーメタデータ: ディスクイメージ用にユーザーが定義した属性。

ディスク解決の技術的サマリー

ASIF イメージから特定のオフセットを読み取る際のロジックは次の通りです:

  1. テーブル選択: table = directory.table(offset // size_per_table)
  2. 相対インデックス計算: block_size とテーブルの仮想オフセットに基づき relative_chunk_index を算出。
  3. グループ調整: 相対インデックスをグループあたりのチャンク数で割り、chunk_group を求める。
  4. 最終エントリ参照: entry_index = relative_chunk_index + chunk_group。この調整により、テーブル内に散在するビットマップエントリを考慮します。

Sources