ব্যবহারকারীর ডেটা চেকপয়েন্ট

অ্যান্ড্রয়েড ১০ ব্যবহারকারীর ডেটা চেকপয়েন্ট (ইউডিসি) চালু করেছে, যা অ্যান্ড্রয়েড ওভার-দ্য-এয়ার (ওটিএ) আপডেট ব্যর্থ হলে অ্যান্ড্রয়েডকে তার পূর্ববর্তী অবস্থায় ফিরে যেতে দেয়। ইউডিসির সাহায্যে, যদি কোনও অ্যান্ড্রয়েড ওটিএ আপডেট ব্যর্থ হয়, তবে ডিভাইসটি নিরাপদে তার পূর্ববর্তী অবস্থায় ফিরে যেতে পারে। যদিও এ/বি আপডেটগুলি প্রাথমিক বুটের জন্য এই সমস্যার সমাধান করে, ব্যবহারকারীর ডেটা পার্টিশন ( /data এ মাউন্ট করা) পরিবর্তন করা হলে রোলব্যাক সমর্থিত হয় না।

UDC ডিভাইসটিকে ব্যবহারকারীর ডেটা পার্টিশন পরিবর্তন করার পরেও ফিরিয়ে আনতে সক্ষম করে। UDC বৈশিষ্ট্যটি ফাইল সিস্টেমে চেকপয়েন্ট ক্ষমতা, ফাইল সিস্টেম চেকপয়েন্ট সমর্থন না করলে একটি বিকল্প বাস্তবায়ন, বুটলোডার A/B প্রক্রিয়ার সাথে ইন্টিগ্রেশন এবং নন-A/B আপডেট সমর্থন করে এবং কী সংস্করণ বাইন্ডিং এবং কী রোলব্যাক প্রতিরোধের জন্য সমর্থন সহ এটি সম্পন্ন করে।

ব্যবহারকারীর প্রভাব

UDC বৈশিষ্ট্যটি ব্যবহারকারীদের জন্য OTA আপডেট অভিজ্ঞতা উন্নত করে কারণ OTA আপডেট ব্যর্থ হলে কম ব্যবহারকারী তাদের ডেটা হারান। এটি আপডেট প্রক্রিয়ার সময় সমস্যায় পড়া ব্যবহারকারীদের সাপোর্ট কলের সংখ্যা কমাতে পারে। তবে, যখন একটি OTA আপডেট ব্যর্থ হয়, তখন ব্যবহারকারীরা ডিভাইসটি একাধিকবার রিবুট হতে লক্ষ্য করতে পারেন।

কিভাবে এটা কাজ করে

বিভিন্ন ফাইল সিস্টেমে চেকপয়েন্ট কার্যকারিতা

F2FS ফাইল সিস্টেমের জন্য, UDC আপস্ট্রিম 4.20 লিনাক্স কার্নেলে চেকপয়েন্ট কার্যকারিতা যোগ করে এবং এটিকে অ্যান্ড্রয়েড 10 চালিত ডিভাইস দ্বারা সমর্থিত সমস্ত সাধারণ কার্নেলে ব্যাকপোর্ট করে।

অন্যান্য ফাইল সিস্টেমের ক্ষেত্রে, চেকপয়েন্ট কার্যকারিতার জন্য UDC dm_bow নামক একটি ডিভাইস ম্যাপার ভার্চুয়াল ডিভাইস ব্যবহার করে। dm_bow ডিভাইস এবং ফাইল সিস্টেমের মধ্যে থাকে। যখন একটি পার্টিশন মাউন্ট করা হয়, তখন একটি ট্রিম জারি করা হয় যার ফলে ফাইল সিস্টেম সমস্ত ফ্রি ব্লকে ট্রিম কমান্ড জারি করে। dm_bow এই ট্রিমগুলিকে আটকে দেয় এবং একটি ফ্রি ব্লক তালিকা সেট আপ করতে ব্যবহার করে। পঠন এবং লেখাগুলি তারপর অপরিবর্তিত অবস্থায় ডিভাইসে পাঠানো হয়, কিন্তু লেখার অনুমতি দেওয়ার আগে, পুনরুদ্ধারের জন্য প্রয়োজনীয় ডেটা একটি ফ্রি ব্লকে ব্যাক আপ করা হয়।

চেকপয়েন্ট প্রক্রিয়া

যখন checkpoint=fs/block ফ্ল্যাগ সহ একটি পার্টিশন মাউন্ট করা হয়, তখন Android ড্রাইভে restoreCheckpoint কল করে ডিভাইসটিকে যেকোনো বর্তমান চেকপয়েন্ট পুনরুদ্ধার করার অনুমতি দেয়। তারপর init needsCheckpoint ফাংশন কল করে ডিভাইসটি বুটলোডার A/B অবস্থায় আছে কিনা তা নির্ধারণ করে অথবা আপডেট পুনঃপ্রচেষ্টা গণনা সেট করেছে কিনা। যদি দুটির মধ্যে একটি সত্য হয়, তাহলে Android createCheckpoint কল করে হয় মাউন্ট ফ্ল্যাগ যোগ করে অথবা একটি dm_bow ডিভাইস তৈরি করে।

পার্টিশনটি মাউন্ট করার পর, চেকপয়েন্ট কোডটি ট্রিম ইস্যু করার জন্য ডাকা হয়। এরপর বুট প্রক্রিয়াটি স্বাভাবিকভাবে চলতে থাকে। LOCKED_BOOT_COMPLETE এ, অ্যান্ড্রয়েড বর্তমান চেকপয়েন্টটি কমিট করার জন্য commitCheckpoint কল করে এবং আপডেটটি স্বাভাবিকভাবে চলতে থাকে।

KeyMint (পূর্বে Keymaster) কীগুলি পরিচালনা করুন

KeyMint কীগুলি ডিভাইস এনক্রিপশন বা অন্যান্য উদ্দেশ্যে ব্যবহৃত হয়। এই কীগুলি পরিচালনা করার জন্য, অ্যান্ড্রয়েড চেকপয়েন্টটি প্রতিশ্রুতিবদ্ধ না হওয়া পর্যন্ত কী মুছে ফেলার কলগুলিকে বিলম্বিত করে।

স্বাস্থ্য পর্যবেক্ষণ করুন

একটি হেলথ ডেমন যাচাই করে যে একটি চেকপয়েন্ট তৈরি করার জন্য পর্যাপ্ত ডিস্ক স্পেস আছে। হেলথ ডেমনটি Checkpoint.cpp এর cp_healthDaemon এ অবস্থিত।

হেলথ ডেমনের নিম্নলিখিত আচরণগুলি কনফিগার করা যেতে পারে:

  • ro.sys.cp_msleeptime : ডিভাইসটি কতবার ডিস্ক ব্যবহার পরীক্ষা করে তা নিয়ন্ত্রণ করে।
  • ro.sys.cp_min_free_bytes : হেলথ ডেমন যে ন্যূনতম মান খুঁজছে তা নিয়ন্ত্রণ করে।
  • ro.sys.cp_commit_on_full : হেলথ ডেমন ডিভাইসটি রিবুট করবে নাকি চেকপয়েন্ট কমিট করবে এবং ডিস্ক পূর্ণ হলে চালিয়ে যাবে কিনা তা নিয়ন্ত্রণ করে।

চেকপয়েন্ট API গুলি

চেকপয়েন্ট API গুলি UDC বৈশিষ্ট্য দ্বারা ব্যবহৃত হয়। UDC দ্বারা ব্যবহৃত অন্যান্য API গুলির জন্য, IVold.aidl দেখুন।

অকার্যকর স্টার্টচেকপয়েন্ট (পুনরায় চেষ্টা করা)

একটি চেকপয়েন্ট তৈরি করে।

আপডেট শুরু করার জন্য যখন ফ্রেমওয়ার্ক প্রস্তুত থাকে তখন এই পদ্ধতিটি কল করে। চেকপয়েন্ট তৈরি করা হয় চেকপয়েন্ট করা ফাইল সিস্টেম যেমন ইউজারডেটা রিবুট করার পরে R/W মাউন্ট করার আগে। যদি রিট্র্যাই কাউন্ট পজিটিভ হয়, তাহলে API ট্র্যাকিং রিট্রি পরিচালনা করে এবং আপডেটার needsRollback কল করে আপডেটের রোলব্যাক প্রয়োজন কিনা তা পরীক্ষা করে। যদি রিট্র্যাই কাউন্ট -1 হয়, তাহলে API A/B বুটলোডারের বিচারের উপর নির্ভর করে।

একটি সাধারণ A/B আপডেট করার সময় এই পদ্ধতিটি কল করা হয় না।

অকার্যকর কমিটচেঞ্জেস()

পরিবর্তনগুলি সম্পাদন করে।

পরিবর্তনগুলি করার জন্য প্রস্তুত হলে ফ্রেমওয়ার্কটি রিবুট করার পরে এই পদ্ধতিটি কল করে। এটি ডেটা (যেমন ছবি, ভিডিও, এসএমএস, সার্ভারের প্রাপ্তির প্রাপ্তি) ব্যবহারকারীর ডেটাতে লেখার আগে এবং BootComplete এর আগে বলা হয়।

যদি কোনও সক্রিয় চেকপয়েন্টেড আপডেট বিদ্যমান না থাকে, তাহলে এই পদ্ধতির কোনও প্রভাব নেই।

বাতিল পরিবর্তন ()

জোর করে রিবুট করে এবং চেকপয়েন্টে ফিরিয়ে আনে। প্রথম রিবুট থেকে সমস্ত ব্যবহারকারীর ডেটা পরিবর্তন পরিত্যাগ করে।

ফ্রেমওয়ার্কটি রিবুট করার পরে কিন্তু commitChanges এর আগে এই পদ্ধতিটি কল করে। এই পদ্ধতিটি কল করলে retry_counter হ্রাস পায়। লগ এন্ট্রি তৈরি হয়।

বুল নিডসরোলব্যাক()

রোলব্যাক প্রয়োজন কিনা তা নির্ধারণ করে।

নন-চেকপয়েন্ট ডিভাইসে, false রিটার্ন করে। চেকপয়েন্ট ডিভাইসে, নন-চেকপয়েন্ট বুটের সময় true রিটার্ন করে।

ইউডিসি বাস্তবায়ন করুন

রেফারেন্স বাস্তবায়ন

UDC কীভাবে বাস্তবায়িত করা যেতে পারে তার একটি উদাহরণের জন্য, 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

মেটাডেটা পার্টিশন যোগ করুন

নন-বুটলোডার রিট্রাই কাউন্ট এবং কী সংরক্ষণ করার জন্য 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 সংস্করণটি চেকপয়েন্ট সমর্থন করে। আরও তথ্যের জন্য, বিভিন্ন ফাইল সিস্টেমে চেকপয়েন্ট কার্যকারিতা দেখুন।

/data এ মাউন্ট করা ডিভাইসের জন্য fstab এর <fs_mgr_flags> বিভাগে checkpoint=fs পতাকা যোগ করুন।

নন-F2FS সিস্টেম

F2FS নয় এমন সিস্টেমের জন্য, কার্নেল কনফিগারেশনে dm-bow সক্রিয় থাকতে হবে।

/data এ মাউন্ট করা ডিভাইসের জন্য fstab এর <fs_mgr_flags> বিভাগে checkpoint=block পতাকা যোগ করুন।

লগ পরীক্ষা করুন

চেকপয়েন্ট এপিআই কল করলে লগ এন্ট্রি তৈরি হয়।

বৈধতা

আপনার UDC বাস্তবায়ন পরীক্ষা করতে, VTS পরীক্ষার VtsKernelCheckpointTest সেটটি চালান।