تتولّى VirtualizationService إدارة أجهزة افتراضية متعددة للضيوف، محمية أو غير محمية، تعمل على نظام Android، وذلك بشكل أساسي من خلال إدارة مثيلات crosvm.
تعرض VirtualizationService واجهة برمجة تطبيقات AIDL، يمكن لخدمات النظام أو التطبيقات استخدامها لبدء الأجهزة الافتراضية ومراقبتها وإيقافها. لاستخدام 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 لتمثيل كل ملف قسم.
بالنسبة إلى الأجهزة الافتراضية المحمية (pVM) في Microdroid، تتضمّن AVF برنامج إقلاع يحمّل النواة من قسم في نسخة قرص مركّبة، باتّباع مسار التشغيل المتحقّق منه في Android القياسي.
مآخذ الجهاز الافتراضي (vsock)
الواجهة الأساسية للتواصل بين الأجهزة الافتراضية المحمية هي vsock، وهي واجهة مآخذ virtio عادية. يتم تعريف كل جهاز افتراضي من خلال معرّف سياق
(CID) مكوّن من 32 بت، وهو مشابه لعنوان IP، وتعيّنه
VirtualizationServiceInternal للجهاز الافتراضي عندما VirtualizationService
تنشئ الجهاز الافتراضي، ويمكنه عرض الخدمات على أي أرقام منافذ يختارها الجهاز الافتراضي.
يكون معرّف السياق فريدًا أثناء تشغيل الجهاز الافتراضي، ولكن يمكن إعادة استخدام قيمة معرّف السياق عند إنهاء الجهاز الافتراضي وحذف جميع مؤشرات ربط IVirtualMachine للجهاز الافتراضي.
واجهة تصحيح الأخطاء
يتم توفير الأمر vm لأغراض تصحيح الأخطاء. يسمح هذا الأمر للمطوّر ببدء جهاز افتراضي من واجهة سطر الأوامر وعرض سجلاته وإيقافه. باستخدام الأمر vm أو الواجهات الأخرى التي توفّرها AVF، يمكن بدء الجهاز الافتراضي في وضع قابل لتصحيح الأخطاء (كامل) أو غير قابل لتصحيح الأخطاء (بدون). باستخدام جهاز افتراضي قابل لتصحيح الأخطاء، يمكنك الاطّلاع على السجلات على مستوى نظام التشغيل والوصول إلى واجهة سطر أوامر ADB والتقاط ملف تفريغ الذاكرة عند التعطّل أو حمولة التطبيق.
يُنصح باستخدام جهاز افتراضي غير قابل لتصحيح الأخطاء في مرحلة الإنتاج. لمزيد من المعلومات عن
أداة سطر الأوامر وواجهات تصحيح الأخطاء الأخرى التي توفّرها AVF، يُرجى الاطّلاع على
الملف debug/README.md.