जीकेआई मॉड्यूल विभाजन लागू करना

GKI और GKI मॉड्यूल को बाकी पार्टिशन से अलग से अपडेट किया जा सकता है, क्योंकि GKI मॉड्यूल, system_dlkm नाम की सुपर इमेज में एक अलग डाइनैमिक पार्टिशन में मौजूद होते हैं. Google, GKI मॉड्यूल पर हस्ताक्षर करने के लिए, कर्नेल के बनने के समय इस्तेमाल हुए पासकोड का इस्तेमाल करता है. ये मॉड्यूल, सिर्फ़ उस GKI के साथ काम करते हैं जिसके लिए इन्हें बनाया गया है. GKI और GKI मॉड्यूल के बीच एबीआई स्थिर नहीं है. रनटाइम के दौरान मॉड्यूल सही तरीके से लोड होने के लिए, GKI और GKI मॉड्यूल को एक साथ बनाया और अपडेट किया जाना चाहिए.

सिस्टम_dklm पार्टीशन सपोर्ट को लागू करें

system_dlkm पार्टीशन, सुपर पार्टीशन में एक और डाइनैमिक पार्टिशन के तौर पर मौजूद है. इस विभाजन में ये शामिल हो सकते हैं:

  • Google के बनाए गए ऐसे कर्नेल मॉड्यूल जिन्हें बिल्ड के समय साइन किया गया हो
  • depmod सह-उत्पाद

बिल्‍ड system_dlkm

system_dlkm बनाना, अन्य डाइनैमिक पार्टिशन बनाने जैसी ही प्रोसेस है. अपने बिल्ड में system_dlkm जोड़ने के लिए, यह तरीका अपनाएं:

  1. BoardConfig.mk में, यह एंट्री जोड़ें:

    BOARD_USES_SYSTEM_DLKMIMAGE := true
    BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
    TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
    
  2. पार्टीशन की सूची में, system_dlkm जोड़ें: BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (ज़रूरी नहीं) A/B और वर्चुअल A/B डिवाइसों के लिए, अपने डिवाइस की device.mk फ़ाइल में यह लाइन जोड़ें:

    AB_OTA_PARTITIONS += system_dlkm
    

system_dlkm में कॉपी करने के लिए, कर्नेल मॉड्यूल की पहचान करना

रनटाइम के दौरान मॉड्यूल सही तरीके से लोड होने के लिए, GKI और GKI मॉड्यूल को एक साथ बनाया जाना चाहिए. इसलिए, आपको टारगेट आर्किटेक्चर के लिए GKI बिल्ड में मौजूद कर्नेल मॉड्यूल की पहचान करनी होगी. साथ ही, प्लैटफ़ॉर्म बिल्ड के दौरान, system_dlkm पार्टीशन के लिए सोर्स के तौर पर उन्हें उपलब्ध कराना होगा.

Android 13 के लिए

system_dlkm पार्टिशन को जनरेट करने के लिए, BOARD_SYSTEM_DLKM_SRC को बिल्ड सिस्टम के इनपुट के तौर पर डिवाइस के लिए ज़रूरी GKI मॉड्यूल कर्नल ऑब्जेक्ट फ़ाइलों वाले फ़ोल्डर पर ले जाएं. उदाहरण के लिए:

किसी फ़ोल्डर में जीकेआई मॉड्यूल सोर्स दें और BOARD_SYSTEM_DLKM_SRC को उस फ़ोल्डर पर ले जाएं. उदाहरण के लिए:

  BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging

बिल्ड के समय, BOARD_SYSTEM_DLKM_SRC में दिए गए मॉड्यूल, $ANDROID_PRODUCT_OUT/system_dlkm में इंस्टॉल किए जाते हैं.

Android 14 के लिए

हमने अन्य *_dlkm पार्टीशन के लिए इस्तेमाल किए जा रहे मैक्रो (BOARD_*_KERNEL_MODULES) के साथ, लागू करने की प्रोसेस को आसान बनाया है. डिवाइस के लिए ज़रूरी GKI मॉड्यूल की सूची का रेफ़रंस, BOARD_SYSTEM_KERNEL_MODULES मैक्रो से दिया जाना चाहिए. बिल्ड के समय ये मॉड्यूल $ANDROID_PRODUCT_OUT/system_dlkm में इंस्टॉल किए जाते हैं. vendor_dlkm सेगमेंट में मौजूद कोई भी मॉड्यूल, system_dlkm सेगमेंट में मौजूद मॉड्यूल पर निर्भर करता है. यह vendor_dlkm सेगमेंट के लिए, modules.dep फ़ाइल में सही रेफ़रंस जनरेट करता है. modules.dep से दिखाए गए अलग-अलग पार्टीशन की डिपेंडेंसी की वजह से, जब कोई वेंडर मॉड्यूल लोड होता है, तो ज़रूरी GKI मॉड्यूल अपने-आप लोड हो जाता है.

उदाहरण के लिए, जीकेआई के लिए system_dlkm पार्टीशन पर सभी जीकेआई मॉड्यूल इंस्टॉल करने के लिए पहले से बने हुए arm64 कर्नेल 5.15:

 BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)

रनटाइम के दौरान system_dlkm को माउंट करना

रनटाइम के दौरान system_dlkm पार्टीशन को माउंट करने के लिए, fstab में ये चीज़ें जोड़ें. यह इस बात पर निर्भर करता है कि रीड-ओनली फ़ाइल सिस्टम के तौर पर किस फ़ाइल सिस्टम का इस्तेमाल किया जा रहा है:

रीड-ओनली फ़ाइल सिस्टम के तौर पर, ext4

  system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

रीड-ओनली फ़ाइल सिस्टम के तौर पर, erofs

  system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb

पार्टीशन को माउंट करना और मॉड्यूल लोड करना

first_stage_init के दौरान, system_dlkm पार्टीशन को /system_dlkm में सिर्फ़ पढ़ने के लिए फ़ाइल सिस्टम के तौर पर माउंट किया जाता है. माउंट होने के बाद, /system/lib/modules पर /system_dlkm/lib/modules पर ले जाने वाले सिंबल लिंक उपलब्ध होते हैं.

इसके बाद, .rc स्क्रिप्ट जैसी वेंडर प्रोसेस, modules.load में बताए गए क्रम के आधार पर, कर्नेल मॉड्यूल लोड कर सकती है. मॉड्यूल लोड करने के लिए, वेंडर प्रोसेस को सिंबल लिंक /system/lib/modules का इस्तेमाल करना होगा. ज़रूरत पड़ने पर, वेंडर प्रोसेस बाद में भी मॉड्यूल लोड कर सकती है.

SELinux

system_dlkm पार्टिशन में मौजूद हर फ़ाइल को system_dlkm_file के फ़ाइल कॉन्टेक्स्ट के साथ लेबल किया जाता है. system_dlkm विभाजन में GKI मॉड्यूल फ़ाइल लोड करने के लिए, मॉड्यूल लोड करने के लिए ज़िम्मेदार वेंडर प्रक्रिया को वेंडर डोमेन में एक sepolicy की ज़रूरत होती है.

उदाहरण के लिए, GKI मॉड्यूल लोड करने के लिए Cuttlefish का इस्तेमाल करने वाले dlkm_loader के पास, shared/sepolicy/vendor/dlkm_loader.te पर मौजूद नीति फ़ाइल में ये अनुमतियां हैं:

allow dlkm_loader self:capability sys_module;
allow dlkm_loader system_dlkm_file:dir r_dir_perms;
allow dlkm_loader system_dlkm_file:file r_file_perms;
allow dlkm_loader system_dlkm_file:system module_load;

सिस्टम-DLKM पार्टिशन की पुष्टि करें

system_dlkm पार्टीशन की पुष्टि करने के लिए, Google एक GKI VTS टेस्ट केस उपलब्ध कराता है. जांच को मैन्युअल तरीके से शुरू करने के लिए, atest कमांड का इस्तेमाल करें:

  atest -c vts_dlkm_partition_test