VirtualizationService

VirtualizationService מנהל מספר מכונות וירטואליות של אורחים, מוגנות או לא, שפועלות במערכת Android, בעיקר על ידי ניהול מופעים של crosvm. ‫VirtualizationService חושף AIDL API, שאפליקציות או שירותי מערכת יכולים להשתמש בו כדי להפעיל, לעקוב אחרי ולהפסיק מכונות וירטואליות. כדי להשתמש ב-VirtualizationService, מריצים את virtmgr ישירות או מייבאים את javalib או את rustlib שמריצים את virtmgr כתהליך צאצא.

מחזור החיים של מכונת VM

הגישה למכונה וירטואלית מתועדת באובייקט IVirtualMachine. כל עוד יש הפניה אחת לפחות לאובייקט IVirtualMachine, המכונה הווירטואלית ממשיכה לפעול (אלא אם היא קורסת או נסגרת מעצמה). אם כל ההפניות לאובייקט IVirtualMachine נמחקות לפני שהמכונה הווירטואלית נסגרת, VirtualizationService סוגר את המכונה הווירטואלית באופן אוטומטי. התהליך הזה אומר שאם הלקוח שהפעיל את המכונה הווירטואלית נסגר על ידי התהליך low memory killer, גם המכונה הווירטואלית נסגרת, וכך נמנעות דליפות משאבים.

כל מכונה וירטואלית מנוהלת על ידי מופע משלה של crosvm, שבתורו מנהל אותה בשם הלקוח.VirtualizationServiceVirtualizationService ב-virtmgr מתחיל את תהליכי הצאצא האלה של crosvm לפי הצורך עם משאבים גלובליים שהוקצו, כולל ה-CID שניתן על ידי VirtualizationServiceInternal ב-virtualizationservice, ומעביר להם את מתארי הקבצים של התמונות שהמכונה הווירטואלית צריכה. VirtualizationService ואז עוקב אחרי תהליך הצאצא עד שהוא מסתיים, כדי שיוכל להודיע לכל הלקוחות שנותרו בהתאם.

אריזת VM

‫crosvm תומך בשתי דרכים שונות להפעלת מכונה וירטואלית: אפשר לספק ליבה ו-initrd או לספק טוען אתחול. בכל מקרה, אפשר לספק גם מספר שרירותי של תמונות דיסק, שיכולות להיות תמונת RAW או תמונה מורכבת של כמה מחיצות. התמונות השונות מסופקות על ידי הלקוח כמתארי קבצים.

VirtualizationService יוצר תמונות דיסק מורכבות על פי דרישה. התהליך הזה נחוץ כי קובץ הדיסק המורכב מתייחס באופן פנימי לקבצי תמונת המחיצה השונים שמרכיבים את הדיסק, שמועברים על ידי הלקוח ועשויים לא להיות נגישים ישירות על ידי crosvm. כדי לעקוף את הבעיה הזו, VirtualizationService מוודא שמספרי מתאר הקבצים שעברו בירושה על ידי crosvm זהים למספרי מתאר הקבצים שבהם VirtualizationService השתמש ליצירת התמונות המורכבות. התמונה המורכבת של הדיסק משתמשת בשמות קבצים מהצורה /proc/self/fd/N כדי לייצג כל קובץ מחיצה.

במכונות וירטואליות מסוג Microdroid pVM,‏ AVF כולל טוען אתחול (bootloader) שמעמיס את ליבת מערכת ההפעלה ממחיצה של תמונת דיסק מורכבת, בהתאם לתהליך הרגיל של אתחול מאומת ב-Android.

שקעי VM‏ (vsock)

הממשק העיקרי לתקשורת בין מכונות וירטואליות פרטיות הוא vsock, ממשק שקעים סטנדרטי של virtio. כל מכונה וירטואלית מזוהה על ידי מזהה הקשר (CID) של 32 ביט, שדומה לכתובת IP. המזהה הזה VirtualizationServiceInternal מוקצה למכונה הווירטואלית כש-VirtualizationService יוצר את המכונה הווירטואלית, ויכול לחשוף שירותים בכל מספרי הפורטים שהמכונה הווירטואלית בוחרת. ה-CID הוא ייחודי בזמן שה-VM פועל, אבל אפשר לעשות שימוש חוזר בערך ה-CID כשה-VM מסתיים את הפעולה וכל ה-IVirtualMachine binder handles ל-VM נמחקים.

ממשק ניפוי הבאגים

הפקודה vm מיועדת למטרות ניפוי באגים. הפקודה הזו מאפשרת למפתחים להפעיל מכונה וירטואלית מהמעטפת, לראות את היומנים שלה ולסיים את הפעולה של המכונה הווירטואלית. באמצעות הפקודה vm או ממשקים אחרים שסופקו על ידי AVF, אפשר להפעיל מכונה וירטואלית במצב שניתן לניפוי באגים (מלא) או במצב שלא ניתן לניפוי באגים (ללא). במכונה וירטואלית שאפשר לבצע בה ניפוי באגים, אפשר לראות את היומנים ברמת מערכת ההפעלה, לגשת למעטפת ADB ולתעד קובץ dump של קריסה או מטען ייעודי (payload) של אפליקציה. מומלץ להשתמש במכונה וירטואלית שלא ניתן לבצע בה ניפוי באגים בסביבת ייצור. מידע נוסף על כלי שורת הפקודה וממשקי ניפוי באגים אחרים ש-AVF מספק זמין במאמר debug/README.md.