垃圾收集

垃圾收集 (GC) 是指從裝置中移除「不必要的」blob 的程序。這項作業通常會執行釋出磁碟空間,以便解決新的暫時套件或連線到 OTA (在內部使用套件解析度)。

觸發方式

GC 是透過 pkg-cache 實作,會透過 fuchsia.space/Manager.GC 公開這項功能。

執行 fx shell pkgctl gc 即可手動觸發事件。

system-updater 會在 OTA 期間於不同時間點自動觸發 (如有必要)。

system-update-checker 會在必要時自動觸發快訊,「system-update-checker」是工程建構使用的更新檢查工具。

演算法

目前的演算法是以 Open Package Tracking RFC 提議的設計為基礎。

定義

  • 基本套件
    • 「base」或「system_image」套件 (以啟動引數中的雜湊識別) 和 data/static_packages 檔案中所列的套件 (透過雜湊)。
    • 通常為執行特定設定所需的最低套件組合。
  • 快取套件
    • 「base」套件 data/cache_packages.json 檔案中所列的套件 (依雜湊)。
    • 概念上,這是在沒有網路的情況下使用,但仍想要暫時更新的選項。
  • 開啟套件
  • 寫入索引
    • 正在解析為 blob 而正在寫入的套件
  • 保留的索引
    • 已於 OTA 下載,且會在 OTA 程序或下一個系統版本的必要套件。
    • 系統更新工具在 OTA 程序期間進行操控,確保符合 OTA 儲存空間需求。
  • 封裝 blob
    • 套件所需的所有 blob。
    • 以遞迴方式產生中繼 blob 和內容 blob,以及所有子套件的套件 blob。
    • 根據這個定義,保護來自 GC 的套件可保護其所有子套件。子套件本身為套件,不一定會與超套件提供的防護機制分開保護。

實作

  1. 如果目前的啟動分區未標示為健康,就會失敗,以免在備用時刪除先前系統所需的 blob
  2. 判斷所有常駐 blob 的組合 Br
  3. 鎖定讀寫索引
  4. 判斷所有受保護的 blob (Bp),也就是下列所有套件的套件 blob:
    • 基本套裝行程
    • 快取套件
    • 開啟套件
    • 編寫索引套件
    • 保留的索引套件
  5. 刪除集數差異 Br - Bp 的 blob
  6. 解鎖寫作與保留索引