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