ב-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
בדיקות.