Android 10 में, यूज़र डेटा चेकपॉइंट (यूडीसी) की सुविधा जोड़ी गई है. इसकी मदद से, Android को पिछली स्थिति में रोल बैक किया जा सकता है. ऐसा तब किया जाता है, जब Android का ओवर-द-एयर (OTA) अपडेट पूरा न हो पाए. यूडीसी की मदद से, अगर Android का OTA अपडेट पूरा नहीं हो पाता है, तो डिवाइस को सुरक्षित तरीके से पिछली स्थिति में रोल बैक किया जा सकता है. हालांकि,
A/B अपडेट की मदद से, बूट होने की शुरुआती प्रोसेस में आने वाली इस समस्या को हल किया जा सकता है. हालांकि, जब उपयोगकर्ता के डेटा वाले पार्टिशन (/data पर माउंट किया गया) में बदलाव किया जाता है, तो रोलबैक
की सुविधा काम नहीं करती.
यूडीसी की मदद से, डिवाइस को उपयोगकर्ता के डेटा वाले पार्टिशन को, उसमें बदलाव होने के बाद भी पिछली स्थिति में लाया जा सकता है. यूडीसी की सुविधा, फ़ाइल सिस्टम में चेकपॉइंट की क्षमताओं की मदद से ऐसा करती है. साथ ही, यह फ़ाइल सिस्टम के लिए एक वैकल्पिक तरीका है, जब फ़ाइल सिस्टम, चेकपॉइंट की सुविधा के साथ काम नहीं करता. इसके अलावा, यह बूटलोडर A/B मैकेनिज़्म के साथ इंटिग्रेट होती है. साथ ही, यह नॉन-A/B अपडेट के साथ भी काम करती है. इसके अलावा, यह पासकोड के वर्शन को बाइंड करने और पासकोड को रोलबैक होने से बचाने की सुविधा के साथ भी काम करती है.
उपयोगकर्ता पर असर
यूडीसी की सुविधा से, उपयोगकर्ताओं के लिए OTA अपडेट का अनुभव बेहतर होता है. ऐसा इसलिए, क्योंकि OTA अपडेट पूरा न होने पर, कम उपयोगकर्ताओं का डेटा खोता है. इससे, अपडेट की प्रोसेस के दौरान आने वाली समस्याओं के लिए, उपयोगकर्ताओं से मिलने वाले सहायता अनुरोधों की संख्या कम हो सकती है. हालांकि, OTA अपडेट पूरा न होने पर, उपयोगकर्ताओं को डिवाइस के कई बार रीबूट होने की समस्या आ सकती है.
यह कैसे काम करता है
अलग-अलग फ़ाइल सिस्टम में चेकपॉइंट की सुविधा
F2FS फ़ाइल सिस्टम के लिए, यूडीसी, अपस्ट्रीम 4.20 Linux कर्नेल में चेकपॉइंट की सुविधा जोड़ता है. साथ ही, यह Android 10 पर चलने वाले डिवाइसों के लिए, सामान्य कर्नेल के सभी वर्शन में इसे बैकपोर्ट करता है.
अन्य फ़ाइल सिस्टम के लिए, यूडीसी, चेकपॉइंट की सुविधा के लिए, डिवाइस मैपर वर्चुअल डिवाइस का इस्तेमाल करता है. इसे dm_bow कहा जाता है. dm_bow , डिवाइस और फ़ाइल सिस्टम के बीच काम करता है. जब कोई पार्टिशन माउंट किया जाता है, तो ट्रिम जारी किया जाता है. इससे फ़ाइल सिस्टम, सभी खाली ब्लॉक पर ट्रिम कमांड जारी करता है. dm_bow इन ट्रिम को इंटरसेप्ट करता है और इनका इस्तेमाल, खाली ब्लॉक की सूची सेट अप करने के लिए करता है. इसके बाद, रीड और राइट को डिवाइस पर बिना किसी बदलाव के भेजा जाता है. हालांकि, राइट की अनुमति मिलने से पहले, रीस्टोर के लिए ज़रूरी डेटा का बैक अप, खाली ब्लॉक में लिया जाता है.
चेकपॉइंट की प्रोसेस
जब checkpoint=fs/block फ़्लैग वाला कोई पार्टिशन माउंट किया जाता है, तो Android, ड्राइव पर restoreCheckpoint को कॉल करता है. इससे डिवाइस, मौजूदा चेकपॉइंट को रीस्टोर कर पाता है. इसके बाद, init, needsCheckpoint फ़ंक्शन को कॉल करता है. इससे यह पता चलता है कि डिवाइस, बूटलोडर A/B की स्थिति में है या उसने अपडेट के फिर से कोशिश करने की संख्या सेट की है. अगर इनमें से कोई भी स्थिति सही है, तो Android, createCheckpoint को कॉल करता है. इससे माउंट फ़्लैग जोड़े जाते हैं या dm_bow डिवाइस बनाया जाता है.
पार्टिशन माउंट होने के बाद, ट्रिम जारी करने के लिए, चेकपॉइंट कोड को कॉल किया जाता है.
इसके बाद, बूट की प्रोसेस सामान्य तरीके से जारी रहती है. LOCKED_BOOT_COMPLETE पर, Android, commitCheckpoint को कॉल करता है. इससे मौजूदा चेकपॉइंट कमिट हो जाता है और अपडेट सामान्य तरीके से जारी रहता है.
KeyMint (पहले इसे Keymaster कहा जाता था) पासकोड मैनेज करना
KeyMint पासकोड का इस्तेमाल, डिवाइस को एन्क्रिप्ट करने या अन्य कामों के लिए किया जाता है. इन पासकोड को मैनेज करने के लिए, Android, पासकोड मिटाने के कॉल को तब तक डिले करता है, जब तक चेकपॉइंट कमिट नहीं हो जाता.
डिवाइस की स्थिति की निगरानी करना
डिवाइस की स्थिति की निगरानी करने वाला डेमॉन, यह पुष्टि करता है कि चेकपॉइंट बनाने के लिए, डिस्क में ज़रूरत के मुताबिक जगह खाली है. डिवाइस की स्थिति की निगरानी करने वाला डेमॉन, Checkpoint.cpp में
cp_healthDaemon
में मौजूद होता है.
डिवाइस की स्थिति की निगरानी करने वाले डेमॉन के ये व्यवहार कॉन्फ़िगर किए जा सकते हैं:
ro.sys.cp_msleeptime: इससे यह कंट्रोल किया जाता है कि डिवाइस, डिस्क के इस्तेमाल की जांच कितनी बार करता है.ro.sys.cp_min_free_bytes: इससे यह कंट्रोल किया जाता है कि डिवाइस की स्थिति की निगरानी करने वाला डेमॉन, कम से कम कितनी वैल्यू की जांच करता है.ro.sys.cp_commit_on_full: इससे यह कंट्रोल किया जाता है कि डिस्क भर जाने पर, डिवाइस की स्थिति की निगरानी करने वाला डेमॉन, डिवाइस को रीबूट करता है या चेकपॉइंट को कमिट करके प्रोसेस जारी रखता है.
चेकपॉइंट एपीआई
चेकपॉइंट एपीआई का इस्तेमाल, यूडीसी की सुविधा के लिए किया जाता है. यूडीसी के लिए इस्तेमाल किए जाने वाले अन्य एपीआई के बारे में जानने के लिए, देखें
IVold.aidl.
void startCheckpoint(int retry)
इससे एक चेकपॉइंट बनता है.
फ़्रेमवर्क, अपडेट शुरू करने के लिए तैयार होने पर, इस तरीके को कॉल करता है. चेकपॉइंट, चेकपॉइंट वाले फ़ाइल सिस्टम के लिए बनाया जाता है. जैसे, रीबूट के बाद, userdata को R/W के तौर पर माउंट किया जाता है. अगर फिर से कोशिश करने की संख्या पॉज़िटिव है, तो एपीआई, फिर से कोशिश करने की संख्या को ट्रैक करता है. साथ ही, अपडेटर, needsRollback को कॉल करके यह जांचता है कि अपडेट को रोलबैक करने की ज़रूरत है या नहीं. अगर फिर से कोशिश करने की संख्या -1 है, तो एपीआई, A/B बूटलोडर के फ़ैसले पर निर्भर करता है.
सामान्य A/B अपडेट करने पर, इस तरीके को कॉल नहीं किया जाता.
void commitChanges()
इससे बदलाव कमिट होते हैं.
फ़्रेमवर्क, रीबूट के बाद इस तरीके को कॉल करता है. ऐसा तब किया जाता है, जब बदलाव कमिट करने के लिए तैयार हों. इसे userdata में डेटा (जैसे, तस्वीरें, वीडियो, एसएमएस, सर्वर से मिली रसीद) लिखने से पहले और BootComplete से पहले कॉल किया जाता है.
अगर कोई ऐक्टिव चेकपॉइंट वाला अपडेट मौजूद नहीं है, तो इस तरीके का कोई असर नहीं होता.
abortChanges()
इससे डिवाइस को रीबूट किया जाता है और चेकपॉइंट पर वापस लाया जाता है. पहले रीबूट के बाद से, userdata में किए गए सभी बदलावों को छोड़ दिया जाता है.
फ़्रेमवर्क, रीबूट के बाद, लेकिन commitChanges से पहले इस तरीके को कॉल करता है.
इस तरीके को कॉल करने पर, retry_counter कम हो जाता है. लॉग एंट्री जनरेट होती हैं.
bool needsRollback()
इससे यह तय होता है कि रोलबैक की ज़रूरत है या नहीं.
चेकपॉइंट की सुविधा के बिना काम करने वाले डिवाइसों पर, 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 फ़्लैग जोड़ें.
लॉग देखना
चेकपॉइंट एपीआई को कॉल करने पर, लॉग एंट्री जनरेट होती हैं.
सत्यापन
यूडीसी को लागू करने की जांच करने के लिए, VTS टेस्ट का VtsKernelCheckpointTest सेट चलाएं.