ভার্চুয়াল A/B হল Android এর প্রধান আপডেট প্রক্রিয়া। ভার্চুয়াল A/B লিগ্যাসি A/B আপডেটের উপরে তৈরি করে ( A/B সিস্টেম আপডেট দেখুন) এবং নন-A/B যা আপডেটের ওভারহেডের জায়গা কমাতে 15-এ অবচয় করা হয়েছে।
ভার্চুয়াল A/B-তে আসলে ডাইনামিক পার্টিশনের জন্য অতিরিক্ত স্লট নেই, দেখুন ডাইনামিক পার্টিশন । পরিবর্তে ডেল্টা একটি স্ন্যাপশটে লেখা হয়, এবং তারপর সফল বুট নিশ্চিত করার পরে বেস পার্টিশনে মার্জ করা হয়। ভার্চুয়াল A/B একটি Android নির্দিষ্ট স্ন্যাপশট বিন্যাস ব্যবহার করে। সংকুচিত স্ন্যাপশটগুলির জন্য COW ফর্ম্যাট দেখুন যা স্ন্যাপশটগুলিকে সংকুচিত করার অনুমতি দেয় এবং ডিস্কের স্থানের ব্যবহার কমিয়ে দেয়। একটি সম্পূর্ণ OTA-তে স্ন্যাপশটের আকার কম্প্রেশনের মাধ্যমে প্রায় 45% কমে যায় এবং বর্ধিত OTA স্ন্যাপশটের আকার প্রায় 55% কমে যায়।
অ্যান্ড্রয়েড 12 স্ন্যাপশট করা পার্টিশনগুলিকে সংকুচিত করতে ভার্চুয়াল A/B কম্প্রেশনের বিকল্প অফার করে। ভার্চুয়াল A/B নিম্নলিখিত অফার করে
- A/B আপডেটের মতো ভার্চুয়াল A/B আপডেটগুলি নিরবচ্ছিন্ন (আপডেট সম্পূর্ণরূপে ব্যাকগ্রাউন্ডে ঘটে যখন ডিভাইসটি চালু থাকে)। ভার্চুয়াল A/B আপডেটগুলি একটি ডিভাইস অফলাইন এবং অব্যবহারের সময়কে কমিয়ে দেয়।
- ভার্চুয়াল A/B আপডেটগুলি রোল ব্যাক করা যেতে পারে। নতুন ওএস বুট করতে ব্যর্থ হলে, ডিভাইসগুলি স্বয়ংক্রিয়ভাবে পূর্ববর্তী সংস্করণে ফিরে আসে।
- ভার্চুয়াল A/B আপডেটগুলি শুধুমাত্র বুটলোডার দ্বারা ব্যবহৃত পার্টিশনগুলির নকল করে ন্যূনতম অতিরিক্ত স্থান ব্যবহার করে। অন্যান্য আপডেটযোগ্য পার্টিশন স্ন্যাপশট করা হয়।
পটভূমি এবং পরিভাষা
এই বিভাগটি পরিভাষা সংজ্ঞায়িত করে এবং ভার্চুয়াল A/B সমর্থন করে এমন প্রযুক্তি বর্ণনা করে। OTA ইনস্টলেশনের সময়, নতুন অপারেটিং সিস্টেমের ডেটা হয় ফিজিক্যাল পার্টিশনের জন্য তার নতুন স্লটে লেখা হয়, অথবা একটি অ্যান্ড্রয়েড নির্দিষ্ট COW ডিভাইস। ডিভাইসটি রিবুট করার পরে, dm-user এবং snapuserd ডেমন ব্যবহারের মাধ্যমে ডাইনামিক পার্টিশন ডেটা তার বেস ডিভাইসে আবার মার্জ করা হয়। এই প্রক্রিয়াটি সম্পূর্ণরূপে ইউজারস্পেসে ঘটে।
ডিভাইস-ম্যাপার
ডিভাইস-ম্যাপার হল একটি লিনাক্স ভার্চুয়াল ব্লক স্তর যা প্রায়শই অ্যান্ড্রয়েডে ব্যবহৃত হয়। গতিশীল পার্টিশনের সাথে, /system
এর মত পার্টিশনগুলি স্তরযুক্ত ডিভাইসগুলির একটি স্ট্যাক:
- স্ট্যাকের নীচে শারীরিক সুপার পার্টিশন রয়েছে (উদাহরণস্বরূপ,
/dev/block/by-name/super
)। - মাঝখানে একটি
dm-linear
ডিভাইস, সুপার পার্টিশনের কোন ব্লকগুলি প্রদত্ত গতিশীল পার্টিশন গঠন করে তা নির্দিষ্ট করে। এটি একটি A/B ডিভাইসে/dev/block/mapper/system_[a|b]
, অথবা একটি নন-A/B ডিভাইসে/dev/block/mapper/system
হিসাবে প্রদর্শিত হয়। - শীর্ষে একটি
dm-verity
ডিভাইস রয়েছে, যা যাচাইকৃত পার্টিশনের জন্য তৈরি করা হয়েছে। এই ডিভাইসটি যাচাই করে যেdm-linear
ডিভাইসে ব্লকগুলি সঠিকভাবে স্বাক্ষর করা হয়েছে। এটি/dev/block/mapper/system-verity
হিসাবে প্রদর্শিত হয় এবং এটি/system
মাউন্ট পয়েন্টের উৎস।
চিত্র 1 দেখায় যে /system
মাউন্ট পয়েন্টের নীচে স্ট্যাকটি কেমন দেখাচ্ছে।
চিত্র 1. /সিস্টেম মাউন্ট পয়েন্টের নীচে স্ট্যাক করুন
সংকুচিত স্ন্যাপশট
অ্যান্ড্রয়েড 12 এবং উচ্চতর, যেহেতু /data
পার্টিশনে স্থানের প্রয়োজনীয়তা বেশি হতে পারে, আপনি /data
পার্টিশনের উচ্চ স্থানের প্রয়োজনীয়তাগুলিকে মোকাবেলা করতে আপনার বিল্ডে সংকুচিত স্ন্যাপশটগুলি সক্ষম করতে পারেন।
ভার্চুয়াল A/B সংকুচিত স্ন্যাপশটগুলি Android 12 এবং উচ্চতর সংস্করণে উপলব্ধ নিম্নলিখিত উপাদানগুলির উপরে তৈরি করা হয়েছে:
-
dm-user
, FUSE-এর অনুরূপ একটি কার্নেল মডিউল যা ইউজারস্পেসকে ব্লক ডিভাইস প্রয়োগ করতে দেয়। -
snapuserd
, একটি ইউজারস্পেস ডেমন একটি নতুন স্ন্যাপশট বিন্যাস বাস্তবায়নের জন্য।
এই উপাদান কম্প্রেশন সক্রিয়. সংকুচিত স্ন্যাপশট ক্ষমতা বাস্তবায়নের জন্য করা অন্যান্য প্রয়োজনীয় পরিবর্তনগুলি পরবর্তী বিভাগে দেওয়া হয়েছে: সংকুচিত স্ন্যাপশটগুলির জন্য COW বিন্যাস , dm-user , এবং snapuserd ।
সংকুচিত স্ন্যাপশটের জন্য COW বিন্যাস
Android 12 এবং উচ্চতর, সংকুচিত স্ন্যাপশটগুলি একটি Android নির্দিষ্ট COW ফর্ম্যাট ব্যবহার করে। COW ফর্ম্যাটে OTA সম্পর্কে মেটাডেটা রয়েছে এবং COW অপারেশন এবং নতুন অপারেটিং সিস্টেম ডেটা সহ স্বতন্ত্র বাফার রয়েছে। কার্নেল স্ন্যাপশট ফর্ম্যাটের তুলনায় যা শুধুমাত্র প্রতিস্থাপন ক্রিয়াকলাপগুলির জন্য অনুমোদিত (স্ন্যাপশটে ব্লক Y এর বিষয়বস্তুর সাথে বেস ইমেজে ব্লক X প্রতিস্থাপন করুন), অ্যান্ড্রয়েড সংকুচিত স্ন্যাপশট COW ফর্ম্যাটটি আরও অভিব্যক্তিপূর্ণ এবং নিম্নলিখিত ক্রিয়াকলাপগুলিকে সমর্থন করে:
- অনুলিপি : বেস ডিভাইসে ব্লক X কে বেস ডিভাইসে ব্লক Y দিয়ে প্রতিস্থাপন করা উচিত।
- প্রতিস্থাপন : বেস ডিভাইসে ব্লক X স্ন্যাপশটে ব্লক Y এর বিষয়বস্তু দিয়ে প্রতিস্থাপন করা উচিত। এই ব্লক প্রতিটি gz সংকুচিত হয়.
- জিরো : বেস ডিভাইসে ব্লক এক্স সব শূন্য দিয়ে প্রতিস্থাপন করা উচিত।
- XOR : COW ডিভাইস XOR সংকুচিত বাইটগুলিকে ব্লক X এবং ব্লক Y এর মধ্যে সংরক্ষণ করে। (Android 13 এবং উচ্চতর সংস্করণে উপলব্ধ।)
সম্পূর্ণ OTA আপডেট শুধুমাত্র প্রতিস্থাপন এবং শূন্য অপারেশন নিয়ে গঠিত। ক্রমবর্ধমান OTA আপডেট অতিরিক্ত অনুলিপি অপারেশন থাকতে পারে.
ডিস্কের সম্পূর্ণ স্ন্যাপশট লেআউটটি এইরকম দেখাচ্ছে:
চিত্র 2. ডিস্কে অ্যান্ড্রয়েড COW ফরম্যাট
dm-ব্যবহারকারী
dm-user kernel মডিউল userspace
ডিভাইস-ম্যাপার ব্লক ডিভাইসগুলি বাস্তবায়ন করতে সক্ষম করে। একটি dm-ব্যবহারকারীর টেবিল এন্ট্রি /dev/dm-user/<control-name>
অধীনে একটি বিবিধ ডিভাইস তৈরি করে। একটি userspace
প্রক্রিয়া কার্নেল থেকে পড়ার এবং লেখার অনুরোধগুলি পাওয়ার জন্য ডিভাইসটিকে পোল করতে পারে। প্রতিটি অনুরোধের জন্য ব্যবহারকারীর স্থানের জন্য একটি যুক্ত বাফার থাকে (একটি পড়ার জন্য) বা প্রচার করার জন্য (লেখার জন্য)।
dm-user
kernel মডিউল কার্নেলে একটি নতুন ব্যবহারকারী-দৃশ্যমান ইন্টারফেস প্রদান করে যা upstream kernel.org কোড বেসের অংশ নয়। এটি না হওয়া পর্যন্ত, Google Android এ dm-user
ইন্টারফেস পরিবর্তন করার অধিকার সংরক্ষণ করে৷
snapuserd
dm-user
snapuserd
ইউজারস্পেস কম্পোনেন্ট ভার্চুয়াল A/B কম্প্রেশন প্রয়োগ করে। Snapuserd হল একটি ইউজারস্পেস ডেমন যা Android COW ডিভাইসগুলি লেখার এবং পড়ার দায়িত্বে রয়েছে। স্ন্যাপশটের সমস্ত I/O এই পরিষেবার মাধ্যমে যেতে হবে। OTA ইনস্টলেশনের সময়, নতুন অপারেটিং সিস্টেমের ডেটা স্ন্যাপশটে স্ন্যাপসার্ড (কম্প্রেশন সহ) দ্বারা লেখা হয়। মেটাডেটা পার্সিং এবং নতুন ব্লক ডেটা আনপ্যাক করাও এখানে পরিচালিত হয়।
XOR কম্প্রেশন
অ্যান্ড্রয়েড 13 এবং উচ্চতর ডিভাইসগুলির জন্য, XOR কম্প্রেশন বৈশিষ্ট্য, যা ডিফল্টরূপে সক্রিয় থাকে, পুরানো ব্লক এবং নতুন ব্লকগুলির মধ্যে XOR সংকুচিত বাইটগুলি সংরক্ষণ করতে ব্যবহারকারীর স্থান স্ন্যাপশটগুলিকে সক্ষম করে৷ যখন একটি ভার্চুয়াল A/B আপডেটে একটি ব্লকের মাত্র কয়েকটি বাইট পরিবর্তন করা হয়, তখন XOR কম্প্রেশন স্টোরেজ স্কিম ডিফল্ট স্টোরেজ স্কিমের চেয়ে কম জায়গা ব্যবহার করে কারণ স্ন্যাপশটগুলি সম্পূর্ণ 4K বাইট সংরক্ষণ করে না। স্ন্যাপশট আকারে এই হ্রাস করা সম্ভব কারণ XOR ডেটাতে অনেক শূন্য রয়েছে এবং কাঁচা ব্লক ডেটার চেয়ে সংকুচিত করা সহজ। Pixel ডিভাইসে, XOR কম্প্রেশন স্ন্যাপশটের আকার 25% থেকে 40% কমিয়ে দেয়।
Android 13 এবং উচ্চতর ডিভাইসে আপগ্রেড করার জন্য, XOR কম্প্রেশন সক্রিয় করা আবশ্যক। বিস্তারিত জানার জন্য, XOR কম্প্রেশন দেখুন।
স্ন্যাপশট মার্জ
Android 13 এবং উচ্চতর ডিভাইসগুলির জন্য, ভার্চুয়াল A/B কম্প্রেশনে স্ন্যাপশট এবং স্ন্যাপশট মার্জ প্রক্রিয়াগুলি snapuserd
ইউজারস্পেস উপাদান দ্বারা সঞ্চালিত হয়। অ্যান্ড্রয়েড 13 এবং উচ্চতর ডিভাইসে আপগ্রেড করার জন্য, এই বৈশিষ্ট্যটি সক্রিয় করা আবশ্যক। বিস্তারিত জানার জন্য, ইউজারস্পেস মার্জ দেখুন।
নিম্নলিখিত ভার্চুয়াল A/B কম্প্রেশন প্রক্রিয়া বর্ণনা করে:
- ফ্রেমওয়ার্ক একটি
dm-verity
ডিভাইসের/system
পার্টিশন বন্ধ করে, যা একটিdm-user
ডিভাইসের উপরে স্ট্যাক করা হয়। এর মানে হল রুট ফাইল সিস্টেম থেকে প্রতিটি I/Odm-user
এ রাউট করা হয়। -
dm-user
I/O কে ইউজারস্পেসsnapuserd
ডেমনে পাঠায়, যা I/O অনুরোধ পরিচালনা করে। - মার্জ অপারেশন সম্পূর্ণ হলে, ফ্রেমওয়ার্কটি
dm-linear
(system_base
) এর উপরেdm-verity
কেল্যাপ করে এবংdm-user
সরিয়ে দেয়।
চিত্র 3. ভার্চুয়াল A/B কম্প্রেশন প্রক্রিয়া
স্ন্যাপশট মার্জ প্রক্রিয়া বাধাগ্রস্ত হতে পারে। একত্রীকরণ প্রক্রিয়া চলাকালীন ডিভাইসটি পুনরায় বুট করা হলে, পুনরায় বুট করার পরে মার্জ প্রক্রিয়া পুনরায় শুরু হয়।
ইনইট ট্রানজিশন
সংকুচিত স্ন্যাপশট সহ বুট করার সময়, পার্টিশন মাউন্ট করার জন্য প্রথম-পর্যায়ের init-কে অবশ্যই snapuserd
শুরু করতে হবে। এটি একটি সমস্যা তৈরি করে: যখন sepolicy
লোড করা হয় এবং প্রয়োগ করা হয়, তখন snapuserd
ভুল প্রেক্ষাপটে রাখা হয় এবং সেলিনাক্স অস্বীকৃতি সহ এর পড়ার অনুরোধগুলি ব্যর্থ হয়।
এটি মোকাবেলা করার জন্য, snapuserd
init
এর সাথে লক-স্টেপে ট্রানজিশন করে, নিম্নরূপ:
- প্রথম পর্যায়ের
init
ramdisk থেকেsnapuserd
চালু করে এবং একটি এনভায়রনমেন্ট ভেরিয়েবলের মধ্যে একটি খোলা ফাইল-ডেসক্রিপ্টর সংরক্ষণ করে। - প্রথম-পর্যায়ে
init
রুট ফাইল সিস্টেমকে সিস্টেম পার্টিশনে বদল করে, তারপরinit
এর সিস্টেম কপি চালায়। -
init
এর সিস্টেম কপি একটি স্ট্রিং-এ সম্মিলিত সেপলিসি পড়ে। -
Init
সমস্ত ext4-সমর্থিত পৃষ্ঠাগুলিতেmlock()
আহ্বান করে। এটি তারপর স্ন্যাপশট ডিভাইসের জন্য সমস্ত ডিভাইস-ম্যাপার টেবিল নিষ্ক্রিয় করে, এবংsnapuserd
বন্ধ করে। এর পরে এটি পার্টিশন থেকে পড়া নিষিদ্ধ, যেহেতু এটি করার ফলে অচলাবস্থা সৃষ্টি হয়। -
snapuserd
এর ramdisk কপিতে ওপেন ডিসক্রিপ্টর ব্যবহার করে,init
সঠিক selinux প্রসঙ্গ সহ ডেমন পুনরায় চালু করে। স্ন্যাপশট ডিভাইসগুলির জন্য ডিভাইস-ম্যাপার টেবিলগুলি পুনরায় সক্রিয় করা হয়েছে। - Init
munlockall()
আহ্বান করে - এটি আবার IO সম্পাদন করা নিরাপদ।
স্থান ব্যবহার
নিম্নলিখিত টেবিলটি Pixel এর OS এবং OTA আকার ব্যবহার করে বিভিন্ন OTA প্রক্রিয়ার জন্য স্থান ব্যবহারের একটি তুলনা প্রদান করে।
আকারের প্রভাব | অ-এ/বি | A/B | ভার্চুয়াল A/B | ভার্চুয়াল A/B (সংকুচিত) |
---|---|---|---|---|
আসল কারখানার ছবি | 4.5GB সুপার (3.8G ছবি + 700M সংরক্ষিত) 1 | 9GB সুপার (3.8G + 700M সংরক্ষিত, দুটি স্লটের জন্য) | 4.5GB সুপার (3.8G ছবি + 700M সংরক্ষিত) | 4.5GB সুপার (3.8G ছবি + 700M সংরক্ষিত) |
অন্যান্য স্ট্যাটিক পার্টিশন | /ক্যাশে | কোনোটিই নয় | কোনোটিই নয় | কোনোটিই নয় |
ওটিএ চলাকালীন অতিরিক্ত স্টোরেজ (ওটিএ প্রয়োগ করার পরে স্থান ফেরত দেওয়া হয়েছে) | /ডেটাতে 1.4GB | 0 | 3.8GB 2 অন/ডেটা | 2.1GB 2 অন /ডেটা |
OTA প্রয়োগ করার জন্য মোট স্টোরেজ প্রয়োজন | 5.9GB 3 (সুপার এবং ডেটা) | 9GB (সুপার) | 8.3GB 3 (সুপার এবং ডেটা) | 6.6GB 3 (সুপার এবং ডেটা) |
1 পিক্সেল ম্যাপিংয়ের উপর ভিত্তি করে অনুমানকৃত লেআউট নির্দেশ করে।
2 নতুন সিস্টেম ইমেজ মূল হিসাবে একই আকার অনুমান.
3 রিবুট না হওয়া পর্যন্ত স্থানের প্রয়োজন ক্ষণস্থায়ী।
Android 11 ভার্চুয়াল A/B
ভার্চুয়াল A/B এর android 11 কার্নেল COW ফর্ম্যাট ব্যবহার করে গতিশীল পার্টিশনে লিখেছে। কার্নেল COW ফরম্যাট কম্প্রেশন সমর্থন করে না বলে শেষ পর্যন্ত এটিকে অবমূল্যায়ন করা হয়েছিল।
Android 12 ভার্চুয়াল A/B
অ্যান্ড্রয়েড 12-এ, কম্প্রেশন একটি অ্যান্ড্রয়েড নির্দিষ্ট COW ফর্ম্যাটের আকারে সমর্থিত। ভার্চুয়াল A/B-এর এই সংস্করণটির জন্য android-এর নির্দিষ্ট COW-এর Kernel COW ফর্ম্যাটে অনুবাদ প্রয়োজন। অবশেষে এটি android 13-এ প্রতিস্থাপিত হয়েছে যা কার্নেল COW ফরম্যাট এবং dm-snapshot
উপর নির্ভরতাকে সরিয়ে দিয়েছে।
ভার্চুয়াল A/B বাস্তবায়ন করতে, অথবা সংকুচিত স্ন্যাপশট ক্ষমতা ব্যবহার করতে, ভার্চুয়াল A/B বাস্তবায়ন দেখুন