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