So lassen Sie Linux-Skripts erkennen, dass sie in virtuellen Maschinen ausgeführt werden

Veröffentlicht: 2022-06-27
Zwei Hände, eine hält eine rote Pille und die andere eine blaue Pille.
diy13/Shutterstock.com

Virtuelle Maschinen bemühen sich sehr, ihre Betriebssysteme davon zu überzeugen, dass sie auf physischer Hardware laufen. Können Sie also über die Linux-Befehlszeile feststellen, ob der Computer physisch oder virtuell ist?

Virtuelle Maschinen und Hypervisoren

Ein herkömmlicher Computer ist ein physisches Objekt. Es ist eine Sammlung verschiedener Hardwareteile, die zusammengesteckt und verschraubt werden, damit Sie ein Betriebssystem laden, Anwendungen installieren, starten und verwenden können.

Hardware ist teuer. Die Beschränkung auf ein Betriebssystem pro physischem Computer bedeutet, dass die Kosten für den Betrieb mehrerer Betriebssysteme bald unerschwinglich werden. Eine bessere Lösung wäre es, einem einzelnen physischen Computer zu erlauben, eine Auswahl an Betriebssystemen gleichzeitig auszuführen, wobei jedes denkt, dass es auf seiner eigenen, einzigartigen Hardware läuft.

Was ist ein Hypervisor für virtuelle Maschinen?
RELATED Was ist ein Hypervisor für virtuelle Maschinen?

Ein Hypervisor macht dies möglich. Ein Hypervisor – auch Virtual Machine Manager oder Virtual Machine Monitor genannt – ist eine Software, mit der Sie virtuelle Maschinen erstellen können. Diese verhalten sich so, als wären sie einzelne physische Computer, obwohl sie auf demselben physischen Host ausgeführt werden und dessen Festplattenspeicher, Arbeitsspeicher und CPU-Kerne gemeinsam nutzen.

Natürlich muss der Host-Computer leistungsfähig genug sein, um mit den Anforderungen der Sammlung virtueller Maschinen fertig zu werden, aber bei ausreichend RAM und Rechenleistung im Host können virtuelle Maschinen mit nahezu Bare-Metal-Geschwindigkeit ausgeführt werden.

Seit der Veröffentlichung des Kernels 2.6.20 im Jahr 2007 hat Linux die Kernel-basierte Virtual-Machine-Unterstützung direkt eingebaut. Linux verfügt über mehrere Hypervisoren wie VirtualBox, GNOME Boxes und QEMU-KVM. Sie nutzen die native KVM-Fähigkeit von Linux und bauen auf der nativen Kernel-Funktionalität auf, indem sie Benutzeroberflächen und Funktionen hinzufügen, z. B. die Möglichkeit, einen Snapshot einer virtuellen Maschine zu erstellen.

Virtuelle Maschinen bringen Kosteneinsparungen, Effizienz, vereinfachte Bereitstellungen und – richtig bereitgestellt – Sicherheitsvorteile. Sie erleichtern auch die Skalierbarkeit. Neue Server können automatisch hochgefahren werden, wenn die Nachfrage nach einem Dienst steigt, und heruntergefahren werden, wenn die Nachfrage sinkt. Dies macht sie sowohl in der Cloud als auch in der On-Premise-Infrastruktur äußerst beliebt.

Vielleicht verwalten Sie einen Linux-Server aus der Ferne und müssen wissen, ob es sich um eine virtuelle Maschine oder eine physische Box handelt. Oder Sie haben ein Skript, das wissen muss, auf welcher Art von Plattform es ausgeführt wird. Hier sind mehrere Möglichkeiten, wie Sie erkennen können, ob der Computer, an dem Sie arbeiten, physisch oder virtuell ist.

Der dmidecode-Befehl

Der Befehl dmidecode unterstützt eine große Anzahl von Optionen und Modifikatoren. Es fragt die Desktop Management Interface (DMI)-Tabellen ab und druckt die Informationen im Terminalfenster.

So listen Sie die Geräte Ihres Computers vom Linux-Terminal aus auf
RELATED So listen Sie die Geräte Ihres Computers vom Linux-Terminal aus auf

Wir verwenden es mit der Option -s (eine einzelne Zeichenfolge anzeigen) und fragen nach dem Produktnamen des Systems. Beachten Sie, dass wir sudo verwenden müssen.

Wir führen den Befehl auf einer VirtualBox-VM mit Ubuntu 22.04 aus.

 sudo dmidecode -s systemproduktname 

Der Befehl dmidecode identifiziert eine VirtualBox-VM korrekt

Die Plattform wird korrekt als VirtualBox identifiziert.

Auf einer QEMU-KVM-VM mit Fedora 35 erhalten wir diese Ausgabe.

 sudo dmidecode -s systemproduktname 

Der Befehl dmidecode identifiziert eine GNOME Boxes-VM korrekt

Obwohl dies als Standard-PC gemeldet wird, handelt es sich um einen standardmäßigen virtuellen QEMU-PC des Typs Q35. Die Plattform wird also korrekt als virtuelle Maschine erkannt.

Wenn wir denselben Befehl auf einem physischen Computer ausführen, erhalten wir einige Informationen über den Hersteller.

 sudo dmidecode -s systemproduktname 

Der Befehl dmidecode gibt Informationen über einen physischen Computer zurück

Dieser Computer ist eine Spezialanfertigung basierend auf einem Motherboard von Micro-Star International Company Limited mit dem Produktcode MS-7B86.

Der lshw-Befehl

Der Befehl lshw listet die Details für eine breite Palette von Computerhardware auf. Wir können wählen, über welche Klasse von Hardware lshw berichten soll.

So verwenden Sie lshw unter Linux (mit einem praktischen Beispiel)
VERWANDTE Verwendung von lshw unter Linux (mit einem praktischen Beispiel)

Wir werden die Option -class mit dem system . Die Verwendung von sudo mit diesem Befehl stellt sicher, dass wir alle Details sehen.

Wir führen diesen Befehl auf unserer Ubuntu VirtualBox-VM aus.

 sudo lshw -Klassensystem 

Der lshw-Befehl berichtet über eine VirtualBox-VM

  • Das Feld „Beschreibung“ enthält den generischen Eintrag „Computer“.
  • Das Feld „Produkt“ sagt uns, dass dies eine virtuelle Maschine ist, die in VirtualBox läuft.
  • Das Feld „Vendor“ enthält den Namen der deutschen Firma, die VirtualBox erstellt hat, Innotek GmbH. Innotek wurde 2010 von der Oracle Corporation im Rahmen der Übernahme von Sun Microsystems, Inc. übernommen.

Wir mussten lshw auf Fedora installieren.

 sudo dnf install lshw 

Installieren von lshw auf Fedora mit dem Befehl dnf

Versuchen wir diesen Befehl in unserer Fedora-VM, die in GNOME-Boxen ausgeführt wird.

 sudo lshw -Klassensystem 

Der lshw-Befehl berichtet über eine GNOME Boxes-VM

  • Auch hier hat das Feld „Beschreibung“ einen generischen Eintrag von „Computer“.
  • Das Feld „Produkt“ gibt uns die gleichen Standard-QEMU-PC-Informationen, die wir mit dem Befehl dmidecode gesehen haben.
  • Das Feld „Vendor“ enthält „QEMU“, was ganz klar darauf hinweist, dass es sich um eine virtuelle Maschine handelt.

Dies ist das Ergebnis der Ausführung desselben Befehls auf unserem physischen Computer.

 sudo lshw -Klassensystem 

Der lshw-Befehl berichtet auf einem physischen Computer

Wir können sehen, dass dies ein Hardware-Computer mit einem Micro-Star-Motherboard ist.

  • Die Hardware wird als Desktop-Computer identifiziert.
  • Das Feld „Produkt“ gibt uns den Motherboard-Typ MS-7B86 an.
  • Das Feld „Vendor“ enthält den Namen des Herstellers.

Der hostnamectl-Befehl

Dieser Befehl hat den Vorteil, dass Sie keine sudo Berechtigungen benötigen, um ihn auszuführen. Es ist jedoch nur auf systemd -aktivierten Distributionen verfügbar. Die Mehrheit der modernen Distributionen verwendet systemd .

Dies ist die Antwort auf die Ausführung des Befehls auf unserer Ubuntu VirtualBox-VM.

 Hostnameectl 

Die Ausgabe des Befehls hostnamectl in einer VirtualBox-VM mit hervorgehobener Virtualisierungszeile

  • An das Feld „Symbolname“ ist „-vm“ angehängt.
  • Das Feld „Chassis“ enthält „vm“.
  • Das Feld „Virtualisierung“ enthält „Oracle“.
  • Das Feld „Hardware Vendor“ enthält „innotek GmbH“.
  • Das Feld „Hardware Model“ enthält „VirtualBox“.

Die Ausgabe auf unserer Fedora-VM in GNOME-Boxen ist sehr ähnlich.

 Hostnameectl 

Die Ausgabe des Befehls hostnamectl in einer GNOME Boxes-VM mit hervorgehobener Virtualisierungszeile

  • An das Feld „Symbolname“ ist „-vm“ angehängt.
  • Das Feld „Chassis“ enthält „vm“.
  • Das Feld „Virtualisierung“ enthält „kvm“.
  • Das Feld „Hardware Vendor“ enthält „QEMU“.
  • Das Feld „Hardwaremodell“ enthält „Standard-PC (Q35 + ICH9, 2009)“.

Wenn wir den Befehl hostnamectl auf unserem physischen Desktop verwenden, enthält die Ausgabe keine „Virtualisierungs“-Zeile.

 Hostnameectl 

Die Ausgabe des Befehls hostnamectl auf einem physischen Computer ohne „Virtualisierungs“-Informationen

Wenn es kein „Virtualisierung“-Feld gibt, müssen Sie auf Bare Metal laufen.

Der systemd-detect-virt-Befehl

Wenn Sie eine möglichst kurze Antwort erhalten möchten, ist systemd-detect-virt wahrscheinlich das, wonach Sie suchen. Auch dies erfordert eine mit systemd ausgestattete Distribution, aber keine sudo -Berechtigungen. Dies – und seine knappe Ausgabe – machen es gut geeignet für die Verwendung in Skripten.

Dies ist das Ergebnis der Ausführung des Befehls auf unserer Ubuntu VirtualBox-VM.

 systemd-detect-virt 

Identifizieren einer VirtualBox-VM mit systemd-detect-virt

Es wird berichtet, dass unsere Kopie von Fedora, die in GNOME-Boxen ausgeführt wird, KVM-Virtualisierung verwendet.

 systemd-detect-virt 

Identifizieren einer GNOME Boxes-VM mit systemd-detect-virt

Das Ausführen von systemd-detect-virt auf unserer Hardwaremaschine führt dazu, dass „none“ auf dem Terminal ausgegeben wird.

 systemd-detect-virt 

Ein physischer Computer, der korrekt als nicht virtualisiert identifiziert wird

Ein plattformsensitives Skript

Um einem Skript die Möglichkeit zu geben, zu erkennen, ob es in einer virtualisierten Umgebung oder auf physischer Hardware ausgeführt wird, können wir den Befehl systemd-detect-virt verwenden und Bash- case -Anweisungen verwenden, um die Optionen zu handhaben.

Dies ist das Skript, das wir verwenden werden. Kopieren Sie diesen Text und speichern Sie ihn in einer Datei namens „platform.sh“.

 #!/bin/bash

shopt -s nocasematch

case $(systemd-detect-virt) ein

  keiner)
    echo "Physische Hardware"
    ;;

  *)
    echo "Virtuelle Maschine"
    ;;
esac

Das Skript verwendet shopt , um den Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung auszuwählen. Der Befehl systemd-detect-virt wird in der case -Anweisung verwendet. Die Ausgabe dieses Befehls wird mit jeder der case -Klauseln im Hauptteil der case -Anweisung verglichen, bis eine Übereinstimmung gefunden wird. Alles, was nicht übereinstimmt, wird von der Standardklausel „*)“ erfasst.

So verwenden Sie Case-Anweisungen in Bash-Skripten
VERWANDTE Verwendung von Case-Anweisungen in Bash-Skripten

Am einfachsten testen Sie, ob die Antwort von systemd-detect-virt „none“ lautet. Wenn dies der Fall ist, wird das Skript auf physischer Hardware ausgeführt. In allen anderen Fällen muss das Skript auf einer virtuellen Maschine ausgeführt werden.

Bevor wir das Skript ausführen können, müssen wir es mit chmod ausführbar machen.

 chmod +x Plattform.sh 

Das Plattformskript mit chmod ausführbar machen

Es identifiziert unsere Ubuntu VirtualBox VM korrekt als virtuelle Maschine.

 ./platform.sh 

Verwenden des Skripts platform.sh in einer VirtualBox-VM

Es erkennt auch korrekt die GNOME Boxes VM, auf der Fedora läuft.

 ./platform.sh 

Verwenden des Skripts platform.sh in einer GNOME Boxes-VM

Das Skript erkennt auch korrekt, wenn es auf einem physischen Computer ausgeführt wird.

 ./platform.sh 

Verwenden des Skripts platform.sh auf einem physischen Computer

Die verschiedenen case -Klauseln könnten Variablen setzen, die an anderer Stelle im Skript überprüft wurden, um verschiedene Verarbeitungsarten auszuführen, oder sie könnten bestimmte Funktionen innerhalb Ihres Skripts aufrufen.

Wenn Ihr Skript verschiedene Arten von virtuellen Umgebungen erkennen und berücksichtigen muss, können Sie weitere case -Klauseln hinzufügen und nach den verschiedenen Zeichenfolgen suchen, die systemd-detect-virt zurückgeben kann. Wir können die vollständige Liste der möglichen Antworten anzeigen, indem wir die Option --list . Um es einfacher zu machen, sie alle auf einmal zu sehen, leiten wir die Ausgabe durch den column .

 systemd-detect-virt --list | Säule 

Der vollständige Satz von Antworten, die systemd-detect-virt zurückgeben kann

Nimm die Rote Pille

Diese Techniken teilen Ihren Skripts mit, wenn sie auf nackter Hardware ausgeführt werden und wenn sie sich in einer virtuellen Maschine befinden.

Wie Neo in der Matrix werden sie wissen, was real ist und was nicht.