ভার্চুয়াল A/B ওভারভিউ

ভার্চুয়াল এ/বি হলো অ্যান্ড্রয়েডের প্রধান আপডেট প্রক্রিয়া। ভার্চুয়াল এ/বি পুরোনো এ/বি আপডেট (দেখুন এ/বি সিস্টেম আপডেট ) এবং নন-এ/বি-এর উপর ভিত্তি করে তৈরি, যা আপডেটের জন্য প্রয়োজনীয় অতিরিক্ত জায়গা কমানোর উদ্দেশ্যে অ্যান্ড্রয়েড ১৫-এ বাতিল করা হয়েছে।

ভার্চুয়াল এ/বি-তে ডাইনামিক পার্টিশনের জন্য আসলে কোনো অতিরিক্ত স্লট নেই, ডাইনামিক পার্টিশন দেখুন। এর পরিবর্তে, ডেল্টা একটি স্ন্যাপশটে লেখা হয় এবং সফল বুট নিশ্চিত করার পর বেস পার্টিশনের সাথে মার্জ করা হয়। ভার্চুয়াল এ/বি একটি অ্যান্ড্রয়েড-নির্দিষ্ট স্ন্যাপশট ফরম্যাট ব্যবহার করে। কম্প্রেসড স্ন্যাপশটের জন্য COW ফরম্যাট দেখুন, যা স্ন্যাপশটকে কম্প্রেস করতে এবং ডিস্কের স্থান ব্যবহার কমাতে সাহায্য করে। একটি সম্পূর্ণ OTA-তে কম্প্রেশনের মাধ্যমে স্ন্যাপশটের আকার প্রায় ৪৫% কমে যায় এবং ইনক্রিমেন্টাল 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 মাউন্ট পয়েন্টের উৎস।

চিত্র ১-এ দেখানো হয়েছে /system মাউন্ট পয়েন্টের অধীনে স্ট্যাকটি দেখতে কেমন।

Partition stacking underneath
system

চিত্র ১. /system মাউন্ট পয়েন্টের অধীনে থাকা স্ট্যাক।

সংকুচিত স্ন্যাপশট

অ্যান্ড্রয়েড ১২ এবং এর পরবর্তী সংস্করণগুলোতে, /data /data বেশি জায়গার প্রয়োজন হতে পারে বলে, আপনি আপনার বিল্ডে কম্প্রেসড স্ন্যাপশট চালু করে এই অতিরিক্ত জায়গার চাহিদা মেটাতে পারেন।

ভার্চুয়াল এ/বি কম্প্রেসড স্ন্যাপশটগুলো অ্যান্ড্রয়েড ১২ এবং এর পরবর্তী সংস্করণগুলোতে উপলব্ধ নিম্নলিখিত উপাদানগুলোর উপর ভিত্তি করে নির্মিত হয়:

  • dm-user , FUSE-এর অনুরূপ একটি কার্নেল মডিউল যা ইউজারস্পেসকে ব্লক ডিভাইস বাস্তবায়ন করতে সক্ষম করে।
  • snapuserd , একটি নতুন স্ন্যাপশট ফরম্যাট বাস্তবায়নের জন্য ব্যবহৃত একটি ইউজারস্পেস ডেমন।

এই উপাদানগুলো কম্প্রেশন সক্ষম করে। কম্প্রেসড স্ন্যাপশট সক্ষমতা বাস্তবায়নের জন্য করা অন্যান্য প্রয়োজনীয় পরিবর্তনগুলো পরবর্তী বিভাগগুলোতে দেওয়া হয়েছে: কম্প্রেসড স্ন্যাপশটের জন্য COW ফরম্যাট , dm-user , এবং snapuserd

সংকুচিত স্ন্যাপশটের জন্য COW ফরম্যাট

অ্যান্ড্রয়েড ১২ এবং তার পরবর্তী সংস্করণগুলিতে, কম্প্রেসড স্ন্যাপশটগুলি একটি অ্যান্ড্রয়েড-নির্দিষ্ট COW ফরম্যাট ব্যবহার করে। COW ফরম্যাটে OTA সম্পর্কিত মেটাডেটা থাকে এবং এতে COW অপারেশন ও নতুন অপারেটিং সিস্টেম ডেটা ধারণকারী স্বতন্ত্র বাফার থাকে। কার্নেল স্ন্যাপশট ফরম্যাটের তুলনায়, যা শুধুমাত্র রিপ্লেস অপারেশনের (বেস ইমেজের ব্লক X-কে স্ন্যাপশটের ব্লক Y- এর বিষয়বস্তু দিয়ে প্রতিস্থাপন করা) অনুমতি দিত, অ্যান্ড্রয়েড কম্প্রেসড স্ন্যাপশটের COW ফরম্যাটটি আরও বেশি এক্সপ্রেসিভ এবং নিম্নলিখিত অপারেশনগুলি সমর্থন করে:

  • অনুলিপি : মূল ডিভাইসের ব্লক X-কে মূল ডিভাইসের ব্লক Y দ্বারা প্রতিস্থাপন করতে হবে।
  • প্রতিস্থাপন : বেস ডিভাইসের ব্লক X-কে স্ন্যাপশটের ব্লক Y- এর বিষয়বস্তু দিয়ে প্রতিস্থাপন করতে হবে। এই ব্লকগুলোর প্রতিটি gz কম্প্রেসড।
  • শূন্য : বেস ডিভাইসের ব্লক X-কে সম্পূর্ণ শূন্য দিয়ে প্রতিস্থাপন করতে হবে।
  • XOR : COW ডিভাইসটি ব্লক X এবং ব্লক Y- এর মধ্যে XOR সংকুচিত বাইট সংরক্ষণ করে। (অ্যান্ড্রয়েড ১৩ এবং তার পরবর্তী সংস্করণগুলিতে উপলব্ধ।)

সম্পূর্ণ OTA আপডেটে শুধুমাত্র রিপ্লেস এবং জিরো অপারেশন থাকে। ইনক্রিমেন্টাল OTA আপডেটে এর সাথে কপি অপারেশনও থাকতে পারে।

ডিস্কে সম্পূর্ণ স্ন্যাপশট লেআউটটি দেখতে এইরকম:

cow format

চিত্র ২. ডিস্কে অ্যান্ড্রয়েড COW ফরম্যাট

ডিএম-ব্যবহারকারী

dm-user কার্নেল মডিউল userspace ডিভাইস-ম্যাপার ব্লক ডিভাইস বাস্তবায়ন করতে সক্ষম করে। একটি dm-user টেবিল এন্ট্রি /dev/dm-user/<control-name> এর অধীনে একটি বিবিধ ডিভাইস তৈরি করে। একটি userspace প্রসেস কার্নেল থেকে রিড এবং রাইট অনুরোধ গ্রহণ করার জন্য ডিভাইসটিকে পোল করতে পারে। প্রতিটি অনুরোধের সাথে একটি বাফার যুক্ত থাকে, যা ইউজারস্পেস হয় পপুলেট (রিডের জন্য) অথবা প্রোপাগেট (রাইটের জন্য) করতে পারে।

dm-user কার্নেল মডিউলটি কার্নেলের জন্য একটি নতুন ব্যবহারকারী-দৃশ্যমান ইন্টারফেস প্রদান করে, যা আপস্ট্রিম kernel.org কোডবেসের অংশ নয়। যতক্ষণ না এটি অন্তর্ভুক্ত হচ্ছে, গুগল অ্যান্ড্রয়েডে dm-user ইন্টারফেসটি পরিবর্তন করার অধিকার সংরক্ষণ করে।

স্ন্যাপইউজার্ড

dm-user এর snapuserd ইউজারস্পেস কম্পোনেন্টটি ভার্চুয়াল এ/বি কম্প্রেশন বাস্তবায়ন করে। snapuserd হলো একটি ইউজারস্পেস ডেমন যা অ্যান্ড্রয়েড COW ডিভাইসগুলোতে লেখা এবং পড়ার দায়িত্বে থাকে। স্ন্যাপশটে সমস্ত I/O অবশ্যই এই সার্ভিসের মাধ্যমে সম্পন্ন হতে হবে। OTA ইনস্টলেশনের সময়, নতুন অপারেটিং সিস্টেমের ডেটা snapuserd দ্বারা (কম্প্রেশন সহ) স্ন্যাপশটে লেখা হয়। মেটাডেটা পার্সিং এবং নতুন ব্লক ডেটা আনপ্যাক করার কাজও এখানেই সম্পন্ন করা হয়।

XOR কম্প্রেশন

অ্যান্ড্রয়েড ১৩ এবং তার পরবর্তী সংস্করণ সহ লঞ্চ হওয়া ডিভাইসগুলিতে, ডিফল্টরূপে সক্রিয় থাকা XOR কম্প্রেশন ফিচারটি ইউজারস্পেস স্ন্যাপশটকে পুরোনো এবং নতুন ব্লকের মধ্যে XOR কম্প্রেসড বাইট সংরক্ষণ করতে সক্ষম করে। যখন একটি ভার্চুয়াল A/B আপডেটে কোনো ব্লকের মাত্র কয়েকটি বাইট পরিবর্তিত হয়, তখন XOR কম্প্রেশন স্টোরেজ স্কিমটি ডিফল্ট স্টোরেজ স্কিমের চেয়ে কম জায়গা ব্যবহার করে, কারণ স্ন্যাপশটগুলি সম্পূর্ণ ৪কেবি বাইট সংরক্ষণ করে না। স্ন্যাপশটের আকারের এই হ্রাস সম্ভব হয় কারণ XOR ডেটাতে অনেক শূন্য থাকে এবং এটি র ডেটা ব্লকের চেয়ে কম্প্রেস করা সহজ। পিক্সেল ডিভাইসগুলিতে, XOR কম্প্রেশন স্ন্যাপশটের আকার ২৫% থেকে ৪০% পর্যন্ত কমিয়ে দেয়।

যেসব ডিভাইস Android 13 বা তার পরবর্তী সংস্করণে আপগ্রেড করা হচ্ছে, সেগুলোতে XOR কম্প্রেশন অবশ্যই সক্রিয় করতে হবে। বিস্তারিত জানতে, XOR কম্প্রেশন দেখুন।

স্ন্যাপশট মার্জ

অ্যান্ড্রয়েড ১৩ এবং তার পরবর্তী সংস্করণ সহ লঞ্চ হওয়া ডিভাইসগুলির জন্য, ভার্চুয়াল এ/বি কম্প্রেশনের স্ন্যাপশট এবং স্ন্যাপশট মার্জ প্রক্রিয়াগুলি snapuserd ইউজারস্পেস কম্পোনেন্ট দ্বারা সম্পাদিত হয়। অ্যান্ড্রয়েড ১৩ এবং তার পরবর্তী সংস্করণে আপগ্রেড করা ডিভাইসগুলির জন্য, এই ফিচারটি অবশ্যই সক্রিয় করতে হবে। বিস্তারিত জানতে, ইউজারস্পেস মার্জ দেখুন।

নিম্নলিখিতটি ভার্চুয়াল এ/বি কম্প্রেশন প্রক্রিয়া বর্ণনা করে:

  1. ফ্রেমওয়ার্কটি /system পার্টিশনটিকে একটি dm-verity ডিভাইস থেকে মাউন্ট করে, যা আবার একটি dm-user ডিভাইসের উপরে অবস্থিত। এর মানে হলো, রুট ফাইল সিস্টেম থেকে প্রতিটি I/O dm-user দিকে রাউট করা হয়।
  2. dm-user ইনপুট/আউটপুট (I/O) ইউজারস্পেস snapuserd ডেমন-এর কাছে পাঠিয়ে দেয়, যেটি I/O অনুরোধটি পরিচালনা করে।
  3. মার্জ অপারেশন সম্পন্ন হলে, ফ্রেমওয়ার্কটি dm-verity dm-linear ( system_base )-এর উপরে একীভূত করে এবং dm-user সরিয়ে দেয়।

ভার্চুয়াল এ/বি কম্প্রেশন প্রক্রিয়া

চিত্র ৩. ভার্চুয়াল এ/বি কম্প্রেশন প্রক্রিয়া

স্ন্যাপশট মার্জ প্রক্রিয়াটি বাধাগ্রস্ত হতে পারে। মার্জ প্রক্রিয়া চলাকালীন যদি ডিভাইসটি রিবুট করা হয়, তবে রিবুটের পর মার্জ প্রক্রিয়াটি পুনরায় শুরু হয়।

ইনিট ট্রানজিশন

কম্প্রেসড স্ন্যাপশট দিয়ে বুট করার সময়, পার্টিশন মাউন্ট করার জন্য প্রথম ধাপের ইনিট-কে অবশ্যই snapuserd চালু করতে হয়। এতে একটি সমস্যা তৈরি হয়: যখন sepolicy লোড ও প্রয়োগ করা হয়, তখন snapuserd ভুল কনটেক্সটে চলে যায় এবং selinux ডিনায়ালের কারণে এর রিড রিকোয়েস্টগুলো ব্যর্থ হয়।

এর সমাধান করতে, snapuserd নিম্নরূপভাবে init সাথে তাল মিলিয়ে পরিবর্তিত হয়:

  1. প্রথম পর্যায়ের init র‍্যামডিস্ক থেকে snapuserd চালু করে এবং এতে খোলা একটি ফাইল-ডেসক্রিপ্টরকে একটি এনভায়রনমেন্ট ভেরিয়েবলে সংরক্ষণ করে।
  2. প্রথম ধাপের init রুট ফাইলসিস্টেমকে সিস্টেম পার্টিশনে পরিবর্তন করে, তারপর init -এর সিস্টেম কপিটি কার্যকর করে।
  3. init এর সিস্টেম কপিটি সম্মিলিত sepolicy-কে একটি স্ট্রিং-এ পড়ে নেয়।
  4. Init সমস্ত ext4-সমর্থিত পেজগুলিতে mlock() কল করে। এরপর এটি স্ন্যাপশট ডিভাইসগুলির জন্য সমস্ত ডিভাইস-ম্যাপার টেবিল নিষ্ক্রিয় করে এবং snapuserd বন্ধ করে দেয়। এর পরে পার্টিশন থেকে পড়া নিষিদ্ধ, কারণ তা করলে ডেডলক সৃষ্টি হয়।
  5. snapuserd এর র‍্যামডিস্ক কপির ওপেন ডেসক্রিপ্টর ব্যবহার করে, init সঠিক selinux কনটেক্সট সহ ডেমনটিকে পুনরায় চালু করে। স্ন্যাপশট ডিভাইসগুলির জন্য ডিভাইস-ম্যাপার টেবিলগুলি পুনরায় সক্রিয় করা হয়।
  6. Init, munlockall() কল করে – এখন আবার IO অপারেশন করা নিরাপদ।

স্থান ব্যবহার

নিচের সারণিতে পিক্সেলের ওএস এবং ওটিএ সাইজ ব্যবহার করে বিভিন্ন ওটিএ মেকানিজমের স্পেস ব্যবহারের একটি তুলনা দেওয়া হয়েছে।

আকারের প্রভাব নন-এ/বি এ/বি ভার্চুয়াল এ/বি ভার্চুয়াল এ/বি (সংকুচিত)
আসল কারখানার ছবি ৪.৫ জিবি সুপার (৩.৮ জিবি ইমেজ + ৭০০ এমবি সংরক্ষিত) ৯ জিবি সুপার (দুটি স্লটের জন্য ৩.৮ জিবি + ৭০০ মেগাবাইট সংরক্ষিত) ৪.৫ জিবি সুপার (৩.৮ জিবি ইমেজ + ৭০০ এমবি সংরক্ষিত) ৪.৫ জিবি সুপার (৩.৮ জিবি ইমেজ + ৭০০ এমবি সংরক্ষিত)
অন্যান্য স্থির পার্টিশন /ক্যাশ কোনোটিই না কোনোটিই না কোনোটিই না
OTA চলাকালীন অতিরিক্ত স্টোরেজ (OTA আবেদন করার পর স্থান ফেরত দেওয়া হবে) /data-তে ১.৪ জিবি /data-তে 3.8GB 2 /data-তে 2.1GB 2
OTA প্রয়োগ করার জন্য মোট প্রয়োজনীয় স্টোরেজ ৫.৯ জিবি (সুপার ও ডেটা) ৯জিবি (সুপার) ৮.৩ জিবি (সুপার ও ডেটা) ৬.৬ জিবি (সুপার ও ডেটা)

পিক্সেল ম্যাপিংয়ের উপর ভিত্তি করে অনুমিত বিন্যাস নির্দেশ করে।

ধরে নেওয়া হচ্ছে নতুন সিস্টেম ইমেজটির আকার মূলটির সমান।

৩. রিবুট না করা পর্যন্ত স্থানের প্রয়োজনীয়তা অস্থায়ী।

অ্যান্ড্রয়েড ১১ ভার্চুয়াল এ/বি

ভার্চুয়াল এ/বি-এর অ্যান্ড্রয়েড ১১ কার্নেল COW ফরম্যাট ব্যবহার করে ডাইনামিক পার্টিশনে লিখত। পরবর্তীতে এটি বাতিল করা হয়, কারণ কার্নেল COW ফরম্যাট কম্প্রেশন সমর্থন করে না।

অ্যান্ড্রয়েড ১২ ভার্চুয়াল এ/বি

অ্যান্ড্রয়েড ১২-এ, একটি অ্যান্ড্রয়েড-নির্দিষ্ট COW ফরম্যাটের মাধ্যমে কম্প্রেশন সমর্থিত ছিল। ভার্চুয়াল এ/বি-এর এই সংস্করণটির জন্য অ্যান্ড্রয়েড-নির্দিষ্ট COW ফরম্যাটটিকে কার্নেল COW ফরম্যাটে অনুবাদ করার প্রয়োজন হতো। অবশেষে অ্যান্ড্রয়েড ১৩-এ এটি প্রতিস্থাপিত হয়, যা কার্নেল COW ফরম্যাট এবং dm-snapshot এর উপর নির্ভরতা দূর করে।

ভার্চুয়াল এ/বি প্রয়োগ করতে, বা সংকুচিত স্ন্যাপশট ক্ষমতা ব্যবহার করতে, ভার্চুয়াল এ/বি প্রয়োগ দেখুন।