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 存储两个主要字典:
- 内部元数据:系统级配置和状态。
- 用户元数据:用户为磁盘映像定义的属性。
磁盘解析的技术摘要
要从 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)技术分析