كيفية السماح لبرامج Linux النصية باكتشاف أنها تعمل في الأجهزة الافتراضية

نشرت: 2022-06-27
يدان ، إحداهما تحمل حبة حمراء والأخرى حبة زرقاء.
diy13 / Shutterstock.com

تحاول الأجهزة الافتراضية جاهدة إقناع أنظمة التشغيل الخاصة بها بأنها تعمل على أجهزة مادية. لذا هل يمكنك معرفة ما إذا كان الكمبيوتر ماديًا أم افتراضيًا من سطر أوامر Linux؟

الأجهزة الافتراضية و Hypervisors

الكمبيوتر التقليدي هو كائن مادي. إنها عبارة عن مجموعة من قطع الأجهزة المختلفة التي يتم توصيلها وتثبيتها معًا بحيث يمكنك تحميل نظام التشغيل وتثبيت التطبيقات وتشغيلها واستخدامها.

الأجهزة باهظة الثمن. يعني التقيد بنظام تشغيل واحد لكل كمبيوتر فعلي أن تكلفة تشغيل عدة أنظمة تشغيل تصبح باهظة في وقت قريب. قد يكون الحل الأفضل هو السماح لجهاز كمبيوتر مادي واحد بتشغيل مجموعة مختارة من أنظمة التشغيل في نفس الوقت ، بحيث يعتقد كل واحد أنه يعمل بأجهزته الفريدة.

ما هو جهاز افتراضية Hypervisor؟
ذات الصلة ما هو Hypervisor الجهاز الظاهري؟

برنامج Hypervisor يجعل هذا ممكنًا. برنامج Hypervisor - يسمى أيضًا مدير الجهاز الظاهري أو مراقب الجهاز الظاهري - هو برنامج يتيح لك إنشاء أجهزة افتراضية. تتصرف هذه الأجهزة كما لو كانت أجهزة كمبيوتر فردية ومادية على الرغم من أنها تعمل على نفس المضيف الفعلي ، وتشترك في مساحة محرك الأقراص الثابتة والذاكرة ونواة وحدة المعالجة المركزية.

بالطبع ، يجب أن يكون الكمبيوتر المضيف قويًا بما يكفي للتعامل مع متطلبات مجموعة الأجهزة الافتراضية ، ولكن ، نظرًا لذاكرة الوصول العشوائي الكافية وقوة المعالجة في المضيف ، يمكن للأجهزة الافتراضية العمل بسرعات شبه معدومة.

منذ إصدار 2.6.20 kernel في عام 2007 ، حصل Linux على دعم V irtual M achine المستند إلى K ernel. يتوفر لدى Linux العديد من برامج Hyperviser ، مثل VirtualBox و GNOME Boxes و QEMU-KVM. إنهم يستفيدون من قدرة KVM الأصلية لنظام Linux ، بناءً على وظائف kernel الأصلية عن طريق إضافة واجهات مستخدم ووظائف مثل القدرة على التقاط لقطة من آلة افتراضية.

توفر الأجهزة الظاهرية وفورات في التكاليف ، وكفاءات ، وعمليات نشر مبسطة ، وفوائد أمنية –مصممة بشكل صحيح-. كما أنها تسهل قابلية التوسع. يمكن تشغيل الخوادم الجديدة تلقائيًا مع زيادة الطلب على الخدمة وإغلاقها عند انخفاض الطلب. وهذا ما يجعلها تحظى بشعبية كبيرة في كل من السحابة والبنية التحتية داخل الشركة.

ربما تقوم بإدارة خادم Linux عن بُعد وتحتاج إلى معرفة ما إذا كان جهازًا افتراضيًا أو صندوقًا فعليًا. أو لديك برنامج نصي يحتاج إلى معرفة نوع النظام الأساسي الذي يتم تنفيذه عليه. فيما يلي عدة طرق يمكنك من خلالها اكتشاف ما إذا كان الكمبيوتر الذي تعمل عليه ماديًا أم افتراضيًا.

الأمر dmidecode

يدعم الأمر dmidecode عددًا كبيرًا من الخيارات والمعدِّلات. يستجوب جداول واجهة إدارة سطح المكتب (DMI) ، ويطبع المعلومات في نافذة المحطة الطرفية.

كيفية سرد أجهزة الكمبيوتر الخاص بك من محطة Linux الطرفية
ذات صلة كيفية سرد أجهزة الكمبيوتر الخاص بك من محطة لينكس

سنستخدمه مع الخيار -s (عرض سلسلة واحدة) ، ونطلب اسم منتج النظام. لاحظ أنه يجب علينا استخدام sudo .

سنقوم بتشغيل الأمر على VirtualBox VM يعمل بنظام Ubuntu 22.04.

 sudo dmidecode -s system-product-name 

يقوم الأمر dmidecode بتعريف VirtualBox VM بشكل صحيح

تم تحديد النظام الأساسي بشكل صحيح على أنه VirtualBox.

على جهاز QEMU-KVM VM يعمل بنظام Fedora 35 ، نحصل على هذا الناتج.

 sudo dmidecode -s system-product-name 

الأمر dmidecode يحدد بشكل صحيح GNOME Boxes VM

على الرغم من الإبلاغ عن هذا كجهاز كمبيوتر قياسي ، إلا أنه جهاز كمبيوتر افتراضي قياسي QEMU ، من النوع Q35. لذلك يتم التعرف على النظام الأساسي بشكل صحيح كآلة افتراضية.

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

 sudo dmidecode -s system-product-name 

يقوم الأمر dmidecode بإرجاع معلومات حول جهاز كمبيوتر فعلي

هذا الكمبيوتر عبارة عن تصميم مخصص يعتمد على اللوحة الأم Micro-Star International Company Limited ، مع رمز المنتج MS-7B86.

الأمر lshw

يسرد الأمر lshw تفاصيل مجموعة كبيرة من أجهزة الكمبيوتر. يمكننا اختيار فئة الأجهزة التي نريد أن lshw بالإبلاغ عنها.

كيفية استخدام lshw في Linux (مع مثال عملي)
ذات صلة كيفية استخدام lshw في Linux (مع مثال عملي)

سنستخدم الخيار -class مع معدّل system . يضمن استخدام sudo مع هذا الأمر أننا نرى كل التفاصيل.

سنقوم بتشغيل هذا الأمر على Ubuntu VirtualBox VM الخاص بنا.

 نظام sudo lshw -class 

يقوم الأمر lshw بالإبلاغ عن VirtualBox VM

  • يحتوي حقل "الوصف" على إدخال عام لـ "الكمبيوتر".
  • يخبرنا حقل "المنتج" أن هذه آلة افتراضية تعمل في VirtualBox.
  • يحتوي حقل "البائع" على اسم الشركة الألمانية التي أنشأت VirtualBox ، Innotek GmbH. استحوذت شركة Oracle على Innotek في عام 2010 كجزء من استحواذها على Sun Microsystems، Inc.

كان علينا تثبيت lshw على Fedora.

 sudo dnf تثبيت lshw 

تثبيت lshw على Fedora باستخدام الأمر dnf

لنجرب هذا الأمر في Fedora VM الذي يعمل في صناديق جنوم.

 نظام sudo lshw -class 

يقوم الأمر lshw بالإبلاغ عن GNOME Boxes VM

  • مرة أخرى ، يحتوي حقل "الوصف" على إدخال عام لـ "الكمبيوتر".
  • يعطينا حقل "المنتج" نفس معلومات QEMU PC القياسية التي رأيناها مع الأمر dmidecode .
  • يحتوي حقل "البائع" على "QEMU" والذي يشير بوضوح تام إلى أن هذه آلة افتراضية.

هذا هو نتيجة تشغيل نفس الأمر على جهاز الكمبيوتر الخاص بنا.

 نظام sudo lshw -class 

يقوم الأمر lshw بالإبلاغ عن جهاز كمبيوتر فعلي

يمكننا أن نرى أن هذا هو جهاز كمبيوتر ، مع اللوحة الأم Micro-Star.

  • تم تحديد الجهاز كجهاز كمبيوتر مكتبي.
  • يعطينا حقل "المنتج" نوع اللوحة الأم MS-7B86.
  • يحتوي حقل "البائع" على اسم الشركة المصنعة.

قيادة hostnamectl

يتمتع هذا الأمر بميزة أنك لست بحاجة إلى امتيازات sudo لتشغيله. ومع ذلك ، فهو متاح فقط في التوزيعات التي يدعمها systemd . تستخدم غالبية التوزيعات الحديثة systemd .

هذه هي الاستجابة من تشغيل الأمر على Ubuntu VirtualBox VM الخاص بنا.

 هوستناميكتل 

الإخراج من الأمر hostnamectl في VirtualBox VM مع تمييز خط المحاكاة الافتراضية

  • يحتوي حقل "icon-name" على "-vm" ملحق به.
  • يحتوي حقل "الهيكل" على "vm".
  • يحتوي حقل "Virtualization" على "oracle".
  • يحتوي حقل "بائع الأجهزة" على "innotek GmbH."
  • يحتوي حقل "طراز الجهاز" على "VirtualBox".

الإخراج في Fedora VM الخاص بنا داخل GNOME Boxes مشابه جدًا.

 هوستناميكتل 

الإخراج من الأمر hostnamectl في GNOME Boxes VM مع تمييز سطر المحاكاة الافتراضية

  • يحتوي حقل "icon-name" على "-vm" ملحق به.
  • يحتوي حقل "الهيكل" على "vm".
  • يحتوي حقل "الظاهرية" على "kvm".
  • يحتوي حقل "بائع الأجهزة" على "QEMU"
  • يحتوي حقل "طراز الجهاز" على "كمبيوتر شخصي قياسي (Q35 + ICH9 ، 2009)".

إذا استخدمنا الأمر hostnamectl على سطح المكتب الفعلي ، فلن يحتوي الإخراج على سطر "Virtualization".

 هوستناميكتل 

الإخراج من الأمر hostnamectl على جهاز كمبيوتر فعلي ، بدون معلومات "Virtualization"

إذا لم يكن هناك مجال "افتراضية" ، فيجب أن تعمل على المعدن.

أمر systemd-detect-Virt

إذا كنت ترغب في الحصول على إجابة قصيرة قدر الإمكان ، فمن المحتمل أن يكون systemd-detect-virt هو ما تبحث عنه. مرة أخرى ، يتطلب هذا توزيعًا مجهزًا من قبل systemd ، لكنه لا يتطلب امتيازات sudo . هذا - وإخراجها المقتضب - يجعلها مناسبة تمامًا للاستخدام في البرامج النصية.

هذه نتيجة تشغيل الأمر على Ubuntu VirtualBox VM الخاص بنا.

 systemd- كشف- الفضيلة 

التعرف على VirtualBox VM باستخدام systemd-det-Virt

تم الإبلاغ عن نسختنا من Fedora التي تعمل في GNOME Boxes على أنها تستخدم المحاكاة الافتراضية لـ KVM.

 systemd- كشف- الفضيلة 

التعرف على GNOME Boxes VM باستخدام systemd-det-Virt

يؤدي تشغيل systemd-detect-virt على جهازنا إلى طباعة "لا شيء" على الجهاز.

 systemd- كشف- الفضيلة 

يتم تحديد جهاز كمبيوتر مادي بشكل صحيح على أنه لا يحتوي على المحاكاة الافتراضية

برنامج نصي حساس للمنصة

لمنح البرنامج النصي القدرة على اكتشاف ما إذا كان يعمل في بيئة افتراضية أو على أجهزة مادية ، يمكننا استخدام الأمر systemd-detect-virt واستخدام عبارات case Bash للتعامل مع الخيارات.

هذا هو النص الذي سنستخدمه. انسخ هذا النص واحفظه في ملف يسمى "platform.sh".

 #! / بن / باش

shopt -s nocasematch

case $ (systemd-det-Virt) في

  لا أحد)
    صدى "الأجهزة المادية"
    ؛؛

  *)
    صدى "آلة افتراضية"
    ؛؛
esac

يستخدم البرنامج النصي shopt لاختيار مطابقة غير حساسة لحالة الأحرف. يتم استخدام الأمر systemd-detect-virt في بيان case . تتم مقارنة الإخراج من هذا الأمر مع كل بند من عبارات case في نص بيان case حتى يتم العثور على تطابق. يتم التقاط أي شيء لا يتم مطابقته بواسطة الجملة الافتراضية "*)".

كيفية استخدام بيانات الحالة في نصوص Bash
ذات صلة كيفية استخدام بيانات الحالة في نصوص باش

أبسط طريقة هي اختبار ما إذا كانت الاستجابة من systemd-detect-virt "لا شيء". إذا كان الأمر كذلك ، فإن البرنامج النصي يعمل على أجهزة فعلية. بالنسبة لجميع الحالات الأخرى ، يجب تشغيل البرنامج النصي على جهاز ظاهري.

قبل أن نتمكن من تشغيل البرنامج النصي ، يجب أن نجعله قابلاً للتنفيذ باستخدام chmod .

 chmod + x platform.sh 

جعل البرنامج النصي للنظام الأساسي قابلاً للتنفيذ باستخدام chmod

إنه يحدد بشكل صحيح Ubuntu VirtualBox VM الخاص بنا كجهاز افتراضي.

 ./platform.sh 

استخدام البرنامج النصي platform.sh في VirtualBox VM

كما أنه يكتشف بشكل صحيح GNOME Boxes VM الذي يقوم بتشغيل Fedora.

 ./platform.sh 

استخدام البرنامج النصي platform.sh في GNOME Boxes VM

يكتشف البرنامج النصي أيضًا بشكل صحيح عند تشغيله على جهاز فعلي.

 ./platform.sh 

استخدام البرنامج النصي platform.sh على جهاز كمبيوتر فعلي

يمكن أن تعين عبارات case المختلفة متغيرات تم التحقق منها في مكان آخر في البرنامج النصي لإجراء أنواع مختلفة من المعالجة ، أو يمكنها استدعاء وظائف محددة في البرنامج النصي الخاص بك.

إذا كان البرنامج النصي الخاص بك بحاجة إلى اكتشاف أنواع مختلفة من البيئات الافتراضية واستيعابها ، فيمكنك إضافة المزيد من عبارات case ، والبحث عن السلاسل المختلفة التي يمكن أن systemd-detect-virt . يمكننا رؤية القائمة الكاملة --list المحتملة باستخدام خيار القائمة. لتسهيل رؤيتهم جميعًا مرة واحدة ، سنقوم بتوجيه الإخراج عبر أمر column .

 systemd-det-Virt --list | عمودي 

المجموعة الكاملة من الاستجابات التي يمكن أن يعود بها systemd-det-Virtue

خذ الحبة الحمراء

تتيح هذه الأساليب لنصوصك معرفة وقت تشغيلها على أجهزة عارية ومتى تكون داخل جهاز افتراضي.

مثل Neo in the Matrix ، سيعرفون ما هو حقيقي وما هو غير حقيقي.