Apple 稀疏映像格式(ASIF)技术分析

Apple 稀疏映像格式(ASIF)技术分析

Apple 稀疏映像格式(ASIF)概述

Apple 的稀疏映像格式(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 位。位图中的一个字节覆盖 4 个块。由于位图本身占用一个块的大小,它每组覆盖 4 * chunk_size 个块。
  • 映射逻辑:要将虚拟偏移解析为物理块,系统计算表格索引、该表格内的相对块索引,然后考虑嵌入位图产生的“跳过”条目,以得到最终的 entry_index

元数据与约束

ASIF 在磁盘末端保留一小段空间用于元数据。头部中的 metadata_chunk 偏移通常指向接近最大理论磁盘大小(约 4 PiB 减去一个块)末端的区域。

该元数据块包含一个小头部,随后是 XML plist。该 plist 存储两个主要字典:

  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。此调整考虑了表格中交错的位图条目。

摘要: Apple 的 ASIF 是在 macOS 26 Tahoe 为 Virtualization 框架引入的稀疏虚拟磁盘格式,采用基于块的分配系统并嵌入位图以实现高效存储。

标题: Apple 稀疏映像格式(ASIF)技术分析

Sources