VirtualizationService چندین ماشین مجازی مهمان، محافظتشده یا غیرمحافظتشده، را که در سیستم Android اجرا میشوند، عمدتاً با مدیریت نمونههای crosvm مدیریت میکند.
VirtualizationService یک AIDL API ارائه میدهد که سرویسهای سیستم یا برنامهها میتوانند از آن برای شروع، پایش، و توقف ماشینهای مجازی استفاده کنند. برای استفاده از VirtualizationService،
virtmgr را مستقیماً اجرا کنید یا javalib یا rustlib را که virtmgr را بهعنوان
فرایند فرزند اجرا میکند وارد کنید.
چرخه حیات ماشین مجازی
دسترسی به VM توسط شیء IVirtualMachine ردیابی میشود. As long as there's
at least one reference to IVirtualMachine object then the VM continues to
run (unless it crashes or shuts down of its own accord). اگر همه ارجاعات به
شیء IVirtualMachine قبلاز خاموش شدن ماشین مجازی حذف شوند،
VirtualizationService ماشین مجازی را بهطور خودکار خاموش میکند. این فرایند به این معنی است که اگر کارخواهی که ماشین مجازی را شروع کرده است بهدلیل کمبود حافظه توسط «قاتل حافظه کم» خاموش شود، ماشین مجازی نیز خاموش میشود و درنتیجه از نشت منابع جلوگیری میشود.
هر ماشین مجازی توسط نمونه crosvm خودش مدیریت میشود، که VirtualizationService
بهنوبه خود ازطرف مشتری مدیریت میکند. VirtualizationService در virtmgr
این فرایندهای فرزند crosvm را درصورت نیاز با منابع سراسری اختصاصدادهشده
ازجمله CID اعطاشده توسط VirtualizationServiceInternal در
virtualizationservice شروع میکند و توصیفگرهای فایل را برای تصاویری که
ماشین مجازی نیاز دارد به آنها ارسال میکند. سپس VirtualizationService فرایند فرزند را برای زمانی که میمیرد نظارت میکند، بنابراین میتواند به هر مشتری باقیماندهای اطلاع دهد.
بستهبندی VM
crosvm از دو روش مختلف برای راهاندازی VM پشتیبانی میکند: یا هسته و initrd ارائه میشود یا بوتلودر ارائه میشود. در هر دو مورد، تعداد دلخواهی از تصاویر دیسک نیز میتواند ارائه شود که ممکن است تصویر خام یا ترکیبی از چند پارتیشن باشد. تصاویر مختلف توسط مشتری بهعنوان توصیفگر فایل ارائه میشوند.
VirtualizationService تصاویر دیسک ترکیبی را بهمحض درخواست میسازد. این فرایند ضروری است زیرا فایل دیسک ترکیبی بهصورت داخلی به فایلهای تصویر پارتیشن مختلفی که دیسک را تشکیل میدهند ارجاع میدهد. این فایلها توسط مشتری منتقل میشوند و ممکن است مستقیماً توسط crosvm قابلدسترسی نباشند. برای حل این مشکل،
VirtualizationService اطمینان حاصل میکند که شمارههای توصیفگر فایل که توسط
crosvm به ارث برده شدهاند، همان شمارههای توصیفگر فایل هستند که VirtualizationService
در ایجاد تصاویر ترکیبی استفاده کرده است. تصویر دیسک ترکیبی از نامهای فایل
بهشکل /proc/self/fd/N برای نشان دادن هر فایل پارتیشن استفاده میکند.
برای pVMهای Microdroid، AVF شامل یک بارکننده است که هسته را از بخشی از تصویر دیسک ترکیبی بار میکند و از جریان استاندارد «راهاندازی تأییدشده Android» پیروی میکند.
سوکتهای ماشین مجازی (vsock)
واسط اصلی برای ارتباط بین pVMها vsock است، یک واسط استاندارد
سوکت virtio. هر ماشین مجازی با یک شناسه زمینه ۳۲ بیتی (CID) شناسایی میشود که مشابه نشانی IP است و VirtualizationServiceInternal هنگام ایجاد ماشین مجازی توسط VirtualizationService، آن را به ماشین مجازی اختصاص میدهد و میتواند سرویسها را در هر شماره درگاهی که ماشین مجازی انتخاب میکند نمایش دهد.
CID درحالیکه ماشین مجازی درحال اجرا است منحصربهفرد است، اما وقتی ماشین مجازی متوقف میشود و همه دستههای پیونددهنده IVirtualMachine به ماشین مجازی حذف میشوند، مقدار CID میتواند بازیافت شود.
میانای اشکالزدایی
فرمان vm برای اهداف اشکالزدایی ارائه شده است. این فرمان به توسعهدهنده اجازه میدهد
یک VM را از پوسته راهاندازی کند، گزارشهای آن را مشاهده کند، و VM را خاتمه دهد. با فرمان vm یا میاناهای دیگری که AVF ارائه میدهد، VM میتواند در حالت قابلاشکالزدایی (کامل) یا غیرقابلاشکالزدایی (هیچکدام) شروع شود. با ماشین مجازی اشکالزداییشدنی، میتوانید
گزارشهای سطح سیستمعامل را ببینید، به پوسته ADB دسترسی داشته باشید، و اطلاعات خرابی یا دادهبرنامه را ضبط کنید.
توصیه میشود از ماشین مجازی غیرقابل اشکالزدایی در تولید استفاده کنید. برای اطلاعات بیشتر درباره ابزار خط فرمان و دیگر میاناهای اشکالزدایی که AVF ارائه میدهد،
debug/README.md را ببینید.