שירות וירטואליזציה

VirtualizationService מנהל את כל ה-VM האורח, מוגן או אחר, הפועל על מערכת אנדרואיד, בעיקר על ידי ניהול מופעים של crosvm. VirtualizationService חושף ממשק API של AIDL, שבו שירותי מערכת או אפליקציות יכולים להשתמש כדי להפעיל, לנטר ולעצור מכשירי VM.

AIDL API

VirtualizationService חושף API של AIDL שלקוחות יכולים להשתמש בו כדי לספק תמונות ולהפעיל VM. תיאור זה יכול להיות תצורת VM גולמית עם מתארי קבצים עבור טוען האתחול או הקרנל ותמונות דיסק שונות שייכללו ב-VM, או תצורת Microdroid שבה הלקוח רק מספק את המטען וה-VM מופעל עם ליבת Microdroid ותשתית סטנדרטית. . VirtualizationService לאחר מכן מחזיר אובייקט IVirtualMachine Binder המייצג את ה-VM. הלקוח שהפעיל את ה-VM יכול לבחור לשתף את אובייקט Binder עם תהליכים אחרים, תוך שימוש במנגנוני Binder הרגילים.

ל- IVirtualMachine יש שיטות AIDL כדי לקבל מידע על ה-VM, כמו ה-CID, שניתן להשתמש בו כדי לתקשר איתו דרך vsock, וגם מאפשרת רישום התקשרות חוזרת להיקרא כשה-VM נעצר. במקרה של מכשירי VM IVirtualMachine ניתן להשתמש באובייקט IVirtualMachine גם כדי להגדיר חיבורי Binder ל-VM.

מחזור חיים של VM

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

כל VM מנוהל על ידי מופע משלו של crosvm, אשר VirtualizationService בתורו מנהל בשם הלקוח. VirtualizationService מתחיל את תהליכי הצאצא ה-crosvm האלה כנדרש, ומעביר להם את מתארי הקבצים עבור התמונות שה-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, אשר VirtualizationService מקצה ל-VM כאשר ה-VM נוצר, ויכול לחשוף שירותים בכל מספרי יציאה שה-VM בוחר. ה-CID הוא ייחודי בזמן שה-VM פועל, אך ניתן למחזר את ערך ה-CID כאשר ה-VM מסתיים וכל האחיזה של IVirtualMachine Binder ל-VM נשמטה.

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

הפקודה vm מסופקת למטרות ניפוי באגים. פקודה זו מאפשרת למפתח להפעיל VM מהמעטפת, להציג את היומנים שלו ולסיים את ה-VM. הפקודה vm כוללת גם אפשרות לרשום מכשירי VM הפועלים כעת, כולל הסטטוסים והתהליכים המשויכים להם. אפשרות זו מיושמת כשיטה נוספת ב- VirtualizationService AIDL API אשר, כדי למנוע שימוש לרעה, יכול להיקרא רק על ידי משתמש המעטפת.

AVF כולל גם תמיכה בהעברת חיבור adb דרך vsock, כדי לספק גישת adb ל-VMs אורחים. לדוגמה, עבור Microdroid VM עם CID 10 המריץ adbd ביציאה 5555, המפתח יכול לקבל מעטפת ב-Microdroid VM מתחנת העבודה שלו עם הפקודות הבאות:

    $ adb forward tcp:8000 vsock:10:5555
    $ adb connect localhost:8000
    $ adb -s localhost:8000 shell

העברת חיבור adb דרך vsock זמינה רק עבור מחשבי VM הפועלים במצב ניפוי באגים.