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

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

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

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

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

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

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

F2FS ফাইল সিস্টেমের জন্য, UDC আপস্ট্রিম ৪.২০ Linux কার্নেলে চেকপয়েন্ট ফাংশনালিটি যোগ করে এবং 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-কে কল করে এবং আপডেট স্বাভাবিকভাবে চলতে থাকে।

KeyMint (আগে Keymaster) কী ম্যানেজ করা

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

স্বাস্থ্য মনিটর করা

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

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

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

চেকপয়েন্ট API

UDC ফিচারে চেকপয়েন্ট API ব্যবহার করা হয়। UDC-এর ব্যবহার করা অন্যান্য API-এর জন্য, IVold.aidl দেখুন।

void startCheckpoint(int retry)

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

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

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

void commitChanges()

পরিবর্তনগুলি কমিট করে।

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

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

abortChanges()

রিবুট করতে বাধ্য করে এবং চেকপয়েন্টে ফিরিয়ে নিয়ে যায়। প্রথম রিবুট করার পর থেকে ব্যবহারকারীর ডেটা সংক্রান্ত সব পরিবর্তন বাতিল করে দেয়।

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

bool needsRollback()

রোলব্যাক করতে হবে কিনা তা নির্ধারণ করে।

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

UDC প্রয়োগ করা

রেফারেন্স প্রয়োগ করা

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 ফ্ল্যাগ যোগ করুন।

লগ চেক করুন

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

যাচাইকরণ

আপনার UDC ইমপ্লিমেন্টেশন পরীক্ষা করতে, VtsKernelCheckpointTest VTS পরীক্ষার সেট চালান।