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