उपयोगकर्ता डेटा चेकपॉइंट

एंड्रॉइड 10 उपयोगकर्ता डेटा चेकपॉइंट (यूडीसी) पेश करता है, जो एंड्रॉइड ओवर-द-एयर (ओटीए) अपडेट विफल होने पर एंड्रॉइड को अपनी पिछली स्थिति में वापस लाने की अनुमति देता है। यूडीसी के साथ, यदि एंड्रॉइड ओटीए अपडेट विफल हो जाता है, तो डिवाइस सुरक्षित रूप से अपनी पिछली स्थिति में वापस आ सकता है। हालाँकि ए/बी अपडेट प्रारंभिक बूट के लिए इस समस्या का समाधान करते हैं, लेकिन उपयोगकर्ता डेटा विभाजन ( /data पर आरूढ़) को संशोधित करने पर रोलबैक समर्थित नहीं है।

यूडीसी संशोधित होने के बाद भी डिवाइस को उपयोगकर्ता डेटा विभाजन को वापस लाने में सक्षम बनाता है। यूडीसी सुविधा फ़ाइल सिस्टम में चेकपॉइंट क्षमताओं के साथ इसे पूरा करती है, एक वैकल्पिक कार्यान्वयन जब फ़ाइल सिस्टम चेकपॉइंट्स का समर्थन नहीं करता है, बूटलोडर ए/बी तंत्र के साथ एकीकरण जबकि गैर-ए/बी अपडेट का भी समर्थन करता है, और कुंजी संस्करण बाइंडिंग के लिए समर्थन करता है। और कुंजी रोलबैक रोकथाम।

उपयोगकर्ता प्रभाव

यूडीसी सुविधा उपयोगकर्ताओं के लिए ओटीए अपडेट अनुभव को बेहतर बनाती है क्योंकि ओटीए अपडेट विफल होने पर कम उपयोगकर्ता अपना डेटा खो देते हैं। इससे उन उपयोगकर्ताओं की समर्थन कॉल की संख्या कम हो सकती है जिन्हें अद्यतन प्रक्रिया के दौरान समस्याओं का सामना करना पड़ता है। हालाँकि, जब कोई OTA अपडेट विफल हो जाता है, तो उपयोगकर्ता डिवाइस को कई बार रीबूट होते हुए देख सकते हैं।

यह काम किस प्रकार करता है

विभिन्न फ़ाइल सिस्टमों में चेकपॉइंट कार्यक्षमता

F2FS फ़ाइल सिस्टम के लिए, UDC अपस्ट्रीम 4.20 लिनक्स कर्नेल में चेकपॉइंट कार्यक्षमता जोड़ता है और इसे एंड्रॉइड 10 चलाने वाले उपकरणों द्वारा समर्थित सभी सामान्य कर्नेल पर बैकपोर्ट करता है।

अन्य फ़ाइल सिस्टम के लिए, यूडीसी चेकपॉइंट कार्यक्षमता के लिए dm_bow नामक डिवाइस मैपर वर्चुअल डिवाइस का उपयोग करता है। dm_bow डिवाइस और फ़ाइल सिस्टम के बीच बैठता है। जब एक पार्टीशन माउंट किया जाता है, तो एक ट्रिम जारी किया जाता है, जिससे फ़ाइल सिस्टम सभी फ्री ब्लॉक पर ट्रिम कमांड जारी करता है। dm_bow इन ट्रिम्स को इंटरसेप्ट करता है और एक निःशुल्क ब्लॉक सूची सेट करने के लिए उनका उपयोग करता है। पढ़ने और लिखने को फिर असंशोधित डिवाइस पर भेजा जाता है, लेकिन लिखने की अनुमति देने से पहले, पुनर्स्थापना के लिए आवश्यक डेटा को एक मुफ्त ब्लॉक में बैकअप किया जाता है।

चेकप्वाइंट प्रक्रिया

जब checkpoint=fs/block फ़्लैग वाला एक विभाजन माउंट किया जाता है, तो डिवाइस को किसी भी मौजूदा चेकपॉइंट को पुनर्स्थापित करने की अनुमति देने के लिए एंड्रॉइड ड्राइव पर restoreCheckpoint कॉल करता है। init फिर यह निर्धारित करने के लिए needsCheckpoint फ़ंक्शन को कॉल करता है कि क्या डिवाइस या तो बूटलोडर A/B स्थिति में है या उसने अपडेट रिट्री काउंट सेट किया है। यदि इनमें से कोई भी सत्य है, तो एंड्रॉइड माउंट फ़्लैग जोड़ने या dm_bow डिवाइस बनाने के लिए createCheckpoint कॉल करता है।

विभाजन माउंट होने के बाद, ट्रिम्स जारी करने के लिए चेकपॉइंट कोड को कॉल किया जाता है। फिर बूट प्रक्रिया सामान्य रूप से जारी रहती है। LOCKED_BOOT_COMPLETE पर, एंड्रॉइड वर्तमान चेकपॉइंट को प्रतिबद्ध करने के लिए commitCheckpoint कॉल करता है और अपडेट सामान्य रूप से जारी रहता है।

कीमास्टर कुंजियाँ प्रबंधित करें

कीमास्टर कुंजियों का उपयोग डिवाइस एन्क्रिप्शन या अन्य उद्देश्यों के लिए किया जाता है। इन कुंजियों को प्रबंधित करने के लिए, एंड्रॉइड कुंजी डिलीट कॉल को चेकपॉइंट प्रतिबद्ध होने तक विलंबित करता है।

स्वास्थ्य की निगरानी करें

एक स्वास्थ्य डेमॉन सत्यापित करता है कि चेकपॉइंट बनाने के लिए पर्याप्त डिस्क स्थान है। स्वास्थ्य डेमॉन Checkpoint.cpp में cp_healthDaemon में स्थित है।

स्वास्थ्य डेमॉन में निम्नलिखित व्यवहार हैं जिन्हें कॉन्फ़िगर किया जा सकता है:

  • ro.sys.cp_msleeptime : यह नियंत्रित करता है कि डिवाइस कितनी बार डिस्क उपयोग की जाँच करता है।
  • ro.sys.cp_min_free_bytes : स्वास्थ्य डेमॉन द्वारा अपेक्षित न्यूनतम मान को नियंत्रित करता है।
  • ro.sys.cp_commit_on_full : नियंत्रित करता है कि स्वास्थ्य डेमॉन डिवाइस को रीबूट करता है या चेकपॉइंट करता है और डिस्क भर जाने पर भी जारी रहता है।

चेकप्वाइंट एपीआई

चेकपॉइंट एपीआई का उपयोग यूडीसी सुविधा द्वारा किया जाता है। यूडीसी द्वारा उपयोग किए जाने वाले अन्य एपीआई के लिए, IVold.aidl देखें।

शून्य प्रारंभ जांच बिंदु(पुनः प्रयास करें)

एक चौकी बनाता है.

जब फ्रेमवर्क अपडेट शुरू करने के लिए तैयार होता है तो वह इस विधि को कॉल करता है। चेकपॉइंट को चेकपॉइंट फ़ाइल सिस्टम जैसे उपयोगकर्ता डेटा को रिबूट के बाद आर/डब्ल्यू माउंट करने से पहले बनाया जाता है। यदि पुनर्प्रयास संख्या सकारात्मक है, तो एपीआई पुनर्प्रयासों की ट्रैकिंग को संभालता है, और अद्यतनकर्ता यह जांचने के लिए needsRollback कॉल करता है कि क्या अद्यतन के रोलबैक की आवश्यकता है। यदि पुनः प्रयास की संख्या -1 है, तो एपीआई ए/बी बूटलोडर के निर्णय को स्थगित कर देता है।

सामान्य ए/बी अपडेट करते समय इस विधि को नहीं बुलाया जाता है।

शून्य प्रतिबद्धता परिवर्तन()

परिवर्तन प्रतिबद्ध करता है.

जब परिवर्तन प्रतिबद्ध होने के लिए तैयार होते हैं तो फ्रेमवर्क रीबूट के बाद इस विधि को कॉल करता है। इसे डेटा (जैसे चित्र, वीडियो, एसएमएस, प्राप्ति की सर्वर रसीद) से पहले उपयोगकर्ता डेटा पर और BootComplete से पहले लिखा जाता है।

यदि कोई सक्रिय चेकपॉइंट अद्यतन मौजूद नहीं है, तो इस विधि का कोई प्रभाव नहीं पड़ता है।

गर्भपातपरिवर्तन()

फोर्स रिबूट होता है और चेकपॉइंट पर वापस आ जाता है। पहले रिबूट के बाद से सभी उपयोगकर्ता डेटा संशोधनों को छोड़ देता है।

फ्रेमवर्क इस विधि को रिबूट के बाद लेकिन commitChanges पहले कॉल करता है। जब इस विधि को कॉल किया जाता है तो retry_counter कम हो जाता है। लॉग प्रविष्टियाँ उत्पन्न होती हैं।

बूल को रोलबैक() की आवश्यकता है

निर्धारित करता है कि रोलबैक की आवश्यकता है या नहीं।

नॉनचेकपॉइंट डिवाइस पर, false रिटर्न देता है। चेकपॉइंट डिवाइस पर, नॉनचेकपॉइंट बूट के दौरान true लौटाता है।

यूडीसी लागू करें

संदर्भ कार्यान्वयन

यूडीसी को कैसे लागू किया जा सकता है इसके उदाहरण के लिए, 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

मेटाडेटा विभाजन जोड़ें

यूडीसी को नॉनबूटलोडर रिट्री गिनती और कुंजियों को संग्रहीत करने के लिए मेटाडेटा विभाजन की आवश्यकता होती है। एक मेटाडेटा विभाजन सेट करें और इसे /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 का आपका संस्करण चेकपॉइंट्स का समर्थन करता है। अधिक जानकारी के लिए, विभिन्न फ़ाइल सिस्टम में चेकपॉइंट कार्यक्षमता देखें।

/data पर माउंट किए गए डिवाइस के लिए fstab के <fs_mgr_flags> अनुभाग में checkpoint=fs ध्वज जोड़ें।

गैर-F2FS सिस्टम

गैर-F2FS सिस्टम के लिए, कर्नेल कॉन्फ़िगरेशन में dm-bow सक्षम होना चाहिए।

/data पर माउंट किए गए डिवाइस के लिए fstab के <fs_mgr_flags> अनुभाग में checkpoint=block ध्वज जोड़ें।

लॉग जांचें

चेकपॉइंट एपीआई को कॉल करने पर लॉग प्रविष्टियाँ उत्पन्न होती हैं।

मान्यकरण

अपने यूडीसी कार्यान्वयन का परीक्षण करने के लिए, वीटीएस परीक्षणों का VtsKernelCheckpointTest सेट चलाएं।