سرویس مجازی سازی

VirtualizationService تمام ماشین های مجازی مهمان را، محافظت شده یا غیره، که در سیستم اندروید اجرا می شوند، عمدتاً با مدیریت نمونه های crosvm مدیریت می کند. VirtualizationService یک API AIDL را نشان می دهد که سرویس ها یا برنامه های سیستم می توانند از آن برای راه اندازی، نظارت و توقف VM ها استفاده کنند.

AIDL API

VirtualizationService یک API AIDL را نشان می دهد که مشتریان می توانند از آن برای ارائه تصاویر و راه اندازی یک VM استفاده کنند. این توضیحات می تواند یک پیکربندی خام ماشین مجازی با توصیفگرهای فایل برای بوت لودر یا هسته و تصاویر دیسک مختلف باشد که در ماشین مجازی گنجانده شود، یا یک پیکربندی Microdroid که در آن مشتری فقط بار را ارائه می دهد و ماشین مجازی با هسته و زیرساخت استاندارد Microdroid شروع می شود. . سپس VirtualizationService یک شی IVirtualMachine Binder را برمی گرداند که نشان دهنده VM است. مشتری که VM را راه اندازی کرده است می تواند با استفاده از مکانیسم های معمول Binder، شی Binder را با سایر فرآیندها به اشتراک بگذارد.

IVirtualMachine دارای روش های AIDL برای به دست آوردن اطلاعات در مورد VM است، مانند CID، که می تواند برای برقراری ارتباط با آن از طریق vsock استفاده شود، و همچنین اجازه می دهد تا زمانی که VM متوقف می شود، یک تماس برگشتی ثبت شود تا فراخوانی شود. در مورد ماشین‌های مجازی Microdroid، شی IVirtualMachine نیز می‌تواند برای راه‌اندازی اتصالات Binder به VM استفاده شود.

چرخه حیات VM

دسترسی به VM توسط شی IVirtualMachine ردیابی می شود. تا زمانی که حداقل یک مرجع به شی IVirtualMachine باشد، ماشین مجازی به کار خود ادامه می دهد (مگر اینکه به خودی خود خراب یا خاموش شود). اگر تمام ارجاعات به شی IVirtualMachine قبل از خاموش شدن VM حذف شوند، VirtualizationService به طور خودکار VM را خاموش می کند. این فرآیند به این معنی است که اگر کلاینتی که VM را راه اندازی کرده است توسط کشنده حافظه کم خاموش شود، VM نیز خاموش می شود، بنابراین از نشت منابع جلوگیری می شود.

هر VM توسط نمونه خود از crosvm مدیریت می شود که VirtualizationService به نوبه خود از طرف مشتری آن را مدیریت می کند. VirtualizationService این پردازش‌های فرزند crosvm را در صورت لزوم شروع می‌کند و توصیف‌کننده‌های فایل تصاویر مورد نیاز VM را به آن‌ها ارسال می‌کند. VirtualizationService سپس فرآیند فرزند را برای زمان مرگ آنها نظارت می کند، بنابراین می تواند مشتریان باقی مانده را بر این اساس مطلع کند.

بسته بندی VM

crosvm از دو روش مختلف برای بوت کردن یک VM پشتیبانی می کند: یا یک هسته و initrd ارائه می شود یا یک بوت لودر ارائه می شود. در هر صورت، تعداد دلخواه از تصاویر دیسک نیز می تواند ارائه شود، که ممکن است یک تصویر خام یا ترکیبی از چندین پارتیشن باشد. تصاویر مختلف توسط مشتری به عنوان توصیف کننده فایل ارائه می شود.

VirtualizationService تصاویر دیسک کامپوزیت را در صورت تقاضا می سازد. این فرآیند ضروری است زیرا فایل دیسک کامپوزیت به طور داخلی به فایل‌های تصویری پارتیشن مختلف تشکیل‌دهنده دیسک اشاره دارد که توسط مشتری ارسال می‌شوند و ممکن است مستقیماً توسط crosvm قابل دسترسی نباشند. برای حل این مشکل، VirtualizationService تضمین می کند که اعداد توصیفگر فایل به ارث برده شده توسط crosvm با شماره های توصیفگر فایل که VirtualizationService در ایجاد تصاویر ترکیبی استفاده می کند، یکسان است. تصویر دیسک ترکیبی از نام فایل ها به شکل /proc/self/fd/N برای نمایش هر فایل پارتیشن استفاده می کند.

برای pVM های Microdroid، AVF شامل یک بوت لودر است که هسته را از پارتیشنی از یک تصویر دیسک کامپوزیت بارگیری می کند، طبق جریان استاندارد Android Verified Boot.

سوکت های VM (vsock)

رابط اصلی برای ارتباط بین pVM ها vsock است، یک رابط استاندارد virtio socket. هر ماشین مجازی توسط یک شناسه زمینه 32 بیتی (CID) شناسایی می‌شود که مشابه یک آدرس IP است، که VirtualizationService هنگام ایجاد ماشین مجازی به ماشین مجازی اختصاص می‌دهد و می‌تواند سرویس‌ها را در هر شماره پورتی که ماشین مجازی انتخاب می‌کند، نمایش دهد. زمانی که ماشین مجازی در حال اجرا است، CID منحصربه‌فرد است، اما زمانی که ماشین مجازی پایان می‌یابد و تمام IVirtualMachine Binder به ماشین مجازی حذف می‌شوند، می‌توان مقدار CID را بازیافت کرد.

رابط اشکال زدایی

دستور vm برای اهداف دیباگ ارائه شده است. این دستور به توسعه‌دهنده اجازه می‌دهد یک VM را از پوسته شروع کند، گزارش‌های آن را مشاهده کند و VM را خاتمه دهد. دستور vm همچنین شامل گزینه ای برای فهرست کردن ماشین های مجازی در حال اجرا، از جمله وضعیت و فرآیندهای مرتبط است. این گزینه به عنوان یک روش اضافی در VirtualizationService AIDL API پیاده سازی شده است که برای جلوگیری از سوء استفاده، فقط توسط کاربر پوسته قابل فراخوانی است.

AVF همچنین شامل پشتیبانی از ارسال یک اتصال adb از طریق vsock است تا دسترسی adb به VMهای مهمان را فراهم کند. به عنوان مثال، برای یک Microdroid VM با CID 10 که adbd روی پورت 5555 اجرا می‌شود، توسعه‌دهنده می‌تواند یک پوسته در Microdroid VM از ایستگاه کاری خود با دستورات زیر دریافت کند:

    $ adb forward tcp:8000 vsock:10:5555
    $ adb connect localhost:8000
    $ adb -s localhost:8000 shell

ارسال یک اتصال adb از طریق vsock فقط برای ماشین های مجازی که در حالت اشکال زدایی کار می کنند در دسترس است.