נקודת ביקורת לנתוני משתמשים

ב-Android 10 נוספה התכונה 'נקודת ניהול של נתוני משתמשים' (UDC), שמאפשרת ל-Android לחזור למצב הקודם אם עדכון Android אופליין (OTA) נכשל. עם UDC, אם עדכון OTA של Android נכשל, המכשיר יכול בחזרה למצב הקודם בצורה בטוחה. למרות עדכוני A/B פותרים את הבעיה הזו עבור הפעלה מוקדמת, החזרה למצב קודם אין תמיכה אם מתבצע שינוי במחיצה של נתוני המשתמשים (שנטענת ב-/data).

טכנולוגיית UDC מאפשרת למכשיר להחזיר את מחיצת נתוני המשתמשים למצב הקודם גם אחרי שונה. התכונה UDC מבצעת זאת באמצעות יכולות של נקודות ביקורת מערכת קבצים, הטמעה חלופית כאשר מערכת הקבצים לא תומכת נקודות ביקורת, אינטגרציה עם מנגנון A/B של תוכנת האתחול וגם תמיכה עדכונים שאינם מסוג A/B, ותמיכה בקישור גרסאות מפתח ובהחזרת מפתחות למצב קודם למניעת תרמיות.

השפעה על משתמשים

תכונת UDC משפרת את חוויית העדכון של ה-OTA עבור המשתמשים, כי פחות משתמשים מאבדים הנתונים שלהם כשעדכון OTA נכשל. האפשרות הזו עשויה להפחית את מספר שיחות התמיכה ממשתמשים שנתקלו בבעיות בתהליך העדכון. עם זאת, אם עדכון OTA נכשל, המשתמשים עשויים להבחין שהמכשיר מופעל מחדש כמה פעמים.

איך זה עובד

הפונקציונליות של נקודות הביקורת במערכות קבצים שונות

במערכת הקבצים F2FS, פרוטוקול UDC מוסיף את הפונקציונליות של נקודת הביקורת ל-upstream. 4.20 ליבה (kernel) של Linux והעברה לאחור בכל הליבה (kernel) הנפוצות שנתמכות על ידי מכשירים עם Android 10.

במערכות קבצים אחרות, UDC משתמשת במכשיר וירטואלי של מיפוי מכשירים בשם dm_bow לפונקציונליות של נקודות ביקורת. dm_bow נמצא בין המכשיר לקובץ המערכת. כשטוענים מחיצה, מתבצע חיתוך שגורם למערכת הקבצים ליצור פקודות חיתוך בכל הבלוקים החופשיים. dm_bow מיירט את החיפוי האלה ומשתמש בהם כדי להגדיר רשימת חסימות בחינם. לאחר מכן, פעולות הקריאה והכתיבה נשלחות למכשיר ללא שינוי, אבל לפני שמאפשרים פעולת כתיבה, הנתונים הנדרשים לשחזור מגובים בבלוק פנוי.

תהליך הביקורת

כשטענת מחיצה עם הדגל checkpoint=fs/block, מתבצעת התקשרות ל-Android restoreCheckpoint בנסיעה כדי לאפשר למכשיר לשחזר כל זרם נקודת ביקורת. לאחר מכן, init קורא לפונקציה needsCheckpoint כדי לקבוע אם המכשיר נמצא במצב A/B של תוכנת האתחול או שהוגדר בו מספר הניסיונות החוזרים של העדכון. אם אחת מהן נכונה, Android קורא ל-createCheckpoint כדי להוסיף דגלים של התקנה או כדי ליצור מכשיר dm_bow.

לאחר טעינת המחיצה, הקוד של נקודת הביקורת נקרא לביצוע חיתוך. לאחר מכן תהליך האתחול ממשיך כרגיל. ב-LOCKED_BOOT_COMPLETE, Android קוראת ל-commitCheckpoint לשמור את נקודת הביקורת הנוכחית ואת העדכון ממשיך כרגיל.

ניהול מפתחות של Keymaster

מפתחות Keymaster משמשים להצפנת המכשיר או למטרות אחרות. כדי לנהל את ההגדרות האלה מפתחות, מערכת Android מעכבת את השיחות למחיקת מקשים עד שנקודת הביקורת מופעלת.

מעקב אחר בריאות

דימון לניטור תקינות מאמת שיש מספיק מקום בדיסק כדי ליצור נקודת עצירה. הדימון של בריאות המכונה נמצא ב-cp_healthDaemon ב-Checkpoint.cpp.

לדימון הבריאות יש את ההתנהגויות הבאות שאפשר להגדיר:

  • ro.sys.cp_msleeptime ההגדרה קובעת באיזו תדירות המכשיר בודק את השימוש בכונן.
  • ro.sys.cp_min_free_bytes: קובע את הערך המינימלי שדמון הבריאות מחפש.
  • ro.sys.cp_commit_on_full: קובע אם הדימון של בדיקת התקינות יפעיל מחדש את המכשיר או יאחסן את נקודת הבדיקה וימשיך כשהדיסק מלא.

ממשקי API של Checkpoint

תכונת UDC משתמשת בממשקי API של נקודות ביקורת. לממשקי API אחרים שבהם UDC משתמש, ראו IVold.aidl.

void startCheckpoint(int retry)

יצירת נקודת ביקורת.

תוכנת ה-framework מפעילה את השיטה הזו כשהיא מוכנה להתחיל עדכון. נקודת הבדיקה נוצרת לפני שמערכות קבצים עם נקודות בדיקה, כמו userdata, מותקנות לקריאה וכתיבה אחרי הפעלה מחדש. אם מספר הניסיונות החוזרים הוא חיובי, ה-API מטפל במעקב אחר הניסיונות החוזרים, והעדכן קורא ל-needsRollback כדי לבדוק אם נדרש החזרה לאחור של העדכון. אם מספר הניסיונות החוזרים הוא -1, ה-API דוחה את ה-A/B. או להפעיל שיקול דעתו של תוכנת האתחול.

המערכת לא קוראת לשיטה הזו כשמבצעים עדכון A/B רגיל.

{/7} curChanges()

שומר את השינויים.

המערכת קוראת ל-method הזה אחרי ההפעלה מחדש, כשהשינויים מוכנים להתחייבות. הוא נקרא לפני נתונים (כגון תמונות, וידאו, SMS, שרת קבלה) נכתבת לנתוני המשתמש ולפני BootComplete.

אם אין עדכון פעיל שנשמר בנקודת עצירה, לשיטה הזו אין השפעה.

abortChanges()‎

המערכת מאלצת הפעלה מחדש וחוזרת לנקודת הביקורת. כל השינויים בנתוני המשתמש מבוטל מאז ההפעלה מחדש הראשונה.

תוכנת ה-framework מפעילה את השיטה הזו אחרי הפעלה מחדש, אבל לפני commitChanges. הערך של retry_counter פוחת כשמתבצעת קריאה לשיטה הזו. נוצרות רשומות ביומן.

bool needsRollback()

קובע אם צריך לבצע ביטול טרנזקציה.

במכשירים ללא נקודות ביקורת, הפונקציה מחזירה את הערך false. במכשירים עם נקודות ביקורת, הפונקציה מחזירה את הערך true. במהלך אתחול שלא קשור לנקודת ביקורת (checkpoint).

הטמעת UDC

הטמעת עזר

דוגמה להטמעת UDC מופיעה בקובץ dm-bow.c. מסמכים נוספים על התכונה מופיעים בקובץ dm-bow.txt.

הגדרה

בקובץ init.hardware.rc, בקטע on fs, צריך לוודא שיש:

mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early

בקובץ init.hardware.rc, בקטע on late-fs, צריך לוודא שיש:

mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late

בקובץ fstab.hardware, מוודאים ש-/data מתויג כ-latemount.

/dev/block/bootdevice/by-name/userdata              /data              f2fs
noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier
latemount,wait,check,fileencryption=ice,keydirectory=/metadata/vold/metadata_encryption,quota,formattable,sysfs_path=/sys/devices/platform/soc/1d84000.ufshc,reservedsize=128M,checkpoint=fs

הוספת מחיצה של מטא-נתונים

ל-UDC נדרשת מחיצת מטא-נתונים כדי לאחסן את מספר הניסיונות החוזרים של תוכנת האתחול מקשי קיצור. מגדירים מחיצה של מטא-נתונים ומרכבים אותה מוקדם ב-/metadata.

בקובץ fstab.hardware, מוודאים ש-/metadata מתויג בתור earlymount או first_stage_mount.

/dev/block/by-name/metadata           /metadata           ext4
noatime,nosuid,nodev,discard,sync
wait,formattable,first_stage_mount

מאתחלים את המחיצה לכל אפסים.

מוסיפים את השורות הבאות לקובץ BoardConfig.mk:

BOARD_USES_METADATA_PARTITION := true
BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata

עדכון מערכות

מערכות F2FS

במערכות שמשתמשות ב-F2FS כדי לפורמט נתונים, צריך לוודא שגרסת ה-F2FS תומכת בנקודות בקרה. מידע נוסף זמין במאמר פונקציונליות של נקודות עצירה במערכת קבצים שונות.

מוסיפים את הדגל checkpoint=fs לקטע <fs_mgr_flags> ב-fstab של המכשיר שמחובר ב-/data.

מערכות שאינן F2FS

במערכות שהן לא F2FS, צריך להפעיל את dm-bow בהגדרות הליבה.

מוסיפים את הדגל checkpoint=block לקטע <fs_mgr_flags> ב-fstab של המכשיר שמחובר ב-/data.

בדיקת היומנים

הרשומות ביומן נוצרות במהלך ההפעלה של ממשקי API של נקודות ביקורת.

אימות

כדי לבדוק את ההטמעה של UDC, מריצים את סדרת VtsKernelCheckpointTest של VTS בדיקות.