تدير VirtualizationService
عدة أجهزة افتراضية للضيوف، محمية أو غير ذلك، تعمل على نظام Android، وذلك بشكل أساسي عن طريق إدارة مثيلات crosvm. تعرض VirtualizationService
واجهة AIDL API، التي يمكن لخدمات أو تطبيقات النظام استخدامها لبدء تشغيل الأجهزة الافتراضية ومراقبتها وإيقافها. لاستخدام VirtualizationService
، قم بتنفيذ virtmgr
مباشرة أو قم باستيراد javalib أو rustlib الذي ينفذ virtmgr
كعملية فرعية.
دورة حياة VM
يتم تعقب الوصول إلى جهاز VM بواسطة كائن IVirtualMachine
. طالما أن هناك مرجعًا واحدًا على الأقل لكائن IVirtualMachine
، فسيستمر الجهاز الظاهري في العمل (ما لم يتعطل أو يتم إيقاف تشغيله من تلقاء نفسه). إذا تم إسقاط كافة المراجع إلى كائن IVirtualMachine
قبل إيقاف تشغيل الجهاز الافتراضي، فستقوم VirtualizationService
تلقائيًا بإيقاف تشغيل الجهاز الظاهري. تشير هذه العملية إلى أنه إذا تم إيقاف تشغيل العميل الذي بدأ تشغيل الجهاز الظاهري بواسطة قاتل الذاكرة المنخفضة، فسيتم إيقاف تشغيل الجهاز الافتراضي أيضًا، وبالتالي منع تسرب الموارد.
تتم إدارة كل جهاز افتراضي من خلال مثيل crosvm الخاص به، والذي تديره VirtualizationService
بدورها نيابة عن العميل. تقوم VirtualizationService
في virtmgr
بتشغيل عمليات crosvm الفرعية هذه كما هو مطلوب باستخدام الموارد العالمية المخصصة بما في ذلك معرف العميل الممنوح بواسطة VirtualizationServiceInternal
في virtualizationservice
، وتمريرها واصفات الملفات للصور التي يحتاجها VM. تقوم VirtualizationService
بعد ذلك بمراقبة عملية الطفل عند وفاته، حتى تتمكن من إخطار أي عملاء متبقين وفقًا لذلك.
تغليف VM
يدعم crosvm طريقتين مختلفتين لتشغيل جهاز افتراضي: إما أن يتم توفير kernel وinitrd أو يتم توفير أداة تحميل التشغيل. في كلتا الحالتين، يمكن أيضًا توفير عدد عشوائي من صور القرص، والتي قد تكون إما صورة أولية أو مركبة من عدة أقسام. يتم توفير الصور المختلفة من قبل العميل كواصفات للملفات.
تقوم VirtualizationService
بإنشاء صور قرص مركبة حسب الطلب. تعد هذه العملية ضرورية لأن ملف القرص المركب يشير داخليًا إلى ملفات صور الأقسام المختلفة التي يتكون منها القرص، والتي يتم تمريرها بواسطة العميل وقد لا يمكن الوصول إليها مباشرة بواسطة crosvm. للتغلب على هذه المشكلة، تضمن VirtualizationService
أن أرقام واصفات الملفات الموروثة بواسطة crosvm هي نفس أرقام واصفات الملفات التي استخدمتها VirtualizationService
في إنشاء الصور المركبة. تستخدم صورة القرص المركبة أسماء الملفات في النموذج /proc/self/fd/N
لتمثيل كل ملف قسم.
بالنسبة إلى Microdroid pVMs، يتضمن AVF أداة تحميل التشغيل، التي تقوم بتحميل النواة من قسم من صورة قرص مركبة، باتباع تدفق التشغيل القياسي الذي تم التحقق منه من Android.
مقابس VM (vsock)
الواجهة الأساسية للاتصال بين pVMs هي vsock، وهي واجهة مأخذ توصيل قياسية. يتم تعريف كل جهاز افتراضي بواسطة معرف سياق 32 بت (CID)، وهو ما يشبه عنوان IP، والذي يعينه VirtualizationServiceInternal
للجهاز الظاهري عندما تقوم VirtualizationService
بإنشاء الجهاز الظاهري، ويمكنه عرض الخدمات على أي أرقام منافذ يختارها الجهاز الافتراضي. يكون CID فريدًا أثناء تشغيل الجهاز الظاهري، ولكن يمكن إعادة تدوير قيمة CID عند إنهاء VM وإسقاط جميع مقابض رابط IVirtualMachine
إلى VM.
واجهة التصحيح
يتم توفير الأمر vm
لأغراض التصحيح. يتيح هذا الأمر للمطور بدء تشغيل جهاز افتراضي من shell وعرض سجلاته وإنهاء الجهاز الافتراضي. باستخدام الأمر vm
أو الواجهات الأخرى التي يوفرها AVF، يمكن أن يبدأ جهاز VM إما في الوضع القابل للتصحيح (FULL) أو غير القابل للتصحيح (NONE). باستخدام VM القابل للتصحيح، يمكنك رؤية سجلات مستوى نظام التشغيل، والوصول إلى ADB shell، والتقاط تفريغ الأعطال أو حمولة التطبيق. يوصى باستخدام جهاز افتراضي غير قابل للتصحيح في الإنتاج. لمعرفة المزيد عن أداة سطر الأوامر وواجهات تصحيح الأخطاء الأخرى التي يوفرها AVF، راجع debug/README.md .