GBL 배포

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

부팅 펌웨어 요구사항

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

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

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

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

  • 동적 파티션 나누기. 부팅 펌웨어는 올바른 A/B 부팅 슬롯 읽기를 지원하고 슈퍼의 동적 파티션 및 사용자 데이터와 호환되도록 슬롯 선택 로직을 구현해야 합니다.

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

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

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

구현 요구사항

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

  • 기기에는 SOC에서 액세스할 수 있는 블록 기기에 android_esp_aandroid_esp_b라는 이름의 8MB (또는 그 이상) FAT 파티션이 두 개 포함되어야 합니다.

    • 블록 기기는 블록 단위로 읽거나 쓸 수 있는 저장 기기입니다. 예로는 UFS, eMMC, SD 카드 기기가 있습니다.
    • FAT는 어디에나 있고 간단한 파일 시스템이므로 사용됩니다.
    • FAT12, FAT16, FAT32 중에서 필요에 맞는 FAT 파일 시스템을 선택하는 것이 좋습니다.
    • 두 파티션 모두 이 Android 버전의 지원 기간 동안 무선 (OTA) 업데이트 및 롤백에 필요합니다.
    • GBL은 압축되지 않은 상태에서 약 2MB입니다. 향후 7년간 추가 기능으로 인한 증가를 고려하기에 8MB는 충분합니다.
    • 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 경로에 저장해야 합니다.

  • 필수 UEFI 및 Android UEFI 프로토콜을 구현하여 GBL을 지원합니다. 이러한 인터페이스가 지원되지 않으면 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_EFI_VENDOR_GUID5a6d92f3-a2d0-4083-91a1-a50f6c3d9830으로 설정해야 합니다.

    • gbl_fw_api_level 은 공급업체 소프트웨어의 API 수준을 나타내는 플랫폼 펌웨어의 API 수준으로 설정해야 합니다. 이 변수는 ro.board.api_level 시스템 속성과 동일한 값을 가져야 합니다.
  • 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 빌드를 디버깅하려면 다음 아티팩트 중 하나를 다운로드하여 디버깅에 도움을 받으세요.

  • 기호 테이블은 Google 인증 GBL 빌드에 하드웨어 디버거와 GDB를 사용합니다.
  • 매니페스트repo를 사용하여 소스에서 이 GBL 빌드를 다시 만들어 서명된 빌드를 변경합니다.
  • 상응하는 GBL 개발자 빌드는 브링업 또는 서명된 프로덕션 빌드에 영향을 미치는 문제의 덜 정교한 디버그에 유용합니다.
  • 기호 테이블은 하드웨어 디버거와 GDB가 있는 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 Virtual Device에서 GBL 테스트

  1. Cuttlefish 내에서 GBL을 실행합니다.

    cvd start --android_efi_loader=path_to_the_UEFI_app ...
    

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

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

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

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