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

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

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

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

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

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

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

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

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

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

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

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

কীমাস্টার কীগুলি পরিচালনা করুন

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

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

একটি হেলথ ডেমন যাচাই করে যে একটি চেকপয়েন্ট তৈরি করার জন্য যথেষ্ট ডিস্ক স্পেস আছে। স্বাস্থ্য ডেমনটি 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 দেখুন।

void startCheckpoint (int পুনঃপ্রচেষ্টা)

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

ফ্রেমওয়ার্ক এই পদ্ধতিটিকে কল করে যখন এটি একটি আপডেট শুরু করার জন্য প্রস্তুত হয়। চেকপয়েন্ট তৈরি করা হয় চেকপয়েন্টেড ফাইল সিস্টেম যেমন ব্যবহারকারীর ডেটা রিবুট করার পরে R/W মাউন্ট করার আগে। যদি পুনঃপ্রচেষ্টার গণনা ইতিবাচক হয়, API ট্র্যাকিং পুনঃপ্রচারগুলি পরিচালনা করে এবং আপডেটের একটি রোলব্যাক প্রয়োজন কিনা তা পরীক্ষা করার জন্য আপডেটার needsRollback কল করে৷ যদি পুনঃপ্রচেষ্টার সংখ্যা -1 হয়, তাহলে এপিআই 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 পতাকা যোগ করুন।

লগ চেক করুন

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

বৈধতা

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