ভার্চুয়ালাইজেশন সার্ভিস

VirtualizationService একটি অ্যান্ড্রয়েড সিস্টেমে চলমান একাধিক গেস্ট ভিএম (সুরক্ষিত বা অসুরক্ষিত) পরিচালনা করে, যা মূলত crosvm-এর ইনস্ট্যান্স ব্যবস্থাপনার মাধ্যমে সম্পন্ন হয়। VirtualizationService একটি AIDL API প্রদান করে, যা সিস্টেম সার্ভিস বা অ্যাপগুলো ভিএম চালু, মনিটর এবং বন্ধ করার জন্য ব্যবহার করতে পারে। VirtualizationService ব্যবহার করার জন্য, সরাসরি virtmgr এক্সিকিউট করুন অথবা javalib বা rustlib ইম্পোর্ট করুন, যা virtmgr একটি চাইল্ড প্রসেস হিসেবে এক্সিকিউট করবে।

ভিএম জীবনচক্র

একটি VM-এ অ্যাক্সেস IVirtualMachine অবজেক্ট দ্বারা ট্র্যাক করা হয়। যতক্ষণ IVirtualMachine অবজেক্টের অন্তত একটি রেফারেন্স থাকে, ততক্ষণ VM চলতে থাকে (যদি না এটি ক্র্যাশ করে বা নিজে থেকে বন্ধ হয়ে যায়)। VM বন্ধ হওয়ার আগে যদি IVirtualMachine অবজেক্টের সমস্ত রেফারেন্স বাদ দেওয়া হয়, তাহলে VirtualizationService স্বয়ংক্রিয়ভাবে VM-টি বন্ধ করে দেয়। এই প্রক্রিয়ার অর্থ হলো, যদি লো মেমরি কিলার দ্বারা VM-টি চালু করা ক্লায়েন্টটি বন্ধ হয়ে যায়, তাহলে VM-টিও বন্ধ হয়ে যায়, ফলে রিসোর্স লিক প্রতিরোধ করা যায়।

প্রতিটি ভিএম তার নিজস্ব crosvm ইনস্ট্যান্স দ্বারা পরিচালিত হয়, যা VirtualizationService ক্লায়েন্টের পক্ষ থেকে পরিচালনা করে। virtmgr এর VirtualizationService virtualizationservice এর VirtualizationServiceInternal দ্বারা প্রদত্ত CID সহ বরাদ্দকৃত গ্লোবাল রিসোর্স ব্যবহার করে প্রয়োজন অনুযায়ী এই crosvm চাইল্ড প্রসেসগুলো চালু করে এবং ভিএম-এর প্রয়োজনীয় ইমেজগুলোর ফাইল ডেসক্রিপ্টর তাদের কাছে পাঠিয়ে দেয়। এরপর VirtualizationService চাইল্ড প্রসেসগুলো কখন বন্ধ হয়ে যায় তা পর্যবেক্ষণ করে, যাতে এটি সেই অনুযায়ী অবশিষ্ট ক্লায়েন্টদের অবহিত করতে পারে।

ভিএম প্যাকেজিং

crosvm একটি VM বুট করার জন্য দুটি ভিন্ন পদ্ধতি সমর্থন করে: হয় একটি কার্নেল এবং initrd সরবরাহ করা হয়, অথবা একটি বুটলোডার সরবরাহ করা হয়। উভয় ক্ষেত্রেই, যেকোনো সংখ্যক ডিস্ক ইমেজও সরবরাহ করা যেতে পারে, যা একটি র ইমেজ বা একাধিক পার্টিশনের সমন্বয়ে গঠিত হতে পারে। এই বিভিন্ন ইমেজগুলো ক্লায়েন্ট কর্তৃক ফাইল ডেসক্রিপ্টর হিসেবে সরবরাহ করা হয়।

VirtualizationService চাহিদা অনুযায়ী কম্পোজিট ডিস্ক ইমেজ তৈরি করে। এই প্রক্রিয়াটি প্রয়োজনীয়, কারণ কম্পোজিট ডিস্ক ফাইলটি অভ্যন্তরীণভাবে ডিস্ক গঠনকারী বিভিন্ন পার্টিশন ইমেজ ফাইলকে নির্দেশ করে, যা ক্লায়েন্ট দ্বারা প্রেরিত হয় এবং crosvm-এর কাছে সরাসরি অ্যাক্সেসযোগ্য নাও হতে পারে। এই সমস্যাটি এড়ানোর জন্য, VirtualizationService নিশ্চিত করে যে crosvm দ্বারা প্রাপ্ত ফাইল ডেসক্রিপ্টর নম্বরগুলো যেন VirtualizationService কর্তৃক কম্পোজিট ইমেজ তৈরির জন্য ব্যবহৃত ফাইল ডেসক্রিপ্টর নম্বরগুলোর মতোই হয়। কম্পোজিট ডিস্ক ইমেজ প্রতিটি পার্টিশন ফাইলকে উপস্থাপন করার জন্য /proc/self/fd/N ফর্ম্যাটের ফাইলের নাম ব্যবহার করে।

মাইক্রোড্রয়েড পিভিএম-এর ক্ষেত্রে, এভিএফ-এ একটি বুটলোডার অন্তর্ভুক্ত থাকে, যা স্ট্যান্ডার্ড অ্যান্ড্রয়েড ভেরিফাইড বুট ফ্লো অনুসরণ করে একটি কম্পোজিট ডিস্ক ইমেজের পার্টিশন থেকে কার্নেল লোড করে।

ভিএম সকেট (vsock)

pVM-গুলোর মধ্যে যোগাযোগের প্রধান ইন্টারফেস হলো vsock, যা একটি স্ট্যান্ডার্ড ভার্চুও সকেট ইন্টারফেস। প্রতিটি VM একটি ৩২-বিট কনটেক্সট আইডেন্টিফায়ার (CID) দ্বারা চিহ্নিত হয়, যা একটি আইপি অ্যাড্রেসের অনুরূপ। VirtualizationService যখন VM তৈরি করে, তখন VirtualizationServiceInternal এই CID-টি VM-কে বরাদ্দ করে এবং VM তার পছন্দমতো যেকোনো পোর্ট নম্বরে সার্ভিস প্রদান করতে পারে। VM চালু থাকা অবস্থায় CID-টি অনন্য থাকে, কিন্তু VM বন্ধ করে দিলে এবং VM-টির সাথে সংযুক্ত সমস্ত IVirtualMachine বাইন্ডার হ্যান্ডেল ড্রপ হয়ে গেলে CID-এর মান পুনরায় ব্যবহার করা যেতে পারে।

ডিবাগ ইন্টারফেস

ডিবাগ করার উদ্দেশ্যে vm কমান্ডটি দেওয়া হয়েছে। এই কমান্ডের মাধ্যমে একজন ডেভেলপার শেল থেকে একটি VM চালু করতে, এর লগ দেখতে এবং VM-টি বন্ধ করতে পারেন। vm কমান্ড অথবা AVF দ্বারা প্রদত্ত অন্যান্য ইন্টারফেস ব্যবহার করে একটি VM ডিবাগযোগ্য (FULL) বা ডিবাগ-অযোগ্য (NONE) মোডে চালু করা যায়। একটি ডিবাগযোগ্য VM-এর সাহায্যে আপনি OS-স্তরের লগ দেখতে, ADB শেল অ্যাক্সেস করতে এবং ক্র্যাশ-ডাম্প বা অ্যাপ পেলোড ক্যাপচার করতে পারেন। প্রোডাকশনে একটি ডিবাগ-অযোগ্য VM ব্যবহার করার পরামর্শ দেওয়া হয়। AVF দ্বারা প্রদত্ত কমান্ড লাইন টুল এবং অন্যান্য ডিবাগ ইন্টারফেস সম্পর্কে আরও জানতে debug/README.md দেখুন।