VirtualizationService מנהל מספר מכונות וירטואליות של אורחים, מוגנות או לא, שפועלות במערכת Android, בעיקר על ידי ניהול מופעים של crosvm.
VirtualizationService חושף AIDL API, ששירותי מערכת או אפליקציות יכולים להשתמש בו כדי להפעיל, לעקוב אחרי ולעצור מכונות וירטואליות. כדי להשתמש ב-VirtualizationService, מריצים את virtmgr ישירות או מייבאים את javalib או את rustlib שמריצים את virtmgr כתהליך צאצא.
מחזור החיים של מכונת VM
הגישה למכונה וירטואלית מתועדת באובייקט IVirtualMachine. כל עוד יש לפחות הפניה אחת לאובייקט IVirtualMachine, המכונה הווירטואלית ממשיכה לפעול (אלא אם היא קורסת או נסגרת מעצמה). אם כל ההפניות לאובייקט IVirtualMachine יוסרו לפני שהמכונה הווירטואלית תושבת, אז VirtualizationService ישבית את המכונה הווירטואלית באופן אוטומטי. התהליך הזה מרמז שאם הלקוח שהפעיל את המכונה הווירטואלית נסגר על ידי התהליך low memory killer, גם המכונה הווירטואלית נסגרת, וכך נמנעות דליפות של משאבים.
כל מכונה וירטואלית מנוהלת על ידי מופע משלה של crosvm, שVirtualizationServiceבתורו מנהל בשם הלקוח. VirtualizationService ב-virtmgr
מתחיל את תהליכי הצאצא של crosvm לפי הצורך עם משאבים גלובליים שהוקצו, כולל ה-CID שהוענק על ידי VirtualizationServiceInternal ב-virtualizationservice, ומעביר להם את מתארי הקבצים של התמונות שהמכונה הווירטואלית צריכה. VirtualizationService ואז עוקב אחרי תהליך הצאצא כדי לדעת מתי הוא מסתיים, כדי שיוכל להודיע על כך לכל הלקוחות שנותרו.
VM packaging
crosvm תומך בשתי דרכים שונות להפעלת מכונה וירטואלית: אפשר לספק ליבה ו-initrd או לספק טוען אתחול. בכל מקרה, אפשר לספק גם מספר שרירותי של תמונות דיסק, שיכולות להיות תמונת RAW או תמונה מורכבת של כמה מחיצות. התמונות השונות מסופקות על ידי הלקוח כמתארי קבצים.
VirtualizationService יוצר תמונות דיסק מורכבות על פי דרישה. התהליך הזה נחוץ כי קובץ הדיסק המורכב מתייחס באופן פנימי לקבצי תמונת המחיצה השונים שמרכיבים את הדיסק, שמועברים על ידי הלקוח ועשויים לא להיות נגישים ישירות על ידי crosvm. כדי לעקוף את הבעיה הזו, VirtualizationService מוודא שמספרי מתאר הקבצים שעברו בירושה על ידי crosvm זהים למספרי מתאר הקבצים שבהם VirtualizationService השתמש ליצירת התמונות המורכבות. תמונת הדיסק המורכבת משתמשת בשמות קבצים
בטופס /proc/self/fd/N כדי לייצג כל קובץ מחיצה.
ב-pVM של Microdroid, AVF כולל תוכנת אתחול, שמעמיס את הליבה ממחיצה של קובץ אימג' מורכב של דיסק, בהתאם לתהליך הרגיל של הפעלה מאומתת של Android.
מכונות וירטואליות מסוג Socket (vsock)
הממשק העיקרי לתקשורת בין מכונות pVM הוא vsock, ממשק סטנדרטי של שקע virtio. כל מכונה וירטואלית מזוהה על ידי מזהה הקשר (CID) של 32 ביט, שדומה לכתובת IP. המערכת VirtualizationServiceInternal מקצה אותו למכונה הווירטואלית כשהיא יוצרת את המכונה הווירטואלית, והמכונה הווירטואלית יכולה לחשוף שירותים בכל מספרי הפורטים שהיא בוחרת.VirtualizationService
ה-CID הוא ייחודי בזמן שהמכונה הווירטואלית פועלת, אבל אפשר לעשות שימוש חוזר בערך ה-CID כשהמכונה הווירטואלית מסתיימת וכל ה-handles של IVirtualMachine binder למכונה הווירטואלית נמחקים.
ממשק לניפוי באגים
הפקודה vm מיועדת למטרות ניפוי באגים. הפקודה הזו מאפשרת למפתחים להפעיל מכונה וירטואלית מהמעטפת, לראות את היומנים שלה ולסיים את הפעולה של המכונה הווירטואלית. באמצעות הפקודה vm או ממשקים אחרים שסופקו על ידי AVF, אפשר להפעיל מכונה וירטואלית במצב שניתן לניפוי באגים (FULL) או במצב שלא ניתן לניפוי באגים (NONE). בעזרת מכונה וירטואלית שאפשר לבצע בה ניפוי באגים, אפשר לראות את היומנים ברמת מערכת ההפעלה, לגשת למעטפת ADB ולתעד קובץ dump של קריסה או מטען ייעודי (payload) של אפליקציה.
מומלץ להשתמש במכונה וירטואלית שלא ניתן לבצע בה ניפוי באגים בסביבת ייצור. מידע נוסף על כלי שורת הפקודה וממשקי ניפוי באגים אחרים ש-AVF מספקת זמין במאמר debug/README.md.