خدمة الافتراضية

يدير 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 لتمثيل كل ملف قسم.

بالنسبة إلى أجهزة افتراضية صغيرة الحجم من Microdroid، يتضمّن AVF أداة تحميل تمهيدية تحمّل النواة من أحد أقسام صورة قرص مركبة، وذلك باتّباع عملية التمهيد التحقق من Android العادية.

مآخذ الأجهزة الافتراضية (vsock)

الواجهة الأساسية للاتصال بين أجهزة pVM هي الواجهة مقابل واجهة مقبس بروتوكول virtio القياسي. يتم تحديد كل جهاز افتراضي من خلال معرّف سياق مؤلف من 32 بت (CID)، وهو مشابه لعنوان IP، والذي يُسنِده VirtualizationServiceInternal إلى الجهاز الافتراضي عند VirtualizationService إنشاء الجهاز الافتراضي، ويمكنه عرض الخدمات على أي أرقام منافذ يختارها الجهاز الافتراضي. يكون الرقم التعريفي للعميل فريدًا أثناء تشغيل الجهاز الافتراضي (VM)، ولكن يمكن إعادة تدوير قيمة الرقم التعريفي للعميل عند إنهائه وتجاهل جميع مقابض الربط IVirtualMachine في الجهاز الافتراضي.

واجهة تصحيح الأخطاء

يتم توفير الأمر vm لأغراض تصحيح الأخطاء. يتيح هذا الأمر للمطوّر بدء تشغيل جهاز افتراضي من وحدة التحكّم، وعرض سجلّاته، وإنهاء تشغيله. باستخدام الأمر vm أو الواجهات الأخرى التي يوفّرها AVF، يمكن تشغيل جهاز افتراضي في أحد الوضعَين التاليَين: وضع تصحيح الأخطاء (FULL) أو وضع عدم تصحيح الأخطاء (NONE). باستخدام جهاز افتراضي قابل للتصحيح، يمكنك الاطّلاع على السجلات على مستوى نظام التشغيل والوصول إلى واجهة ADB والتقاط بيانات تفريغ العطل أو حمولة التطبيقات. ننصحك باستخدام جهاز افتراضي غير قابل للتصحيح في مرحلة الإنتاج. لمزيد من المعلومات حول أداة سطر الأوامر وواجهات تصحيح الأخطاء الأخرى التي يوفّرها AVF، يمكنك الاطّلاع على debug/README.md.