VirtualizationService একাধিক গেস্ট VM ম্যানেজ করে, সুরক্ষিত বা অন্য কোনওভাবে,
যা Android সিস্টেমে চলে, মূলত crosvm-এর ইনস্ট্যান্স ম্যানেজ করার মাধ্যমে।
VirtualizationService একটি AIDL API প্রকাশ করে, যা সিস্টেম পরিষেবা বা অ্যাপ VM শুরু, মনিটর ও বন্ধ করতে
ব্যবহার করতে পারে। VirtualizationService ব্যবহার করতে, সরাসরি
virtmgr এক্সিকিউট করুন অথবা javalib বা rustlib ইমপোর্ট করুন যা চাইল্ড প্রসেস হিসেবে virtmgr এক্সিকিউট করে।
VM লাইফসাইকেল
IVirtualMachine অবজেক্টের মাধ্যমে VM-এর অ্যাক্সেস ট্র্যাক করা হয়। যতক্ষণ পর্যন্ত IVirtualMachine অবজেক্টের
অন্তত একটি রেফারেন্স থাকে, ততক্ষণ পর্যন্ত VM
চালু থাকে (যদি না সেটি ক্র্যাশ করে বা নিজে থেকে বন্ধ হয়ে যায়)। VM বন্ধ করার আগে IVirtualMachine অবজেক্টের
সব রেফারেন্স সরিয়ে দেওয়া হলে, VirtualizationService
VM অটোমেটিক বন্ধ করে দেয়। এই প্রসেস থেকে বোঝা যায় যে
VM চালু করা ক্লায়েন্টকে লো মেমরি কিলার বন্ধ করে দিলে,
VM-ও বন্ধ হয়ে যায়, এর ফলে রিসোর্স লিক আটকানো যায়।
প্রতিটি VM-কে crosvm-এর নিজস্ব ইনস্ট্যান্স ম্যানেজ করে, যা VirtualizationService
ক্লায়েন্টের হয়ে ম্যানেজ করে। VirtualizationService-এ virtmgr
প্রয়োজন অনুযায়ী বরাদ্দ করা গ্লোবাল রিসোর্স সহ এইসব crosvm চাইল্ড প্রসেস শুরু করে
যার মধ্যে VirtualizationServiceInternal-এর দ্বারা অনুমোদিত CID অন্তর্ভুক্ত থাকে
virtualizationservice-এ এবং VM-এর প্রয়োজনীয় ছবির জন্য ফাইল ডেসক্রিপটর পাস করে। VirtualizationService তারপরে চাইল্ড প্রসেস মনিটর করে দেখে যে সেটি
বন্ধ হয়ে গেছে কিনা, যাতে সেই অনুযায়ী বাকি ক্লায়েন্টদের বিজ্ঞপ্তি পাঠানো যায়।
VM প্যাকেজিং
crosvm-এ VM বুট করার দুটি আলাদা আলাদা পদ্ধতি কাজ করে: হয় কার্নেল ও initrd প্রদান করা হয় অথবা বুটলোডার প্রদান করা হয়। যেকোনও ক্ষেত্রেই, ডিস্ক ইমেজের একটি ইচ্ছামতো সংখ্যাও প্রদান করা যেতে পারে, যা একটি র ইমেজ বা একাধিক পার্টিশনের কম্পোজিট হতে পারে। ক্লায়েন্ট ফাইল ডেসক্রিপ্টর হিসেবে বিভিন্ন ছবি প্রদান করে।
VirtualizationService চাহিদা অনুযায়ী কম্পোজিট ডিস্ক ইমেজ তৈরি করে। এই প্রসেসটি
প্রয়োজনীয় কারণ কম্পোজিট ডিস্ক ফাইল ইন্টার্নালি ডিস্ক কম্পোজ করা বিভিন্ন
পার্টিশন ইমেজ ফাইলকে রেফার করে, যা ক্লায়েন্ট পাস করে এবং
crosvm-এর মাধ্যমে সরাসরি অ্যাক্সেসযোগ্য নাও হতে পারে। এই সমস্যার সমাধান করতে,
VirtualizationService নিশ্চিত করে যে
crosvm-এর উত্তরাধিকার সূত্রে প্রাপ্ত ফাইল ডেসক্রিপ্টর নম্বরগুলি VirtualizationService
কম্পোজিট ছবি তৈরি করার সময় ব্যবহৃত ফাইল ডেসক্রিপ্টর নম্বরের মতোই। কম্পোজিট ডিস্ক ইমেজ প্রতিটি পার্টিশন ফাইল দেখানোর জন্য
/proc/self/fd/N ফর্মে ফাইলের নাম ব্যবহার করে।
Microdroid pVM-এর জন্য, AVF-এ একটি বুটলোডার থাকে, যা স্ট্যান্ডার্ড Android Verified Boot ফ্লো অনুসরণ করে কম্পোজিট ডিস্ক ইমেজের একটি পার্টিশন থেকে কার্নেল লোড করে।
VM সকেট (vsock)
pVM-এর মধ্যে যোগাযোগের প্রাথমিক ইন্টারফেস হল vsock, এটি একটি স্ট্যান্ডার্ড
virtio সকেট ইন্টারফেস। প্রতিটি VM-কে ৩২-বিট কনটেক্সট আইডেন্টিফায়ার (CID) দ্বারা শনাক্ত করা হয়, যা IP অ্যাড্রেসের মতো, যা
VirtualizationServiceInternal VM-কে অ্যাসাইন করে যখন VirtualizationService
VM তৈরি করে এবং VM যে পোর্ট নম্বর বেছে নেয় তাতে পরিষেবা দেখাতে পারে।
VM চলাকালীন CID অনন্য হয়, কিন্তু VM বন্ধ হয়ে গেলে এবং VM-এর সাথে যুক্ত
সব IVirtualMachine বাইন্ডার হ্যান্ডেল
ড্রপ হয়ে গেলে CID ভ্যালু রিসাইকেল করা যেতে পারে।
ডিবাগ ইন্টারফেস
vm কমান্ডটি ডিবাগ করার উদ্দেশ্যে প্রদান করা হয়েছে। এই কমান্ডের মাধ্যমে কোনও ডেভেলপার
শেল থেকে VM চালু করতে, এর লগ দেখতে এবং VM বন্ধ করতে পারেন। vm
কমান্ড বা AVF-এর মাধ্যমে প্রদান করা অন্যান্য ইন্টারফেসের সাহায্যে, VM ডিবাগ করা যায় (FULL) বা ডিবাগ করা যায় না (NONE) এমন মোডে চালু করা যেতে পারে। ডিবাগ করা যায় এমন VM-এর সাহায্যে আপনি
OS-লেভেল লগ দেখতে, ADB শেল অ্যাক্সেস করতে এবং ক্র্যাশ-ডাম্প বা অ্যাপ পেলোড ক্যাপচার করতে পারবেন।
প্রোডাকশনে নন-ডিবাগেবল VM ব্যবহার করার সাজেশন দেওয়া হয়। AVF-এর দেওয়া কমান্ড লাইন টুল ও অন্যান্য ডিবাগ ইন্টারফেস সম্পর্কে আরও জানতে, debug/README.md দেখুন।