GBL डिप्लॉय करना

इस पेज पर, जेनेरिक बूटलोडर (जीबीएल) बाइनरी को डिप्लॉय करने का तरीका बताया गया है.

बूट फ़र्मवेयर की ज़रूरी शर्तें

जीबीएल का इस्तेमाल करने के लिए, बूट फ़र्मवेयर को ये ज़रूरी शर्तें पूरी करनी होंगी:

  • यूनिफ़ाइड एक्सटेंसिबल फ़र्मवेयर इंटरफ़ेस (यूईएफ़आई) के मुताबिक होना चाहिए. फ़र्मवेयर में, यूईएफ़आई के ज़रूरी प्रोटोकॉल लागू होने चाहिए और उनका इस्तेमाल किया जाना चाहिए. फ़र्मवेयर में, वेंडर के हिसाब से तय किए गए यूईएफ़आई प्रोटोकॉल का इस्तेमाल करके, एक्सटेंशन की सुविधा भी होनी चाहिए.

  • सुरक्षा. फ़र्मवेयर में, Android वेरिफ़ाइड बूट (एवीबी) की सभी ज़रूरी शर्तें पूरी होनी चाहिए. इससे, जीबीएल बूट इमेज की पुष्टि कर पाएगा.

  • बूट मोड. बाइनरी में, अलग-अलग बूट मोड को हैंडल करने की क्षमता होनी चाहिए. जैसे, सामान्य बूट, रिकवरी बूट, और फ़ास्टबूट.

  • डाइनैमिक पार्टिशन. बूट फ़र्मवेयर में, स्लॉट चुनने की लॉजिक सुविधा होनी चाहिए, ताकि यह सही A/B बूट स्लॉट को पढ़ सके. साथ ही, यह सुपर में मौजूद डाइनैमिक पार्टिशन और उपयोगकर्ता के डेटा के साथ काम कर सके.

  • ओएस कॉन्फ़िगरेशन. फ़र्मवेयर में, कर्नल कमांड लाइन, डिवाइस ट्री (डीटीबी), और बूटकॉन्फ़िग में बदलाव करने की क्षमता होनी चाहिए. साथ ही, इसमें ओईएम के हिसाब से ज़रूरी बदलाव भी किए जा सकते हैं, ताकि डिवाइस को बूट किया जा सके.

  • सुरक्षित वीएम लोड करना. सुरक्षित वीएम मौजूद होने पर, बाइनरी को Android कर्नल से पहले, पहले से पुष्टि किए गए सुरक्षित वीएम फ़र्मवेयर को सही तरीके से लोड करना चाहिए. ज़्यादा जानकारी के लिए, Microdroid बूट सीक्वेंस देखें.

  • मेमोरी मैनेज करना. बूट फ़र्मवेयर में, यूईएफ़आई मेमोरी ऐलोकेशन एपीआई की सुविधा होनी चाहिए.

लागू करने से जुड़ी ज़रूरी शर्तें

यह ज़रूरी है कि आपके डिवाइस पर जीबीएल सही तरीके से लागू हो. इसके लिए, आपको ये शर्तें पूरी करनी होंगी:

  • आपके डिवाइस में, FAT के दो पार्टिशन होने चाहिए. इनका साइज़ आठ एमबी (या इससे ज़्यादा) होना चाहिए. साथ ही, इन्हें android_esp_a और android_esp_b नाम दिया जाना चाहिए. ये दोनों पार्टिशन, एसओसी से ऐक्सेस किए जा सकने वाले ब्लॉक डिवाइस पर होने चाहिए.

    • ब्लॉक डिवाइस, स्टोरेज डिवाइस होता है. इसे ब्लॉक की यूनिट में पढ़ा या लिखा जा सकता है. उदाहरण के लिए, यूएफ़एस, ईएमएमसी, और एसडी कार्ड डिवाइस.
    • FAT का इस्तेमाल इसलिए किया जाता है, क्योंकि यह हर जगह उपलब्ध है और यह एक आसान फ़ाइल सिस्टम है.
    • हमारा सुझाव है कि आप अपनी ज़रूरत के हिसाब से FAT12, FAT16, और FAT32 में से कोई FAT फ़ाइल सिस्टम चुनें.
    • Android के इस वर्शन के लिए, ओटीए अपडेट और रोलबैक की सुविधा उपलब्ध होने तक, दोनों पार्टिशन ज़रूरी हैं.
    • जीबीएल का साइज़, बिना कंप्रेस किए करीब दो एमबी होता है. अगले सात सालों में, नई सुविधाएं जुड़ने की वजह से होने वाली बढ़ोतरी को ध्यान में रखते हुए, आठ एमबी का साइज़ काफ़ी है.
    • जीबीएल अपडेट होने पर, आपको android_esp_${SLOT_SUFFIX} का पूरा पार्टिशन अपडेट करना होगा. Android OTA, सिर्फ़ जीबीएल के अपडेट की सुविधा नहीं देता.
    • FAT के दोनों पार्टिशन के लिए इस्तेमाल किया गया पार्टिशन टाइप GUID, ईएफ़आई सिस्टम पार्टिशन GUID C12A7328-F81F-11D2-BA4B-00A0C93EC93B से मेल खाना चाहिए.
  • डिप्लॉय किया गया जीबीएल वर्शन, जीबीएल रिलीज़ ब्रांच का सबसे नया सर्टिफ़ाइड प्रोडक्शन बिल्ड होना चाहिए. हमारा सुझाव है कि आप अपनी पसंद के साइनिंग सलूशन का इस्तेमाल करके, जीबीएल की Google से सर्टिफ़ाइड कॉपी पर साइन करें. साथ ही, android_esp_${SLOT_SUFFIX} पार्टिशन में, बनने वाले बिल्ड और सिग्नेचर मेटाडेटा को सेव करें.

    • ओईएम सिग्नेचर से, जीबीएल सर्टिफ़िकेट में कोई बदलाव नहीं होना चाहिए. साथ ही, बाइनरी पर कोई हेडर लागू नहीं होना चाहिए.
    • डेवलपर जीबीएल बिल्ड का इस्तेमाल, सिर्फ़ डेवलपमेंट और डीबग के मकसद से किया जाता है. इस बिल्ड को शिप नहीं किया जा सकता. साथ ही, इसे Google से सर्टिफ़िकेट नहीं मिलेगा.
  • जीबीएल को FAT पार्टिशन में, /EFI/BOOT/BOOTAA64.EFI पाथ पर सेव किया जाना चाहिए.

  • जीबीएल के साथ काम करने के लिए, यूईएफ़आई और Android यूईएफ़आई के ज़रूरी प्रोटोकॉल लागू करें. अगर ये इंटरफ़ेस काम नहीं करते हैं, तो जीबीएल का प्रोडक्शन बिल्ड बूट नहीं हो पाएगा.

    • EFI_BLOCK_IO_PROTOCOL या EFI_BLOCK_IO2_PROTOCOL की मदद से, डिस्क से बूट इमेज और pvmfw इमेज फ़ेच की जाती हैं
    • स्टैक कैनरी, KASLR सीड, और RNG सीड के लिए EFI_RNG_PROTOCOL
    • एवीबी और DICE की कंप्यूटेशन के लिए, स्क्रैच मेमोरी के ऐलोकेशन के लिए मेमोरी ऐलोकेशन सेवाएं
    • EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL से, नो-ऑप लागू करने का विकल्प मिलता है. हालांकि, डिफ़ॉल्ट रूप से जीबीएल इस प्रोटोकॉल के ज़रिए लॉग करता है
    • GBL_EFI_AVB_PROTOCOL की मदद से, बूट इमेज की पुष्टि करने के लिए, सार्वजनिक कुंजियों और रोलबैक इंडेक्स को ऐक्सेस किया जाता है
    • GBL_EFI_BOOT_CONTROL_PROTOCOL की मदद से, फ़र्मवेयर से स्लॉट मेटाडेटा और बूट के कारणों की जानकारी मिलती है
    • GBL_EFI_AVF_PROTOCOL की मदद से, DICE चेन से AVF कॉन्फ़िग डेटा जनरेट किया जाता है
  • फ़र्मवेयर को जीबीएल के लिए, यूईएफ़आई वैरिएबल उपलब्ध कराने होंगे. इन वैरिएबल को, GBL_EFI_VENDOR_GUID वैल्यू 5a6d92f3-a2d0-4083-91a1-a50f6c3d9830 के साथ सेट करना होगा.

    • gbl_fw_api_level को प्लैटफ़ॉर्म फ़र्मवेयर के एपीआई लेवल पर सेट करना होगा. इससे, वेंडर सॉफ़्टवेयर के एपीआई लेवल का पता चलता है. इस वैरिएबल की वैल्यू, ro.board.api_level सिस्टम प्रॉपर्टी की वैल्यू के बराबर होनी चाहिए.
  • जीबीएल यूईएफ़आई प्रोटोकॉल में, उन यूईएफ़आई प्रोटोकॉल के बारे में बताया गया है जिन्हें जीबीएल को इंटिग्रेट करते समय इस्तेमाल करने का सुझाव दिया जाता है .

बूट फ़र्मवेयर की सुविधा

पिछले सेक्शन में बताई गई ज़रूरी शर्तों के मुताबिक बदलाव करने के बाद, यूईएफ़आई फ़र्मवेयर के ये लागू करने के तरीके, जीबीएल के साथ काम करते हैं:

  • EDK2 (Tianocore). EDK2, यूईएफ़आई को लागू करने का एक लोकप्रिय ओपन-सोर्स तरीका है. EDK2 पर आधारित बूटलोडर के लिए, जीबीएल की सुविधा ज़रूरी है. साथ ही, यूईएफ़आई की सुविधा पहले से मौजूद है.
  • U-Boot. यह एक फ़्लेक्सिबल और बड़े पैमाने पर इस्तेमाल किया जाने वाला ओपन-सोर्स बूटलोडर प्रोजेक्ट है. जीबीएल के इस्तेमाल के लिए, इसमें यूईएफ़आई के साथ काम करने की सुविधा जोड़ी जा रही है.
  • LittleKernel (LK). यह एक ओपन-सोर्स बूटलोडर है, जिसका इस्तेमाल कुछ वेंडर करते हैं.

जीबीएल चलाना

जीबीएल बाइनरी को चलाने के लिए, आपके पास पहले से बना जीबीएल बाइनरी पाने या अपना जीबीएल बाइनरी बनाने और उसे चलाने का विकल्प है.

जीबीएल बाइनरी पाना और उसे चलाना

जीबीएल को, यूईएफ़आई के एक ऐप्लिकेशन बाइनरी के तौर पर डिस्ट्रिब्यूट किया जाता है. Android के स्टैंडर्ड अपडेट मैकेनिज़्म का इस्तेमाल करके, डिवाइस के बेस फ़र्मवेयर से अलग इस बाइनरी को अपडेट किया जा सकता है.

Android 16 से, अगर ARM-64 चिपसेट पर आधारित कोई डिवाइस शिप किया जाता है, तो हमारा सुझाव है कि आप जीबीएल का Google से सर्टिफ़ाइड सबसे नया वर्शन डिप्लॉय करें और उसे अपनी बूट चेन में इंटिग्रेट करें.

जीबीएल बनाना

जीबीएल बनाने के लिए:

  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. यूईएफ़आई ऐप्लिकेशन बनाएं:

    tools/bazel run //bootable/libbootloader:gbl_efi_dist
    

Android वर्चुअल डिवाइस पर जीबीएल की जांच करना

  1. Cuttlefish में जीबीएल चलाएं:

    cvd start --android_efi_loader=path_to_the_UEFI_app ...
    

    Android को सीधे बूट करने के बजाय, यह cvd start कमांड, Android को बूट करने के लिए यूईएफ़आई ऐप्लिकेशन का इस्तेमाल करती है.

गड़बड़ियों की शिकायत करना और बूटलोडर टीम से संपर्क करना

जीबीएल से जुड़ी किसी गड़बड़ी की शिकायत करने के लिए, Buganizer में Android जेनेरिक बूटलोडर कॉम्पोनेंट पर जाएं.

अगर आपको कोई सवाल पूछना है, तो जीबीएल टीम से संपर्क करें. इसके लिए, android-gbl@google.com पर ईमेल भेजें.