垃圾回收 (GC) 是从设备中移除“不必要”的 blob 的过程。通常执行此操作是为了释放磁盘空间,以便解析新的临时软件包或进行 OTA(在内部使用软件包解析)。
如何触发
GC 由 pkg-cache 实现,并通过 fuchsia.pkg.garbagecollector/Manager.GC 公开相应功能。
您可以通过运行 fx shell pkgctl gc 手动触发该作业。
在 OTA 期间,系统更新程序会在各个点自动触发(如果需要)。
它由工程 build 使用的更新检查器 system-update-checker 自动触发(如果需要)。
算法
当前算法基于 Open Package Tracking RFC 提出的设计。
定义
- 基础套餐
- “基本”或“system_image”软件包(通过启动实参中的哈希进行标识)及其
data/static_packages文件中列出的软件包(通过哈希进行标识)。 - 通常旨在提供运行特定配置所需的最小软件包集。
- “基本”或“system_image”软件包(通过启动实参中的哈希进行标识)及其
- 缓存软件包
- “基本”软件包的
data/cache_packages.json文件中列出的软件包(按哈希值)。 - 我们希望在没有网络的情况下使用但仍希望能够临时更新的软件包的概念。
- “基本”软件包的
- 打开软件包
- 软件包目录当前正由 pkg-cache 提供服务的软件包
- 写作指数
- 目前正在作为解析的一部分写入 blob 的软件包
- 留存指数
- 在 OTA 期间下载并用于 OTA 流程或对下一个系统版本必需的软件包。
- 在 OTA 过程中由 system-updater 操纵,以满足 OTA 存储空间要求。
- 软件包 blob
- 软件包所需的所有 blob。
- meta.far 和内容 blob,以及所有子软件包的软件包 blob(以递归方式)。
- 根据此定义,保护软件包免受垃圾回收的保护也适用于其所有子软件包。子软件包本身可能受保护,也可能不受保护,具体取决于超级软件包提供的保护。
实现
- 如果当前启动分区未被标记为健康,则失败,以避免在回退时删除之前系统所需的 blob
- 确定所有常驻 blob 的集合,
Br - 锁定写入和保留的索引
- 确定所有受保护 blob 的集合
Bp,即所有以下软件包的软件包 blob:- 基础软件包
- 缓存软件包
- 打开软件包
- 编写索引软件包
- 保留的索引软件包
- 删除差集
Br - Bp的 blob - 解锁“写作”和“保留”指数