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