垃圾收集

垃圾收集 (GC) 是指從裝置移除「不必要」的 Blob。通常是為了釋出磁碟空間,以便解析新的暫時性套件,或是為了 OTA (內部會使用套件解析)。

如何觸發

GC 由 pkg-cache 實作,透過 fuchsia.pkg.garbagecollector/Manager.GC 公開功能。

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

在 OTA 期間,系統更新程式會在各個時間點自動觸發這項作業 (如有必要)。

system-update-checker 會在必要時自動觸發這項作業,這是工程建構版本使用的更新檢查工具。

演算法

目前的演算法是以開放式包裹追蹤 RFC 提案的設計為基礎。

定義

  • 基本套裝組合
    • 「base」或「system_image」套件 (由啟動引數中的雜湊值識別),以及 data/static_packages 檔案中列出的套件 (由雜湊值識別)。
    • 通常是指執行特定設定所需的最低套件組合。
  • 快取套件
    • 「base」套件 data/cache_packages.json 檔案中列出的套件 (依雜湊)。
    • 從概念上來說,我們希望使用的套件不需要網路,但仍希望能夠暫時更新。
  • 開啟套裝組合
  • 撰寫索引
    • 目前正在寫入 Blob 的套件 (屬於解析程序的一部分)
  • 保留索引
    • 在 OTA 期間下載及使用,或下一個系統版本所需的套件。
    • 在 OTA 程序期間,由系統更新程式操控,以符合 OTA 儲存空間需求。
  • 套件 Blob
    • 套件所需的所有 Blob。
    • meta.far 和內容 Blob,以及所有子套件的套件 Blob (以遞迴方式)。
    • 根據這項定義,保護套件免於遭到垃圾收集,也會保護其所有子套件。子套件本身可能受到保護,也可能不受超級套件提供的保護措施保護。

實作

  1. 如果目前的開機磁碟分割區未標示為正常,則會失敗,以免刪除先前系統需要的 Blob,以防回溯
  2. 判斷所有常駐 Blob 的集合 Br
  3. 鎖定「寫入」和「保留」索引
  4. 找出所有受保護的 Blob 集合 Bp,也就是下列所有套件的套件 Blob:
    • 基本套裝方案
    • 快取套件
    • 開啟套件
    • 編寫索引套件
    • 保留的索引套件
  5. 刪除集合差異的 Blob Br - Bp
  6. 解鎖「寫入」和「保留」索引