VirtualizationService چندین ماشین مجازی مهمان، محافظتشده یا غیره، را که روی سیستم اندروید اجرا میشوند، عمدتاً با مدیریت نمونههای crosvm مدیریت میکند. VirtualizationService یک API AIDL ارائه میدهد که سرویسها یا برنامههای سیستم میتوانند از آن برای شروع، نظارت و توقف ماشینهای مجازی استفاده کنند. برای استفاده از VirtualizationService ، virtmgr مستقیماً اجرا کنید یا javalib یا rustlib را وارد کنید که virtmgr به عنوان یک فرآیند فرزند اجرا میکند.
چرخه حیات ماشین مجازی
دسترسی به یک ماشین مجازی توسط شیء IVirtualMachine ردیابی میشود. تا زمانی که حداقل یک ارجاع به شیء IVirtualMachine وجود داشته باشد، ماشین مجازی به اجرای خود ادامه میدهد (مگر اینکه خود به خود از کار بیفتد یا خاموش شود). اگر تمام ارجاعات به شیء IVirtualMachine قبل از خاموش شدن ماشین مجازی حذف شوند، VirtualizationService به طور خودکار ماشین مجازی را خاموش میکند. این فرآیند به این معنی است که اگر کلاینتی که ماشین مجازی را راهاندازی کرده است توسط low memory killer خاموش شود، ماشین مجازی نیز خاموش میشود و در نتیجه از نشت منابع جلوگیری میشود.
هر ماشین مجازی توسط نمونه crosvm مخصوص به خود مدیریت میشود که VirtualizationService به نوبه خود آن را به نمایندگی از کلاینت مدیریت میکند. VirtualizationService در virtmgr این فرآیندهای فرزند crosvm را در صورت نیاز با منابع سراسری اختصاص داده شده از جمله CID اعطا شده توسط VirtualizationServiceInternal در virtualizationservice آغاز میکند و توصیفگرهای فایل مربوط به تصاویری که ماشین مجازی نیاز دارد را به آنها ارسال میکند. VirtualizationService سپس فرآیند فرزند را برای زمان از کار افتادن آنها رصد میکند تا بتواند به کلاینتهای باقی مانده اطلاع دهد.
بستهبندی ماشین مجازی
crosvm از دو روش مختلف برای بوت کردن یک ماشین مجازی پشتیبانی میکند: یا یک هسته و initrd ارائه میشوند یا یک بوت لودر ارائه میشود. در هر صورت، میتوان تعداد دلخواهی از تصاویر دیسک را نیز ارائه داد که ممکن است یک تصویر خام یا ترکیبی از چندین پارتیشن باشد. تصاویر مختلف توسط کلاینت به عنوان توصیفگر فایل ارائه میشوند.
VirtualizationService تصاویر دیسک ترکیبی را بنا به تقاضا میسازد. این فرآیند ضروری است زیرا فایل دیسک ترکیبی به صورت داخلی به فایلهای تصویر پارتیشن مختلفی که دیسک را تشکیل میدهند اشاره دارد که توسط کلاینت ارسال میشوند و ممکن است مستقیماً توسط crosvm قابل دسترسی نباشند. برای حل این مشکل، VirtualizationService تضمین میکند که شمارههای توصیفگر فایل به ارث رسیده توسط crosvm همان شمارههای توصیفگر فایلی باشند که VirtualizationService در ایجاد تصاویر ترکیبی استفاده کرده است. تصویر دیسک ترکیبی از نام فایلها به شکل /proc/self/fd/N برای نمایش هر فایل پارتیشن استفاده میکند.
برای ماشینهای مجازی میکرودروید، AVF شامل یک بوتلودر است که هسته را از یک پارتیشن از یک تصویر دیسک ترکیبی، با پیروی از جریان استاندارد بوت تأیید شده اندروید، بارگذاری میکند.
سوکتهای ماشین مجازی (vsock)
رابط اصلی برای ارتباط بین pVMها، vsock است که یک رابط سوکت استاندارد virtio است. هر ماشین مجازی توسط یک شناسه زمینه ۳۲ بیتی (CID) شناسایی میشود که مشابه یک آدرس IP است که VirtualizationServiceInternal هنگام ایجاد ماشین VirtualizationService به آن اختصاص میدهد و میتواند سرویسها را روی هر شماره پورتی که ماشین مجازی انتخاب میکند، نمایش دهد. CID در حین اجرای ماشین مجازی منحصر به فرد است، اما مقدار CID میتواند پس از خاتمه یافتن ماشین مجازی و حذف شدن تمام مدیریتهای اتصال IVirtualMachine به ماشین مجازی، بازیافت شود.
رابط اشکالزدایی
دستور vm برای اهداف اشکالزدایی ارائه شده است. این دستور به توسعهدهنده اجازه میدهد تا یک ماشین مجازی را از پوسته شروع کند، گزارشهای آن را مشاهده کند و ماشین مجازی را خاتمه دهد. با دستور vm یا سایر رابطهای ارائه شده توسط AVF، یک ماشین مجازی میتواند در حالت اشکالزدایی (FULL) یا اشکالزدایی نشده (NONE) شروع شود. با یک ماشین مجازی اشکالزدایی شده، میتوانید گزارشهای سطح سیستم عامل را مشاهده کنید، به پوسته ADB دسترسی پیدا کنید و crash-dump یا payload برنامه را ضبط کنید. توصیه میشود در محیط عملیاتی از یک ماشین مجازی اشکالزدایی نشده استفاده کنید. برای اطلاعات بیشتر در مورد ابزار خط فرمان و سایر رابطهای اشکالزدایی که AVF ارائه میدهد، به debug/README.md مراجعه کنید.