VirtualizationService
מנהל כמה מכונות וירטואליות של אורחים, מוגנות או לא, שפועלות במערכת Android, בעיקר על ידי ניהול מכונות של crosvm.
VirtualizationService
חושף ממשק AIDL API, ששירותי מערכת או אפליקציות יכולים להשתמש בו כדי להפעיל, לעקוב אחרי ולעצור מכונות וירטואליות. כדי להשתמש ב-VirtualizationService
, מריצים את virtmgr
ישירות או מייבאים את javalib או את rustlib שמריצים את virtmgr
בתור תהליך צאצא.
מחזור החיים של מכונות וירטואליות
האובייקט 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 ולתעד נתוני גרסת דמפ של קריסה או של עומס עבודה של אפליקציה.
מומלץ להשתמש במכונה וירטואלית שלא ניתן לנפות בה באגים בסביבת הייצור. למידע נוסף על הכלי בשורת הפקודה ועל ממשקי ניפוי באגים אחרים ש-AVF מספק, אפשר לעיין בקובץ debug/README.md.