GBL 배포

이 페이지에서는 일반 부트로더 (GBL) 바이너리를 배포하는 방법을 설명합니다.

부팅 펌웨어 요구사항

GBL을 사용하려면 부팅 펌웨어가 다음 요구사항을 충족해야 합니다.

  • 통합 확장 가능 펌웨어 인터페이스 (UEFI) 규정 준수 펌웨어는 필수 UEFI 프로토콜을 구현하고 사용해야 합니다. 펌웨어는 정의된 UEFI 프로토콜을 사용하여 공급업체별 확장 프로그램을 허용해야 합니다.

  • 보안 펌웨어는 Android 자체 검사 부팅 (AVB)의 모든 요구사항을 구현하여 GBL이 부팅 이미지를 인증할 수 있도록 해야 합니다.

  • 부팅 모드 바이너리는 일반 부팅, 복구 부팅, 빠른 부팅과 같은 다양한 부팅 모드를 처리할 수 있어야 합니다.

  • 동적 파티셔닝 부팅 펌웨어는 올바른 A/B 부팅 슬롯을 읽을 수 있고 슈퍼의 동적 파티션 및 사용자 데이터와 호환되도록 슬롯 선택 논리를 구현해야 합니다.

  • OS 구성입니다. 펌웨어는 기기를 부팅하는 데 필요한 OEM 맞춤설정으로 커널 명령줄과 기기 트리 (DTB), bootconfig를 수정할 수 있어야 합니다.

  • 보호된 VM 로드 바이너리는 보호된 VM이 있는 경우 Android 커널 전에 사전 검증된 보호 VM 펌웨어를 올바르게 로드해야 합니다. 자세한 내용은 Microdroid 부팅 시퀀스를 참고하세요.

  • 메모리 관리 부팅 펌웨어는 UEFI 메모리 할당 API를 지원해야 합니다.

구현 요구사항

기기에 GBL이 올바르게 구현되려면 다음 요구사항을 충족해야 합니다.

  • 기기에는 SOC에서 액세스할 수 있는 블록 기기에 android_esp_aandroid_esp_b라는 이름이 지정된 4MB 이상의 FAT32 파티션이 두 개 포함되어야 합니다.

    • 블록 기기는 블록 단위로 읽거나 쓸 수 있는 저장장치입니다. UFS, eMMC, SD 카드 기기 등이 그 예입니다.
    • FAT32는 어디에나 있고 간단한 파일 시스템이므로 사용됩니다.
    • 두 파티션 모두 이 Android 버전의 지원 기간 동안 무선 업데이트 (OTA) 및 롤백에 필요합니다.
    • GBL은 비압축 상태에서 약 2MB입니다. 4MB는 향후 7년간 추가 기능으로 인한 성장을 고려하기에 충분합니다.
    • GBL 업데이트의 경우 전체 android_esp_${SLOT_SUFFIX} 파티션을 업데이트해야 합니다. GBL 전용 업데이트는 Android OTA에서 지원되지 않습니다.
  • 배포된 GBL 버전은 해당 GBL 출시 브랜치의 최신 인증 프로덕션 빌드여야 합니다. 선호하는 서명 솔루션을 사용하여 Google 인증 GBL 사본에 서명하고 결과 빌드와 서명 메타데이터를 android_esp_${SLOT_SUFFIX} 파티션 내에 저장하는 것이 좋습니다.

    • GBL 인증서는 OEM 서명으로 그대로 유지해야 하며 바이너리에 적용된 헤더가 없어야 합니다.
    • 개발자 GBL 빌드는 개발 및 디버그 목적으로만 사용됩니다. 빌드를 제공할 수 없으며 Google에서 인증하지 않습니다.
  • GBL은 FAT32 파티션 내의 /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 ...
    

    Android를 직접 부팅하는 대신 이 cvd start 명령어는 UEFI 앱을 사용하여 Android를 부팅합니다.

버그 신고 및 부트로더팀에 문의

GBL의 버그를 신고하려면 Buganizer의 Android 일반 부트로더 구성요소로 이동하세요.

궁금한 점이 있으면 GBL팀에 문의하거나 android-gbl@google.com로 이메일을 보내세요.