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

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

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

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

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

Build‏ 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
    

זיהוי מודולים של ליבה (kernel) להעתקה אל system_dlkm

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

ל-Android 13

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

צריך לספק את המקור של המודולים של GKI בתיקייה ולהפנות ל-BOARD_SYSTEM_DLKM_SRC התיקייה הזו. לדוגמה:

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

בזמן ה-build, המודולים שרשומים ב-BOARD_SYSTEM_DLKM_SRC מותקנים ב: $ANDROID_PRODUCT_OUT/system_dlkm.

ב-Android 14

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

לדוגמה, כדי להתקין את כל המודולים של GKI במחיצה system_dlkm עבור הליבה arm64 של GKI‏ 5.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