GBL をデプロイする

このページでは、汎用ブートローダー(GBL)バイナリをデプロイする方法について説明します。

ブート ファームウェアの要件

GBL を使用するには、ブート ファームウェアが次の要件を満たしている必要があります。

  • Unified Extensible Firmware Interface(UEFI)に準拠していること。ファームウェアは、必要な UEFI プロトコルを実装して使用する必要があります。また、定義された UEFI プロトコルを使用して、ベンダー固有の拡張機能をサポートする必要があります。

  • セキュリティ。ファームウェアは、Android の確認付きブート(AVB)のすべての要件を実装し、GBL がブートイメージを認証できるようにする必要があります。

  • 起動モード。バイナリは、通常の起動、リカバリ起動、fastboot など、さまざまな起動モードを処理できる必要があります。

  • 動的パーティショニング。ブート ファームウェアは、正しい A/B ブートスロットの読み取りをサポートし、スーパー内の動的パーティションと userdata と互換性があるように、スロット選択ロジックを実装する必要があります。

  • OS 構成。ファームウェアは、デバイスの起動に必要な OEM カスタマイズを使用して、カーネル コマンドライン、デバイスツリー(DTB)、bootconfig を変更できる必要があります。

  • 保護された VM の読み込み。保護された VM が存在する場合、バイナリは Android カーネルの前に、事前に検証された保護された VM ファームウェアを正しく読み込む必要があります。詳細については、Microdroid 起動シーケンスをご覧ください。

  • メモリ管理。ブート ファームウェアは、UEFI メモリ割り当て API をサポートする必要があります。

実装の要件

デバイスに GBL を正しく実装するには、次の要件を満たす必要があります。

  • デバイスには、SOC からアクセス可能なブロック デバイスに、android_esp_aandroid_esp_b という名前の 8 MB 以上の 2 つの FAT パーティションが含まれている必要があります。

    • ブロック デバイスは、ブロック単位で読み書きできるストレージ デバイスです。UFS、eMMC、SD カード デバイスなどが該当します。
    • FAT は、ユビキタスでシンプルなファイル システムであるため使用されます。
    • FAT12、FAT16、FAT32 から、ニーズに合った FAT ファイル システムを選択することをおすすめします。
    • この Android バージョンのサポート期間中は、無線(OTA)アップデートとロールバックの両方のパーティションが必要です。
    • GBL は圧縮されていない状態で約 2 MB です。今後 7 年間の追加機能による増加を考慮すると、8 MB で十分です。
    • GBL のアップデートを行う場合は、android_esp_${SLOT_SUFFIX} パーティション全体を更新する必要があります。GBL のみのアップデートは Android OTA でサポートされていません。
    • 両方の FAT パーティションで使用されるパーティション タイプ GUID は、EFI システム パーティション GUID C12A7328-F81F-11D2-BA4B-00A0C93EC93B に対応している必要があります。
  • デプロイする GBL のバージョンは、対応する GBL リリース ブランチの最新の認定プロダクション ビルドである必要があります。推奨される署名ソリューションを使用して Google 認定の GBL のコピーに署名し、生成されたビルドと署名メタデータを android_esp_${SLOT_SUFFIX} パーティションに保存することをおすすめします。

    • GBL 証明書は OEM 署名によってそのまま残す必要があり、バイナリにヘッダーを適用することはできません。
    • デベロッパー GBL ビルドは、開発とデバッグのみを目的として使用されます。 ビルドをリリースすることはできず、Google の認定を受けることもできません。
  • GBL は、FAT パーティション内のパス /EFI/BOOT/BOOTAA64.EFI に保存する必要があります。

  • GBL をサポートするために、必要な UEFI プロトコルと Android UEFI プロトコルを実装します。これらのインターフェースがサポートされていない場合、GBL のプロダクション ビルドは起動できません。

    • EFI_BLOCK_IO_PROTOCOL または EFI_BLOCK_IO2_PROTOCOL は、ディスクからブートイメージと pvmfw イメージを取得します。
    • スタック カナリア、KASLR シード、RNG シード用の EFI_RNG_PROTOCOL
    • AVB と DICE の計算を行うためのスクラッチ メモリの割り当て用のメモリ割り当てサービス
    • EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL には no-op 実装のオプションがありますが、GBL はデフォルトでこのプロトコルを使用してログを記録します。
    • GBL_EFI_AVB_PROTOCOL は、公開鍵とロールバック インデックスにアクセスしてブートイメージを検証します。
    • GBL_EFI_BOOT_CONTROL_PROTOCOL は、ファームウェアからスロット メタデータと起動理由を取得します。
    • GBL_EFI_AVF_PROTOCOL は、DICE チェーンから AVF 構成データを生成します。
  • GBL を統合する際に強く推奨される UEFI プロトコルについては、 GBL UEFI プロトコルをご覧ください。

ブート ファームウェアのサポート

前のセクションの要件をサポートするために必要な変更を加えると、次の UEFI ファームウェア実装が GBL で動作します。

  • EDK2(Tianocore)。EDK2 は、一般的なオープンソースの UEFI 実装です。EDK2 ベースのブートローダーには GBL サポートが必要ですが、UEFI サポートはすでに存在します。
  • U-Boot。柔軟で広く使用されているオープンソースのブートローダー プロジェクトで、GBL の使用に向けて UEFI 互換性が向上しています。
  • LittleKernel(LK)。一部のベンダーで使用されているオープンソースのブートローダー。

GBL を実行する

ビルド済みの GBL バイナリを入手して実行することも、独自のバイナリをビルドして実行することもできます。

GBL バイナリを入手して実行する

GBL は単一の UEFI アプリ バイナリとして配布されます。Android の標準アップデート メカニズムを使用して、デバイスのベース ファームウェアとは別にこのバイナリを更新できます。

Android 16 以降で ARM-64 チップセットをベースにしたデバイスをリリースする場合は、Google によって認定された最新バージョンの GBL をデプロイし、起動チェーンに統合することを強く推奨します。

GBL をビルドする

GBL をビルドするには:

  1. repo ツールと Bazel ブートストラップがインストールされていることを確認します。

    sudo apt install repo bazel-bootstrap
    
  2. uefi-gbl-mainline マニフェスト ファイルを使用して、ソース管理用に現在のディレクトリを初期化します。

    repo init -u https://android.googlesource.com/kernel/manifest -b uefi-gbl-mainline
    repo sync -j16
    
  3. UEFI アプリをビルドします。

    tools/bazel run //bootable/libbootloader:gbl_efi_dist
    

Android 仮想デバイスで GBL をテストする

  1. Cuttlefish 内で GBL を実行します。

    cvd start --android_efi_loader=path_to_the_UEFI_app ...
    

    この cvd start コマンドは、Android を直接起動するのではなく、UEFI アプリを使用して Android を起動します。

バグを報告してブートローダー チームに連絡する

GBL のバグを報告するには、Buganizer の Android Generic Bootloader コンポーネントに移動します

ご不明な点がございましたら、GBL チーム(android-gbl@google.com)までメールでお問い合わせください。