הטמעת מחיצה של מודול GKI

אפשר לעדכן את GKI ואת מודולי GKI בנפרד משאר המחיצה, כי מודולי GKI נמצאים במחיצה דינמית נפרדת בתמונה העל שנקראת system_dlkm. מודולים של GKI נחתמים על ידי Google באמצעות צמד מפתחות של זמן בניית הליבה, והם תואמים רק ל-GKI שבו הם נבנו. אין יציבות ABI בין GKI לבין מודולי GKI. כדי שהמודולים ייטענו בצורה תקינה במהלך זמן הריצה, צריך לבנות ולעדכן את ה-GKI ואת מודולי ה-GKI יחד.

הטמעה של תמיכה במחיצה system_dklm

המחיצה system_dlkm נמצאת במחיצת העל כמחיצה דינמית נוספת. המחיצה הזו יכולה להכיל:

  • מודולי ליבה חתומים בזמן הבנייה של Google
  • depmod פריטי מידע שנוצרו בתהליך פיתוח (Artifact)

Build‏ system_dlkm

תהליך היצירה של system_dlkm דומה לתהליך היצירה של מחיצות דינמיות אחרות. כדי להוסיף את system_dlkm ל-build:

  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 build עבור ארכיטקטורת היעד ולספק אותם כמקור למחיצה system_dlkm במהלך בניית הפלטפורמה.

ל-Android 13

מציינים את BOARD_SYSTEM_DLKM_SRC כתיקייה שמכילה את קובצי האובייקט של ליבת מודולי ה-GKI הנדרשים למכשיר, כקלט למערכת ה-build, כדי ליצור את המחיצה system_dlkm. לדוגמה:

מספקים את המקור של מודולי 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

ייעלנו את ההטמעה באמצעות פקודות מאקרו (BOARD_*_KERNEL_MODULES) שמשמשות למחיצות אחרות של *_dlkm. רשימת מודולי ה-GKI הנדרשים למכשיר צריכה להיות מופנית באמצעות מאקרו BOARD_SYSTEM_KERNEL_MODULES. בזמן הבנייה, המודולים האלה מותקנים ב-$ANDROID_PRODUCT_OUT/system_dlkm. כל מודול במחיצה vendor_dlkm שיש לו יחסי תלות במודולים במחיצה system_dlkm יוצר הפניות נכונות בקובץ modules.dep למחיצה vendor_dlkm. בגלל התלות בין המחיצות שמיוצגת על ידי modules.dep, כשמודול של ספק נטען, כל מודול GKI נדרש נטען באופן אוטומטי.

לדוגמה, כדי להתקין את כל מודולי ה-GKI במחיצה system_dlkm עבור ליבת GKI arm645.15 מ-prebuilts:

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

הוספת תושבת system_dlkm בזמן הריצה

בהתאם למערכת הקבצים שבה משתמשים כמערכת קבצים לקריאה בלבד, מוסיפים את השורות הבאות לקובץ fstab כדי לטעון את המחיצה system_dlkm בזמן הריצה:

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. כדי לטעון את קובץ המודולים של GKI במחיצה system_dlkm, תהליך הספק שאחראי לטעינת המודולים צריך sepolicy בדומיין הספק.

לדוגמה, ל-dlkm_loader שמשמש את Cuttlefish לטעינת מודולים של GKI יש את ההרשאות הבאות בקובץ המדיניות ב-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;

אימות המחיצה system-dlkm

‫Google מספקת מקרה בדיקה של GKI VTS כדי לאמת את המחיצה system_dlkm. כדי להפעיל את הבדיקה באופן ידני, משתמשים בפקודה atest הבאה:

  atest -c vts_dlkm_partition_test