Linux-scripts laten detecteren dat ze in virtuele machines worden uitgevoerd

Twee handen, de ene met een rode pil en de andere met een blauwe pil.
diy13/Shutterstock.com

Virtuele machines doen erg hun best om hun besturingssystemen ervan te overtuigen dat ze op fysieke hardware draaien. Dus kun je aan de Linux-opdrachtregel zien of de computer fysiek of virtueel is?

Virtuele machines en hypervisors

Een traditionele computer is een fysiek object. Het is een verzameling van verschillende stukjes hardware die aan elkaar zijn geplugd en vastgeschroefd, zodat u een besturingssysteem kunt laden, toepassingen kunt installeren, starten en gebruiken.

Hardware is duur. Omdat het beperkt is tot één besturingssysteem per fysieke computer, worden de kosten van het uitvoeren van meerdere besturingssystemen al snel onbetaalbaar. Een betere oplossing zou zijn om op één fysieke computer een selectie van besturingssystemen tegelijkertijd te laten draaien, waarbij elk besturingssysteem denkt dat hij op zijn eigen, unieke hardware draait.

Wat is een virtuele machine-hypervisor?

VERWANTWat is een virtuele machine-hypervisor?

Een hypervisor maakt dit mogelijk. Een hypervisor, ook wel virtual machine manager of virtual machine monitor genoemd, is software waarmee u virtuele machines kunt maken. Deze gedragen zich alsof het individuele, fysieke computers zijn, hoewel ze op dezelfde fysieke host draaien en de ruimte op de harde schijf, het geheugen en de CPU-kernen delen.

Natuurlijk moet de hostcomputer krachtig genoeg zijn om te voldoen aan de eisen van het verzamelen van virtuele machines, maar met voldoende RAM en verwerkingskracht in de host kunnen virtuele machines bijna bare-metal snelheden draaien.

Sinds de release van de 2.6.20-kernel in 2007 heeft Linux Kop ernel gebaseerd Virueel Machine-ondersteuning ingebouwd. Linux heeft verschillende hypervisors beschikbaar, zoals VirtualBox, GNOME Boxes en QEMU-KVM. Ze maken gebruik van de native KVM-mogelijkheden van Linux en bouwen voort op de native kernelfunctionaliteit door gebruikersinterfaces en functionaliteit toe te voegen, zoals het kunnen maken van een momentopname van een virtuele machine.

Virtuele machines brengen kostenbesparingen, efficiëntie, vereenvoudigde implementaties en – correct ingericht – beveiligingsvoordelen met zich mee. Ze vergemakkelijken ook de schaalbaarheid. Nieuwe servers kunnen automatisch worden opgestart als de vraag naar een service toeneemt en worden uitgeschakeld wanneer de vraag daalt. Dit maakt ze enorm populair, zowel in de cloud als in de on-premise infrastructuur.

Misschien beheert u op afstand een Linux-server en moet u weten of het een virtuele machine of een fysieke box is. Of je hebt een script dat moet weten op welk type platform het wordt uitgevoerd. Hier zijn verschillende manieren waarop u kunt detecteren of de computer waarop u werkt fysiek of virtueel is.

Het dmidecode-commando

De dmidecode commando ondersteunt een groot aantal opties en modifiers. Het ondervraagt ​​de Desktop Management Interface (DMI)-tabellen en drukt de informatie in het terminalvenster af.

Hoe u de apparaten van uw computer kunt weergeven vanaf de Linux-terminal

VERWANTHoe u de apparaten van uw computer kunt weergeven vanaf de Linux-terminal

We gebruiken het met de -s (toon een enkele tekenreeks) en vraag naar de productnaam van het systeem. Merk op dat we moeten gebruiken sudo.

We voeren de opdracht uit op een VirtualBox-VM met Ubuntu 22.04.

sudo dmidecode -s system-product-name

De opdracht dmidecode identificeert correct een VirtualBox VM

Het platform is correct geïdentificeerd als VirtualBox.

Op een QEMU-KVM VM waarop Fedora 35 draait, krijgen we deze uitvoer.

sudo dmidecode -s system-product-name

De opdracht dmidecode identificeert correct een GNOME Boxes VM

Hoewel dit wordt gerapporteerd als een standaard pc, is het een standaard QEMU virtuele pc, van het type Q35. Het platform wordt dus correct herkend als een virtuele machine.

Als we dezelfde opdracht op een fysieke computer uitvoeren, krijgen we wat informatie over de fabrikant.

sudo dmidecode -s system-product-name

De opdracht dmidecode geeft informatie over een fysieke computer terug

Deze computer is op maat gemaakt op basis van een Micro-Star International Company Limited-moederbord, met de productcode MS-7B86.

Het lshw-commando

De lshw command geeft een overzicht van de details voor een breed scala aan computerhardware. We kunnen kiezen welke hardwareklasse we willen lshw over te rapporteren.

Hoe lshw in Linux te gebruiken (met een praktisch voorbeeld)

VERWANTHoe lshw in Linux te gebruiken (met een praktisch voorbeeld)

We gaan de gebruiken -class optie met de system modificator. Gebruik makend van sudo met deze opdracht zorgt ervoor dat we alle details zien.

We voeren deze opdracht uit op onze Ubuntu VirtualBox VM.

sudo lshw -class system

De lshw-opdracht die rapporteert over een VirtualBox VM

  • Het veld “beschrijving” heeft een generieke invoer van “computer”.
  • Het veld “product” vertelt ons dat dit een virtuele machine is die wordt uitgevoerd in VirtualBox.
  • Het veld “verkoper” bevat de naam van het Duitse bedrijf dat VirtualBox heeft gemaakt, Innotek GmbH. Innotek werd in 2010 overgenomen door Oracle Corporation als onderdeel van de overname van Sun Microsystems, Inc.

We moesten installeren lshw op Fedora.

sudo dnf install lshw

Lshw installeren op Fedora met het dnf commando

Laten we dat commando eens proberen in onze Fedora VM die in GNOME Boxes draait.

sudo lshw -class system

Het lshw-commando rapporteert over een GNOME Boxes VM

  • Nogmaals, het veld “beschrijving” heeft een generieke invoer van “computer”.
  • Het veld “product” geeft ons dezelfde standaard QEMU-pc-informatie die we zagen met de dmidecode opdracht.
  • Het veld “verkoper” bevat “QEMU”, wat duidelijk aangeeft dat dit een virtuele machine is.

Dit is het resultaat van het uitvoeren van dezelfde opdracht op onze fysieke computer.

sudo lshw -class system

Het lshw-commando rapporteert op een fysieke computer

We kunnen zien dat dit een hardwarecomputer is, met een Micro-Star-moederbord.

  • De hardware wordt geïdentificeerd als een desktopcomputer.
  • Het veld “product” geeft ons het type moederbord, MS-7B86.
  • Het veld “verkoper” bevat de naam van de fabrikant.

Het hostnamectl-commando

Deze opdracht heeft het voordeel dat u niet hoeft te hebben sudo rechten om het uit te voeren. Het is echter alleen beschikbaar op systemd– ingeschakelde distributies. De meeste moderne distributies gebruiken systemd.

Dit is het antwoord van het uitvoeren van de opdracht op onze Ubuntu VirtualBox VM.

hostnamectl

De uitvoer van de hostnamectl-opdracht in een VirtualBox VM met de virtualisatieregel gemarkeerd:

  • Aan het veld “pictogramnaam” is “-vm” toegevoegd.
  • Het veld “Chassis” bevat “vm.”
  • Het veld “Virtualisatie” bevat “orakel”.
  • Het veld “Hardwareleverancier” bevat “innotek GmbH”.
  • Het veld “Hardwaremodel” bevat “VirtualBox”.

De uitvoer op onze Fedora VM in GNOME Boxes lijkt erg op elkaar.

hostnamectl

De uitvoer van de hostnamectl-opdracht in een GNOME Boxes VM met de virtualisatieregel gemarkeerd

  • Aan het veld “pictogramnaam” is “-vm” toegevoegd.
  • Het veld “Chassis” bevat “vm.”
  • Het veld “Virtualisatie” bevat “kvm”.
  • Het veld “Hardwareleverancier” bevat “QEMU”
  • Het veld “Hardwaremodel” bevat “Standaard-pc (Q35 + ICH9, 2009)”.

Als we de hostnamectl-opdracht op onze fysieke desktop gebruiken, bevat de uitvoer geen regel “Virtualisatie”.

hostnamectl

De uitvoer van de hostnamectl-opdracht op een fysieke computer, zonder "virtualisatie"-informatie

Als er geen veld “Virtualisatie” is, moet u op bare metal werken.

Het systemd-detect-virt commando

Als je een zo kort mogelijk antwoord wilt krijgen, systemd-detect-virt is waarschijnlijk wat je zoekt. Nogmaals, dit vereist een systemd-uitgeruste distributie, maar het vereist niet: sudo voorrechten. Dit – en de beknopte uitvoer – maken het zeer geschikt voor gebruik in scripts.

Dit is het resultaat van het uitvoeren van de opdracht op onze Ubuntu VirtualBox VM.

systemd-detect-virt

Een VirtualBox VM identificeren met systemd-detect-virt

Ons exemplaar van Fedora dat in GNOME Boxes draait, wordt gerapporteerd als KVM-virtualisatie.

systemd-detect-virt

Een GNOME Boxes VM identificeren met systemd-detect-virt

Rennen systemd-detect-virt op onze hardwaremachine resulteert in het afdrukken van “geen” naar de terminal.

systemd-detect-virt

Een fysieke computer die correct wordt geïdentificeerd als zonder virtualisatie

Een platformgevoelig script

Om een ​​script de mogelijkheid te geven om te detecteren of het in een gevirtualiseerde omgeving of op fysieke hardware draait, kunnen we de systemd-detect-virt commando en gebruik Bash case uitspraken om de opties af te handelen.

Dit is het script dat we zullen gebruiken. Kopieer deze tekst en sla deze op in een bestand met de naam “platform.sh”.

#!/bin/bash

shopt -s nocasematch

case $(systemd-detect-virt) in

  none)
    echo "Physical Hardware"
    ;;

  *)
    echo "Virtual Machine"
    ;;
esac

Het script gebruikt shopt om hoofdletterongevoelige overeenkomsten te kiezen. De systemd-detect-virt commando wordt gebruikt in de case uitspraak. De uitvoer van deze opdracht wordt vergeleken met elk van de case clausules in het lichaam van de case statement totdat er een match is gevonden. Alles dat niet overeenkomt, wordt vastgelegd door de standaardclausule “*)”.

Case-statements gebruiken in bash-scripts

VERWANTCase-statements gebruiken in bash-scripts

De eenvoudigste manier is om te testen of het antwoord van: systemd-detect-virt is “geen”. Als dit het geval is, wordt het script op fysieke hardware uitgevoerd. Voor alle andere gevallen moet het script op een virtuele machine worden uitgevoerd.

Voordat we het script kunnen uitvoeren, moeten we het uitvoerbaar maken, met behulp van chmod.

chmod +x platform.sh

Het platformscript uitvoerbaar maken met chmod

Het identificeert onze Ubuntu VirtualBox VM correct als een virtuele machine.

./platform.sh

Het platform.sh-script gebruiken in een VirtualBox VM

Het detecteert ook correct de GNOME Boxes VM waarop Fedora draait.

./platform.sh

Het platform.sh-script gebruiken in een GNOME Boxes VM

Het script detecteert ook correct wanneer het op een fysieke machine wordt uitgevoerd.

./platform.sh

Het platform.sh-script gebruiken op een fysieke computer

Het verschil case clausules kunnen variabelen instellen die elders in het script zijn gecontroleerd om verschillende soorten verwerking uit te voeren, of ze kunnen specifieke functies in uw script aanroepen.

Als uw script verschillende soorten virtuele omgevingen moet detecteren en accommoderen, kunt u er meer toevoegen case clausules, op zoek naar de verschillende tekenreeksen die systemd-detect-virt kan terugkeren. We kunnen de volledige lijst met mogelijke antwoorden zien met behulp van de --list keuze. Om het gemakkelijker te maken om ze allemaal tegelijk te zien, sturen we de uitvoer door de column opdracht.

systemd-detect-virt --list | column

De complete set reacties die systemd-detect-virt kan retourneren

Neem de rode pil

Deze technieken laten uw scripts weten wanneer ze op naakte hardware draaien en wanneer ze zich in een virtuele machine bevinden.

Net als Neo in the Matrix weten ze wat echt is en wat niet.

Nieuwste artikelen

Gerelateerde artikelen