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

ב-Android 10 אנחנו משיקים את נקודת הביקורת על נתוני משתמשים (UDC), מאפשרת ל-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 של נקודות ביקורת

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

ביטול ערך startCheckpoint(ניסיון חוזר)

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

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

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

{/7} curChanges()

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

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

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

abortChanges()

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

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

bool needRollback()

המדיניות קובעת אם צריך לבצע החזרה למצב קודם.

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

הטמעת UDC

הטמעת קובצי עזר

דוגמה לאופן שבו אפשר ליישם UDC: dm-bow.c. למסמכים נוספים על התכונה אפשר לעיין במאמר dm-bow.txt.

הגדרה

ב-on fs בקובץ init.hardware.rc, מוודאים שיש:

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

ב-on late-fs בקובץ init.hardware.rc, מוודאים שיש:

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 של Checkpoint.

אימות

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