Microdroid হল একটি মিনি-Android OS যা pVM-এ চলে। আপনাকে Microdroid ব্যবহার করতে হবে না, আপনি যেকোনও OS-এর সাথে VM চালু করতে পারবেন। তবে, pVM-এর প্রাথমিক ব্যবহারের ক্ষেত্রে স্ট্যান্ডঅ্যালোন OS চালানো হয় না, বরং Android-এর তুলনায় আরও বেশি গোপনীয়তা ও অখণ্ডতা গ্যারান্টি সহ অ্যাপের একটি অংশ চালানোর জন্য একটি আইসোলেটেড এক্সিকিউশন এনভায়রনমেন্ট প্রদান করা হয়।
পুরনো অপারেটিং সিস্টেমের ক্ষেত্রে, গোপনীয়তা ও অখণ্ডতা বজায় রাখার জন্য অনেক কাজ করতে হয় (প্রায়শই ডুপ্লিকেট) কারণ পুরনো অপারেটিং সিস্টেম সামগ্রিক Android আর্কিটেকচারের সাথে মানানসই হয় না। যেমন, স্ট্যান্ডার্ড Android আর্কিটেকচারের সাথে, ডেভেলপারদের pVM-এ তাদের অ্যাপের অংশ নিরাপদে লোড ও এক্সিকিউট করার একটি উপায় ইমপ্লিমেন্ট করতে হবে এবং পেলোড glibc-এর বিরুদ্ধে তৈরি করা হয়। Android অ্যাপ Bionic ব্যবহার করে, যোগাযোগের জন্য vsock-এর উপর কাস্টম প্রোটোকল প্রয়োজন এবং adb ব্যবহার করে ডিবাগিং করা চ্যালেঞ্জিং।
Microdroid, একটি অফ-দ্য-শেল্ফ OS ইমেজ প্রদান করে এই ফাঁক পূরণ করে, যা ডেভেলপারদের থেকে সবচেয়ে কম প্রচেষ্টার প্রয়োজন হয় যাতে তাদের অ্যাপের একটি অংশ pVM-এ অফলোড করা যায়। নেটিভ কোড Bionic-এর বিরুদ্ধে তৈরি করা হয়, Binder-এর মাধ্যমে কমিউনিকেশন হয় এবং এটি হোস্ট Android থেকে APEX ইমপোর্ট করার অনুমতি দেয় এবং হার্ডওয়্যার-ব্যাকড কী সহ ক্রিপ্টোগ্রাফিক অপারেশনের জন্য keystore-এর মতো Android API-এর একটি সাবসেট এক্সপোজ করে। মোটকথা, ডেভেলপাররা Microdroid-কে একটি পরিচিত এনভায়রনমেন্ট হিসেবে দেখতে পাবেন এবং এতে সেইসব টুল থাকবে যেগুলির সাথে তারা সম্পূর্ণ Android OS-এ অভ্যস্ত হয়ে উঠেছেন।
ফিচার
Microdroid হল Android-এর একটি সরলীকৃত ভার্সন যাতে pVM-এর জন্য নির্দিষ্ট কিছু অতিরিক্ত কম্পোনেন্ট থাকে। Microdroid এগুলি সাপোর্ট করে:
- NDK API-এর একটি সাবসেট (libc এবং Bionic-এর Android-এর ইমপ্লিমেন্টেশনের জন্য সব API প্রদান করা হয়)
- adb, logcat, tombstone ও gdb-এর মতো ডিবাগিং ফিচার
- যাচাই করা বুট ও SELinux
- APK-তে এম্বেড করা শেয়ার করা লাইব্রেরির সাথে একসাথে বাইনারি লোড ও এক্সিকিউট করা
- vsock-এর মাধ্যমে বাইন্ডার RPC এবং অন্তর্নিহিত ইন্টিগ্রিটি চেক সহ ফাইল এক্সচেঞ্জ
- APEX লোড করা
Microdroid এগুলি সাপোর্ট করে না:
android.\*প্যাকেজে Android Java APISystemServer ও Zygote
গ্রাফিক্স/UI
HAL
Microdroid আর্কিটেকচার
Microdroid, Cuttlefish-এর মতো, কারণ দু'টিরই এমন আর্কিটেকচার আছে যা স্ট্যান্ডার্ড Android-এর মতো। Microdroid-এ নিম্নলিখিত পার্টিশন ইমেজ থাকে যা কম্পোজিট ডিস্ক ইমেজে একসাথে গ্রুপ করা থাকে:
bootloader- কার্নেল যাচাই করে শুরু করে।boot.img- এতে কার্নেল ও ইনিট র্যামডিস্ক থাকে।vendor_boot.img- VM-নির্দিষ্ট কার্নেল মডিউল থাকে, যেমন virtio.super.img- সিস্টেম ও ভেন্ডর লজিক্যাল পার্টিশন নিয়ে গঠিত।vbmeta.img- যাচাই করা বুট মেটাডেটা থাকে।
ভার্চুয়ালাইজেশন APEX-এ পার্টিশন ইমেজ পাঠানো হয় এবং VirtualizationService-এর মাধ্যমে
একটি কম্পোজিট ডিস্ক ইমেজে প্যাকেজ করা হয়। মূল
OS কম্পোজিট ডিস্ক ইমেজ ছাড়াও, VirtualizationService এই অন্যান্য পার্টিশন তৈরি করার
জন্য দায়ী:
payload- Android-এর APEX ও APK দ্বারা পরিচালিত পার্টিশনের একটি সেটinstance- প্রতি-ইনস্ট্যান্স যাচাই করা বুট ডেটা, যেমন প্রতি-ইনস্ট্যান্স সল্ট, বিশ্বস্ত APEX পাবলিক কী এবং রোলব্যাক কাউন্টার বজায় রাখার জন্য একটি এনক্রিপ্ট করা পার্টিশন
বুট সিকোয়েন্স
Microdroid বুট সিকোয়েন্স ডিভাইস বুট হওয়ার পরে হয়। আর্কিটেকচার ডকুমেন্টের pVM ফার্মওয়্যার বিভাগে ডিভাইস বুট করার বিষয়ে আলোচনা করা হয়েছে। ছবি ১-এ Microdroid বুট সিকোয়েন্স চলাকালীন যেসব ধাপ অনুসরণ করা হয় তা দেখানো হয়েছে:
ধাপগুলির ব্যাখ্যা এখানে দেওয়া হল:
বুটলোডার crosvm-এর মাধ্যমে মেমরিতে লোড করা হয় এবং pvmfw এক্সিকিউট করা শুরু করে। বুটলোডারে যাওয়ার আগে, pvmfw দুটি কাজ করে:
- বুটলোডার কোনও বিশ্বস্ত সোর্স (Google বা OEM) থেকে এসেছে কিনা তা যাচাই করে।
- ইনস্ট্যান্স ইমেজ ব্যবহার করে একই pVM-এর একাধিক বুট জুড়ে একই বুটলোডার ব্যবহার করা নিশ্চিত করে। নির্দিষ্টভাবে, pVM প্রাথমিকভাবে খালি ইনস্ট্যান্স ইমেজ দিয়ে বুট করা হয়। pvmfw ইনস্ট্যান্স ইমেজে বুটলোডার এর পরিচয় সেভ করে এবং এনক্রিপ্ট করে। তাই, পরবর্তী বার একই ইনস্ট্যান্স ইমেজ দিয়ে pVM বুট করা হলে, pvmfw ইনস্ট্যান্স ইমেজ থেকে সেভ করা পরিচয় ডিক্রিপ্ট করে এবং যাচাই করে যে এটি সেই একই পরিচয় যা আগে সেভ করা হয়েছিল। পরিচয় আলাদা হলে, pvmfw বুট করতে অস্বীকার করে।
তারপর বুটলোডার Microdroid বুট করে।
বুটলোডার ইনস্ট্যান্স ডিস্ক অ্যাক্সেস করে। pvmfw-এর মতো, বুটলোডার একটি ইনস্ট্যান্স ডিস্ক ড্রাইভ আছে যাতে পার্টিশন ইমেজ সম্পর্কে তথ্য থাকে। আগের বুট করার সময় এই ইনস্ট্যান্সে ব্যবহৃত পাবলিক কী সহ এই তথ্য থাকে।
বুটলোডার vbmeta এবং চেইন করা পার্টিশন যাচাই করে, যেমন
bootএবংsuper, এবং সফল হলে, পরবর্তী-স্টেজ pVM সিক্রেট তৈরি করে। তারপর, Microdroid কার্নেলকে কন্ট্রোল হ্যান্ডওভার করে।যেহেতু বুটলোডার (ধাপ ৩) আগেই সুপার পার্টিশন যাচাই করেছে, তাই কার্নেল শর্তহীনভাবে সুপার পার্টিশন মাউন্ট করে। সম্পূর্ণ Android-এর মতো, সুপার পার্টিশনে dm-verity-এর উপর মাউন্ট করা একাধিক লজিক্যাল পার্টিশন থাকে। তারপর কন্ট্রোল
initপ্রসেসে পাস করা হয়, যা বিভিন্ন নেটিভ পরিষেবা শুরু করে।init.rcস্ক্রিপ্টটি সম্পূর্ণ Android-এর স্ক্রিপ্টের মতো, তবে Microdroid-এর প্রয়োজন অনুসারে তৈরি করা হয়েছে।initপ্রসেস Microdroid ম্যানেজার শুরু করে, যা ইনস্ট্যান্স ইমেজ অ্যাক্সেস করে। Microdroid ম্যানেজার পরিষেবা আগের স্টেজ থেকে পাস করা কী ব্যবহার করে ইমেজ ডিক্রিপ্ট করে এবং এই pVM বিশ্বাস করে এমন ক্লায়েন্ট APK এবং APEX-এর পাবলিক কী ও রোলব্যাক কাউন্টার পড়ে। এই তথ্য পরেzipfuseএবংapexdব্যবহার করে যখন তারা ক্লায়েন্ট APK এবং অনুরোধ করা APEX মাউন্ট করে, যথাক্রমে।Microdroid ম্যানেজার পরিষেবা
apexd-এ শুরু হয়।apexd/apex/<name>ডিরেক্টরিতে APEX মাউন্ট করে। Android এবং Microdroid কীভাবে APEX মাউন্ট করে তার মধ্যে একমাত্র পার্থক্য হল Microdroid-এ, APEX ফাইলগুলি ভার্চুয়াল ব্লক ডিভাইস (/dev/vdc1, …) থেকে আসে, সাধারণ ফাইল (/system/apex/*.apex) থেকে নয়।zipfuseহল Microdroid-এর FUSE ফাইল সিস্টেম।zipfuseক্লায়েন্ট APK মাউন্ট করে, যা আসলে ফাইল সিস্টেম হিসেবে একটি জিপ ফাইল। এর নিচে, APK ফাইলটি dm-verity সহ pVM-এর মাধ্যমে ভার্চুয়াল ব্লক ডিভাইস হিসেবে পাস করা হয়, এটি APEX-এর মতোই। APK-তে APEX-এর একটি তালিকা সহ একটি কনফিগারেশন ফাইল থাকে যা অ্যাপ ডেভেলপার এই pVM ইনস্ট্যান্সের জন্য অনুরোধ করেছেন। APEX চালু করার সময়apexdএই তালিকা ব্যবহার করে।বুট ফ্লো Microdroid ম্যানেজার পরিষেবায় ফিরে আসে। ম্যানেজার পরিষেবা তারপর Android-এর
VirtualizationService-এর সাথে Binder RPC ব্যবহার করে যোগাযোগ করে যাতে এটি ক্র্যাশ বা শাটডাউনের মতো গুরুত্বপূর্ণ ইভেন্ট রিপোর্ট করতে পারে, এবং pVM বন্ধ করার মতো অনুরোধ গ্রহণ করতে পারে। ম্যানেজার পরিষেবা APK-এর কনফিগারেশন ফাইল থেকে মূল বাইনারির লোকেশন পড়ে এবং এটি এক্সিকিউট করে।
ফাইল এক্সচেঞ্জ (AuthFS)
ইনপুট, আউটপুট ও স্টেট
এর জন্য ফাইল ব্যবহার করা এবং Android কার্নেল দ্বারা নিয়ন্ত্রিত অ্যাক্সেস সহ ফাইল ডেসক্রিপ্টর (ParcelFileDescriptor AIDL-এ টাইপ করুন
) হিসেবে এগুলি পাস করা Android কম্পোনেন্টের ক্ষেত্রে সাধারণ ব্যাপার। pVM সীমানা জুড়ে পারস্পরিক অবিশ্বাসযোগ্য এন্ডপয়েন্টের মধ্যে ফাইল আদান-প্রদানের জন্য AuthFS একই ধরনের
কার্যকারিতা প্রদান করে।
মূলত, AuthFS হল একটি রিমোট ফাইল সিস্টেম যা fs-verity-এর মতো স্বতন্ত্র অ্যাক্সেস অপারেশনে
স্বচ্ছ ইন্টিগ্রিটি চেক করে। pVM-এ রান করা ফাইল-রিডিং প্রোগ্রামের মতো
ফ্রন্টএন্ডকে, ফাইল কন্টেন্ট
সাধারণত Android-এর মতো বিশ্বাসযোগ্য নয় এমন ব্যাকএন্ড ট্যাম্পার করেছে কিনা তা শনাক্ত করার অনুমতি চেক দেয়।
ফাইল আদান-প্রদান করতে, ব্যাকএন্ড (fd\_server) প্রতি-ফাইল
কনফিগারেশনের সাথে শুরু করা হয়, যা নির্দিষ্ট করে যে এটি ইনপুট (শুধুমাত্র-পঠনযোগ্য) বা আউটপুট
(পঠন-লিখন) করার জন্য তৈরি করা হয়েছে। ইনপুটের জন্য, ফ্রন্টএন্ড নিশ্চিত করে যে কন্টেন্ট যেন পরিচিত
হ্যাশের সাথে মেলে। এর পাশাপাশি, অন-অ্যাক্সেস যাচাইকরণের জন্য একটি মারকেল ট্রিও ব্যবহার করা হয়। আউটপুটের জন্য, AuthFS
ইন্টার্নালি কন্টেন্টের একটি হ্যাশ ট্রি বজায় রাখে যা রাইট
অপারেশন থেকে পাওয়া যায় এবং ডেটা আবার রিড করার সময় ইন্টিগ্রিটি এনফোর্স করতে পারে।
বর্তমানে Binder RPC-এর উপর ভিত্তি করে ট্রান্সপোর্ট করা হয়, তবে পারফর্ম্যান্স অপ্টিমাইজ করার জন্য ভবিষ্যতে এটি পরিবর্তন করা হতে পারে।
কী ম্যানেজমেন্ট
pVM-এ একটি স্থায়ী সিলিং কী থাকে যা স্থায়ী ডেটা সুরক্ষিত রাখার জন্য উপযুক্ত এবং একটি অ্যাটেস্টেশন কী থাকে যা pVM-এর মাধ্যমে যাচাইযোগ্য স্বাক্ষর তৈরি করার জন্য উপযুক্ত।
বাইন্ডার RPC
Android-এর বেশিরভাগ ইন্টারফেস AIDL-এ প্রকাশ করা হয়, যা Binder Linux কার্নেল ড্রাইভারের উপরে তৈরি করা হয়। pVM-এর মধ্যে ইন্টারফেস সাপোর্ট করার জন্য, সকেটের মাধ্যমে কাজ করার জন্য Binder প্রোটোকল আবার লেখা হয়েছে, vsock pVM-এর ক্ষেত্রে। সকেটের মাধ্যমে অপারেট করার ফলে Android-এর আগে থেকে থাকা AIDL ইন্টারফেস এই নতুন এনভায়রনমেন্টে ব্যবহার করা যায়।
কানেকশন সেট-আপ করতে, pVM পেলোডের মতো একটি এন্ডপয়েন্ট, একটি
RpcServer অবজেক্ট তৈরি করে, একটি রুট অবজেক্ট রেজিস্টার করে এবং নতুন
কানেকশনের জন্য শোনা শুরু করে। ক্লায়েন্টরা RpcSession অবজেক্ট ব্যবহার করে এই সার্ভারের সাথে কানেক্ট করতে,
Binder অবজেক্ট পেতে এবং কার্নেল বাইন্ডার ড্রাইভারের সাথে Binder অবজেক্ট যেভাবে ব্যবহার করা হয়
ঠিক সেভাবেই এটি ব্যবহার করতে পারবেন।