মাইক্রোড্রয়েড

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

প্রচলিত অপারেটিং সিস্টেমগুলোতে শক্তিশালী গোপনীয়তা ও অখণ্ডতা নিশ্চিত করতে প্রচুর পরিশ্রমের প্রয়োজন হয় (যা প্রায়শই পুনরাবৃত্তিমূলক), কারণ প্রচলিত অপারেটিং সিস্টেমগুলো অ্যান্ড্রয়েডের সামগ্রিক আর্কিটেকচারের সাথে খাপ খায় না। উদাহরণস্বরূপ, স্ট্যান্ডার্ড অ্যান্ড্রয়েড আর্কিটেকচারে ডেভেলপারদের তাদের অ্যাপের একটি অংশ pVM-এ নিরাপদে লোড ও এক্সিকিউট করার একটি উপায় তৈরি করতে হয় এবং পেলোডটি glibc-এর উপর ভিত্তি করে তৈরি করা হয়। অ্যান্ড্রয়েড অ্যাপটি Bionic ব্যবহার করে, যোগাযোগের জন্য vsock-এর উপর একটি কাস্টম প্রোটোকলের প্রয়োজন হয় এবং adb ব্যবহার করে ডিবাগিং করা বেশ কঠিন।

মাইক্রোড্রয়েড একটি রেডিমেড ওএস ইমেজ সরবরাহ করে এই শূন্যস্থানগুলো পূরণ করে, যা ডেভেলপারদের তাদের অ্যাপের একটি অংশ pVM-এ অফলোড করার জন্য ন্যূনতম প্রচেষ্টার প্রয়োজন হয় এমনভাবে ডিজাইন করা হয়েছে। নেটিভ কোড বায়োনিকের উপর ভিত্তি করে তৈরি করা হয়, যোগাযোগ বাইন্ডারের মাধ্যমে সম্পন্ন হয়, এবং এটি হোস্ট অ্যান্ড্রয়েড থেকে APEX ইম্পোর্ট করার সুযোগ দেয় ও অ্যান্ড্রয়েড এপিআই-এর একটি উপসেট, যেমন হার্ডওয়্যার-সমর্থিত কী ব্যবহার করে ক্রিপ্টোগ্রাফিক অপারেশনের জন্য কীস্টোর, উন্মুক্ত করে। সার্বিকভাবে, ডেভেলপাররা মাইক্রোড্রয়েডকে একটি পরিচিত পরিবেশ হিসেবেই পাবেন, যেখানে পূর্ণাঙ্গ অ্যান্ড্রয়েড ওএস-এ ব্যবহৃত টুলগুলোই রয়েছে।

বৈশিষ্ট্য

মাইক্রোড্রয়েড হলো অ্যান্ড্রয়েডের একটি সরলীকৃত সংস্করণ, যাতে পিভিএম-এর জন্য নির্দিষ্ট কিছু অতিরিক্ত উপাদান রয়েছে। মাইক্রোড্রয়েড সমর্থন করে:

  • এনডিকে এপিআই-এর একটি উপসেট (অ্যান্ড্রয়েডের libc এবং Bionic বাস্তবায়নের জন্য সমস্ত এপিআই সরবরাহ করা হয়)
  • ডিবাগিং বৈশিষ্ট্য, যেমন adb, logcat, tombstone, এবং gdb
  • যাচাইকৃত বুট এবং SELinux
  • একটি APK-তে এমবেড করা শেয়ার্ড লাইব্রেরিসহ একটি বাইনারি লোড এবং এক্সিকিউট করা।
  • vsock-এর মাধ্যমে বাইন্ডার RPC এবং অন্তর্নিহিত অখণ্ডতা যাচাই সহ ফাইল আদান-প্রদান
  • এপেক্স লোড করা হচ্ছে

মাইক্রোড্রয়েড সমর্থন করে না:

  • android.\* প্যাকেজগুলিতে থাকা অ্যান্ড্রয়েড জাভা এপিআই

  • সিস্টেমসার্ভার এবং জাইগোট

  • গ্রাফিক্স/ইউআই

  • এইচএএল

মাইক্রোড্রয়েড স্থাপত্য

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

  • bootloader - কার্নেল যাচাই করে এবং চালু করে।
  • boot.img - এতে কার্নেল এবং ইনিট র‍্যামডিস্ক থাকে।
  • vendor_boot.img - এতে ভিএম-এর জন্য নির্দিষ্ট কার্নেল মডিউল থাকে, যেমন ভার্চিও।
  • super.img - সিস্টেম এবং ভেন্ডর লজিক্যাল পার্টিশন নিয়ে গঠিত।
  • vbmeta.img - এতে যাচাইকৃত বুট মেটাডেটা থাকে।

পার্টিশন ইমেজগুলো ভার্চুয়ালাইজেশন এপেক্স-এর সাথে অন্তর্ভুক্ত থাকে এবং VirtualizationService দ্বারা একটি কম্পোজিট ডিস্ক ইমেজ হিসেবে প্যাকেজ করা হয়। মূল ওএস কম্পোজিট ডিস্ক ইমেজ ছাড়াও, VirtualizationService এই অন্যান্য পার্টিশনগুলো তৈরির দায়িত্বে থাকে:

  • payload - অ্যান্ড্রয়েডের APEX এবং APK দ্বারা সমর্থিত পার্টিশনগুলির একটি সেট
  • instance - প্রতি-ইনস্ট্যান্স যাচাইকৃত বুট ডেটা, যেমন প্রতি-ইনস্ট্যান্স সল্ট, বিশ্বস্ত APEX পাবলিক কী, এবং রোলব্যাক কাউন্টার সংরক্ষণের জন্য একটি এনক্রিপ্টেড পার্টিশন।

বুট সিকোয়েন্স

ডিভাইস বুট-এর পরে মাইক্রোড্রয়েড বুট সিকোয়েন্স সংঘটিত হয়। আর্কিটেকচার ডকুমেন্টের pVM ফার্মওয়্যার বিভাগে ডিভাইস বুট নিয়ে আলোচনা করা হয়েছে। চিত্র ১-এ মাইক্রোড্রয়েড বুট সিকোয়েন্স চলাকালীন সংঘটিত ধাপগুলো দেখানো হয়েছে:

মাইক্রোড্রয়েড ইনস্ট্যান্সের নিরাপদ বুটফ্লো

চিত্র ১. মাইক্রোড্রয়েড ইনস্ট্যান্সের সুরক্ষিত বুটফ্লো

ধাপগুলোর ব্যাখ্যা নিচে দেওয়া হলো:

  1. crosvm দ্বারা বুটলোডারটি মেমরিতে লোড করা হয় এবং pvmfw কার্যকর হতে শুরু করে। বুটলোডারে যাওয়ার আগে, pvmfw দুটি কাজ সম্পাদন করে:

    • বুটলোডারটি কোনো বিশ্বস্ত উৎস (গুগল বা ওইএম) থেকে এসেছে কিনা তা যাচাই করে।
    • ইনস্ট্যান্স ইমেজ ব্যবহারের মাধ্যমে এটি নিশ্চিত করে যে একই pVM-এর একাধিক বুটে ধারাবাহিকভাবে একই বুটলোডার ব্যবহৃত হয়। বিশেষত, pVM-টি প্রাথমিকভাবে একটি খালি ইনস্ট্যান্স ইমেজ দিয়ে বুট করা হয়। pvmfw বুটলোডারের আইডেন্টিটি ইনস্ট্যান্স ইমেজে সংরক্ষণ করে এবং এটিকে এনক্রিপ্ট করে। ফলে, পরের বার যখন pVM-টি একই ইনস্ট্যান্স ইমেজ দিয়ে বুট করা হয়, তখন pvmfw ইনস্ট্যান্স ইমেজ থেকে সংরক্ষিত আইডেন্টিটিটি ডিক্রিপ্ট করে এবং যাচাই করে যে এটি আগের সংরক্ষিত আইডেন্টিটির মতোই কিনা। যদি আইডেন্টিটি দুটি ভিন্ন হয়, তবে pvmfw বুট করতে অস্বীকার করে।

    এরপর বুটলোডারটি মাইক্রোড্রয়েড বুট করে।

  2. বুটলোডার ইনস্ট্যান্স ডিস্ক অ্যাক্সেস করে। pvmfw-এর মতোই, বুটলোডারের একটি ইনস্ট্যান্স ডিস্ক ড্রাইভ থাকে, যেখানে পূর্ববর্তী বুটগুলোর সময় এই ইনস্ট্যান্সে ব্যবহৃত পার্টিশন ইমেজগুলোর তথ্য, পাবলিক কী সহ, সংরক্ষিত থাকে।

  3. বুটলোডার vbmeta এবং bootsuper মতো চেইনড পার্টিশনগুলো যাচাই করে এবং সফল হলে পরবর্তী ধাপের pVM সিক্রেটগুলো ডিরাইভ করে। তারপর, মাইক্রোড্রয়েড কার্নেলের কাছে নিয়ন্ত্রণ হস্তান্তর করে।

  4. যেহেতু সুপার পার্টিশনটি বুটলোডার দ্বারা ইতিমধ্যেই যাচাই করা হয়েছে (ধাপ ৩), তাই কার্নেল নিঃশর্তভাবে সুপার পার্টিশনটি মাউন্ট করে। সম্পূর্ণ অ্যান্ড্রয়েডের মতোই, সুপার পার্টিশনটি dm-verity-এর মাধ্যমে মাউন্ট করা একাধিক লজিক্যাল পার্টিশন নিয়ে গঠিত। এরপর নিয়ন্ত্রণ init প্রসেসের কাছে চলে যায়, যা বিভিন্ন নেটিভ সার্ভিস চালু করে। init.rc স্ক্রিপ্টটি সম্পূর্ণ অ্যান্ড্রয়েডের মতোই, তবে এটি মাইক্রোড্রয়েডের প্রয়োজন অনুসারে তৈরি করা হয়েছে।

  5. init প্রসেসটি মাইক্রোড্রয়েড ম্যানেজার চালু করে, যা ইনস্ট্যান্স ইমেজটি অ্যাক্সেস করে। মাইক্রোড্রয়েড ম্যানেজার সার্ভিসটি পূর্ববর্তী পর্যায় থেকে পাঠানো কী ব্যবহার করে ইমেজটি ডিক্রিপ্ট করে এবং এই pVM দ্বারা বিশ্বস্ত ক্লায়েন্ট APK ও APEX-গুলোর পাবলিক কী এবং রোলব্যাক কাউন্টারগুলো পড়ে নেয়। এই তথ্য পরবর্তীতে zipfuse এবং apexd যথাক্রমে ক্লায়েন্ট APK এবং অনুরোধ করা APEX-গুলো মাউন্ট করার সময় ব্যবহার করে।

  6. মাইক্রোড্রয়েড ম্যানেজার সার্ভিসটি apexd চালু করে।

  7. apexd /apex/<name> ডিরেক্টরিতে APEX ফাইলগুলো মাউন্ট করে। অ্যান্ড্রয়েড এবং মাইক্রোড্রয়েড যেভাবে APEX মাউন্ট করে, তার মধ্যে একমাত্র পার্থক্য হলো মাইক্রোড্রয়েডে APEX ফাইলগুলো সাধারণ ফাইল ( /system/apex/*.apex ) থেকে না এসে, ভার্চুয়াল ব্লক ডিভাইস ( /dev/vdc1 , …) থেকে আসে।

  8. zipfuse হলো মাইক্রোড্রয়েডের FUSE ফাইল সিস্টেম। zipfuse ক্লায়েন্ট APK-কে, যা মূলত একটি জিপ ফাইল, একটি ফাইল সিস্টেম হিসেবে মাউন্ট করে। এর নিচে, pVM দ্বারা apex-এর মতোই dm-verity সহ APK ফাইলটিকে একটি ভার্চুয়াল ব্লক ডিভাইস হিসেবে পাস করা হয়। APK-টিতে একটি কনফিগারেশন ফাইল থাকে, যেখানে অ্যাপ ডেভেলপারের এই pVM ইনস্ট্যান্সের জন্য অনুরোধ করা APEX-গুলোর একটি তালিকা দেওয়া থাকে। APEX-গুলো সক্রিয় করার সময় apexd এই তালিকাটি ব্যবহার করে।

  9. বুট ফ্লোটি মাইক্রোড্রয়েড ম্যানেজার সার্ভিসে ফিরে আসে। এরপর ম্যানেজার সার্ভিসটি বাইন্ডার আরপিসি (Binder RPC) ব্যবহার করে অ্যান্ড্রয়েডের VirtualizationService ) সাথে যোগাযোগ করে, যাতে এটি ক্র্যাশ বা শাটডাউনের মতো গুরুত্বপূর্ণ ঘটনা রিপোর্ট করতে পারে এবং পিভিএম (pVM) বন্ধ করার মতো অনুরোধ গ্রহণ করতে পারে। ম্যানেজার সার্ভিসটি এপিকে-র (APK) কনফিগারেশন ফাইল থেকে মূল বাইনারির অবস্থান পড়ে নেয় এবং সেটিকে এক্সিকিউট করে।

ফাইল বিনিময় (AuthFS)

অ্যান্ড্রয়েড কম্পোনেন্টগুলোর জন্য ইনপুট, আউটপুট এবং স্টেটের জন্য ফাইল ব্যবহার করা এবং অ্যান্ড্রয়েড কার্নেল দ্বারা অ্যাক্সেস নিয়ন্ত্রিত ফাইল ডেসক্রিপ্টর (AIDL-এ ParcelFileDescriptor টাইপ) হিসেবে এগুলোকে আদান-প্রদান করা একটি সাধারণ বিষয়। AuthFS, pVM সীমানা জুড়ে পারস্পরিক অবিশ্বাসযুক্ত এন্ডপয়েন্টগুলোর মধ্যে ফাইল আদান-প্রদানের জন্য অনুরূপ কার্যকারিতা প্রদান করে।

মূলত, AuthFS হলো একটি রিমোট ফাইল সিস্টেম, যা fs-verity মতোই প্রতিটি অ্যাক্সেস অপারেশনের উপর স্বচ্ছ ইন্টিগ্রিটি চেক করে। এই চেকগুলো ফ্রন্টএন্ডকে (যেমন pVM-এ চলমান কোনো ফাইল-রিডিং প্রোগ্রাম) শনাক্ত করতে সাহায্য করে যে, অবিশ্বস্ত ব্যাকএন্ড (সাধারণত অ্যান্ড্রয়েড) ফাইলের বিষয়বস্তুতে কোনো পরিবর্তন করেছে কি না।

ফাইল আদান-প্রদানের জন্য, ব্যাকএন্ড ( fd\_server ) চালু করা হয় এবং প্রতিটি ফাইলের জন্য আলাদা কনফিগারেশন নির্দিষ্ট করে দেওয়া হয় যে ফাইলটি ইনপুট (শুধুমাত্র পঠনযোগ্য) নাকি আউটপুট (পঠন ও লিখনযোগ্য) এর জন্য ব্যবহৃত হবে। ইনপুটের ক্ষেত্রে, ফ্রন্টএন্ড নিশ্চিত করে যে ফাইলের বিষয়বস্তু একটি পরিচিত হ্যাশের সাথে মেলে এবং এর পাশাপাশি অ্যাক্সেসের সময় যাচাইকরণের জন্য একটি মার্কল ট্রি ব্যবহার করে। আউটপুটের ক্ষেত্রে, AuthFS অভ্যন্তরীণভাবে লেখার অপারেশন থেকে প্রাপ্ত বিষয়বস্তুর একটি হ্যাশ ট্রি রক্ষণাবেক্ষণ করে এবং ডেটা পুনরায় পড়ার সময় তার অখণ্ডতা নিশ্চিত করতে পারে।

অন্তর্নিহিত পরিবহন ব্যবস্থাটি বর্তমানে বাইন্ডার আরপিসি (Binder RPC)-এর উপর ভিত্তি করে তৈরি, তবে কর্মক্ষমতা উন্নত করার জন্য ভবিষ্যতে এটি পরিবর্তন করা হতে পারে।

মূল ব্যবস্থাপনা

pVM-এর সাথে একটি স্থিতিশীল সিলিং কী (cealing key) প্রদান করা হয়, যা স্থায়ী ডেটা সুরক্ষার জন্য উপযুক্ত, এবং একটি অ্যাটেস্টেশন কী (attestation key) থাকে, যা pVM দ্বারা যাচাইযোগ্যভাবে উৎপাদিত সিগনেচার তৈরির জন্য উপযুক্ত।

বাইন্ডার আরপিসি

অ্যান্ড্রয়েডের অধিকাংশ ইন্টারফেস AIDL- এ প্রকাশ করা হয়, যা বাইন্ডার লিনাক্স কার্নেল ড্রাইভারের উপর ভিত্তি করে নির্মিত। pVM-গুলোর মধ্যে ইন্টারফেস সমর্থন করার জন্য, বাইন্ডার প্রোটোকলটিকে সকেটের মাধ্যমে কাজ করার উপযোগী করে নতুন করে লেখা হয়েছে; pVM-এর ক্ষেত্রে এটি হলো vsock । সকেটের মাধ্যমে কাজ করার ফলে অ্যান্ড্রয়েডের বিদ্যমান AIDL ইন্টারফেসগুলো এই নতুন পরিবেশে ব্যবহার করা সম্ভব হয়।

সংযোগ স্থাপন করার জন্য, pVM পেলোডের মতো একটি এন্ডপয়েন্ট একটি RpcServer অবজেক্ট তৈরি করে, একটি রুট অবজেক্ট রেজিস্টার করে এবং নতুন সংযোগের জন্য অপেক্ষা করা শুরু করে। ক্লায়েন্টরা একটি RpcSession অবজেক্ট ব্যবহার করে এই সার্ভারে সংযোগ করতে পারে, Binder অবজেক্টটি পেতে পারে এবং কার্নেল বাইন্ডার ড্রাইভারের সাথে যেভাবে একটি Binder অবজেক্ট ব্যবহৃত হয়, ঠিক সেভাবেই এটি ব্যবহার করতে পারে।