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