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

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

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

השפעה על המשתמש

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

איך זה עובד

פונקציונליות מחסום במערכות קבצים שונות

עבור מערכת הקבצים F2FS, UDC מוסיף את פונקציונליות המחסום לגרעין 4.20 Linux במעלה הזרם ומעביר אותה לכל הליבות הנפוצות הנתמכות על ידי מכשירים עם אנדרואיד 10.

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

תהליך המחסום

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

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

נהל מפתחות keymaster

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

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

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

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

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

ממשקי API של Checkpoint

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

void startCheckpoint (נסה שוב)

יוצר מחסום.

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

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

void commitChanges()

מחייב את השינויים.

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

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

abortChanges()

מאלץ אתחול מחדש וחוזר למחסום. נוטש את כל השינויים בנתוני המשתמש מאז האתחול הראשון.

המסגרת קוראת לשיטה זו לאחר אתחול מחדש אך לפני commitChanges . retry_counter מופחת כאשר קוראים לשיטה זו. רשומות יומן נוצרות.

bool needsRollback()

קובע אם נדרשת החזרה לאחור.

במכשירים שאינם מחסומים, מחזירה false . בהתקני מחסום, מחזירה true במהלך אתחול ללא מחסום.

יישום 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 במערכות קבצים שונות .

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

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

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

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

בדוק יומנים

רשומות יומן נוצרות כאשר קוראים לממשקי API של Checkpoint.

מַתַן תוֹקֵף

כדי לבדוק את יישום ה-UDC שלך, הפעל את ערכת בדיקות VTS של VtsKernelCheckpointTest .