Hur man låter Linux-skript upptäcka att de körs i virtuella maskiner

0
160
diy13/Shutterstock.com figur>

Virtuella maskiner försöker verkligen övertyga sina operativsystem om att de körs på fysisk hårdvara. Så kan du avgöra från Linux-kommandoraden om datorn är fysisk eller virtuell?

Virtuella maskiner och hypervisorer

En traditionell dator är ett fysiskt föremål. Det är en samling olika delar av hårdvara som är anslutna och bultade ihop så att du kan ladda ett operativsystem, installera program, starta dem och använda dem.

Hårdvara är dyr. Att vara begränsad till ett operativsystem per fysisk dator innebär att kostnaden för att köra flera operativsystem snart blir oöverkomlig. En bättre lösning skulle vara att låta en enda fysisk dator köra ett urval av operativsystem samtidigt, där var och en tror att den körs i sin egen unika hårdvara.

RELATERATVad är en Virtual Machine Hypervisor?

En hypervisor gör detta möjligt. En hypervisor—även kallad en virtuell maskinhanterare eller virtuell maskinövervakare—är programvara som låter dig skapa virtuella maskiner. Dessa beter sig som om de vore individuella, fysiska datorer även om de körs på samma fysiska värd och delar dess hårddiskutrymme, minne och CPU-kärnor.

Naturligtvis måste värddatorn vara tillräckligt kraftfull för att klara av kraven från insamlingen av virtuella maskiner, men givet tillräckligt med RAM och processorkraft i värden kan virtuella maskiner köras med nästan bara metallhastigheter.

Annons

Sedan lanseringen av 2.6.20-kärnan 2007 har Linux haft Kernel-baserat Virtual Machine-stöd direkt inbyggt. Linux har flera hypervisorer tillgängliga för sig, som VirtualBox, GNOME-boxar och QEMU-KVM. De använder sig av den inbyggda KVM-kapaciteten i Linux, och bygger vidare på den inbyggda kärnans funktionalitet genom att lägga till användargränssnitt och funktionalitet som att kunna ta en ögonblicksbild av en virtuell maskin.

Virtuella maskiner ger kostnadsbesparingar, effektivitet, förenklade implementeringar och tillhandahåller korrekta säkerhetsfördelar. De underlättar även skalbarhet. Nya servrar kan snurras upp automatiskt när efterfrågan på en tjänst ökar och stängas av när efterfrågan minskar. Detta gör dem enormt populära både i molnet och i lokal infrastruktur.

Du kanske fjärradministrerar en Linux-server och du behöver veta om det är en virtuell maskin eller en fysisk box. Eller så har du ett skript som behöver veta vilken typ av plattform det körs på. Här är flera sätt du kan upptäcka om datorn du arbetar på är fysisk eller virtuell.

dmidecode-kommandot

dmidecode kommandot stöder ett stort antal alternativ och modifierare. Den kontrollerar DMI-tabellerna (Desktop Management Interface) och skriver ut informationen i terminalfönstret.

< strong class='relatedtext'>RELATERATSå här listar du din dators enheter från Linux-terminalen

Vi kommer att använda den med alternativet -s (visa en enstaka sträng) och fråga efter systemets produktnamn. Observera att vi måste använda sudo.

Vi kör kommandot på en VirtualBox VM som kör Ubuntu 22.04.

sudo dmidecode -s system-product-name

Plattformen är korrekt identifierad som VirtualBox.

Annons

På en QEMU -KVM VM som kör Fedora 35, vi får denna utdata.

sudo dmidecode -s system-produktnamn

Även om detta rapporteras som en standard PC, det är en standard QEMU virtuell PC, av typ Q35. Så plattformen är korrekt igenkänd som en virtuell maskin.

Om vi ​​kör samma kommando på en fysisk dator får vi lite information om tillverkaren.

sudo dmidecode -s system-product-name < p>

Den här datorn är specialbyggd baserad på ett Micro-Star International Company Limited-moderkort, med produktkoden MS-7B86.

lshw-kommandot

Kommandot lshw listar detaljerna för ett brett utbud av datorhårdvara. Vi kan välja vilken klass av hårdvara vi vill att lshw ska rapportera om.

RELATERATHur man använder lshw i Linux (med ett praktiskt exempel)

Vi kommer att använda alternativet -class med systemmodifieraren. Genom att använda sudo med det här kommandot ser vi alla detaljer.

Vi kör det här kommandot på vår virtuella Ubuntu VirtualBox VM.

sudo lshw -class system

  • “beskrivningen” fältet har en generisk post “dator.”
  • “produkten” fältet talar om för oss att detta är en virtuell maskin som körs i VirtualBox.
  • “leverantören” fältet innehåller namnet på det tyska företaget som skapade VirtualBox, Innotek GmbH. Innotek förvärvades av Oracle Corporation 2010 som en del av dess förvärv av Sun Microsystems, Inc.

Vi var tvungna att installera lshw på Fedora.

sudo dnf install lshw

Annons

Låt oss prova det kommandot i vår Fedora VM som körs i GNOME-lådor.

sudo lshw -klasssystem

  • Återigen, “beskrivningen” fältet har en generisk post “dator.”
  • “produkten” fältet ger oss samma standard QEMU PC-information som vi såg med kommandot dmidecode.
  • “leverantören” fältet innehåller “QEMU” vilket ganska tydligt indikerar att detta är en virtuell maskin.

Detta är resultatet av att köra samma kommando på vår fysiska dator.

sudo lshw -class system

Vi kan se att detta är en hårdvarudator, med ett Micro-Star-moderkort.

  • Hårdvaran identifieras som en stationär dator.
  • “produkten” fältet ger oss moderkortstypen MS-7B86.
  • “leverantören” fältet innehåller tillverkarens namn.

kommandot hostnamectl

Detta kommando har fördelen att du inte behöver ha sudo-privilegier för att köra det. Det är dock endast tillgängligt på systemd-aktiverade distributioner. Majoriteten av moderna distributioner använder systemd.

Detta är svaret från att köra kommandot på vår Ubuntu VirtualBox VM.

hostnamectl

  • “ikonnamnet” fältet har “-vm” bifogas till den.
  • “Chassiet” fältet innehåller “vm.”
  • The “Virtualization” fältet innehåller “oracle.”
  • “Hårdvaruleverantören” fältet innehåller “innotek GmbH.”
  • “Hårdvarumodellen” fältet innehåller “VirtualBox.”

Utgången på vår Fedora VM inuti GNOME-boxar är väldigt lik.

hostnamectl

  • “ikonnamnet” fältet har “-vm” bifogas till den.
  • Chassiet” fältet innehåller “vm.”
  • The “Virtualization” fältet innehåller “kvm.”
  • “Hårdvaruleverantören” fältet innehåller “QEMU”
  • “Hårdvarumodellen” fältet innehåller “Standard PC (Q35 + ICH9, 2009).”

Annons

Om vi ​​använder kommandot hostnamectl på vårt fysiska skrivbord, innehåller utdata inte en “Virtualisering” linje.

hostnameectl

Om det inte finns någon & #8217; #8220;Virtualisering” måste du köra på ren metall.

kommandot systemd-detect-virt

Om du vill få ett så kort svar som möjligt är systemd-detect-virt förmodligen det du letar efter. Återigen kräver detta en systemutrustad distribution, men det kräver inte sudo-privilegier. Detta—och dess kortfattade utdata—gör den väl lämpad för användning i skript.

Detta är resultatet av att köra kommandot på vår Ubuntu VirtualBox VM.

systemd-detect-virt

Vår kopia av Fedora som körs i GNOME-boxar rapporteras använda KVM-virtualisering.

systemd-detect-virt

Att köra systemd-detect-virt på vår hårdvarumaskin resulterar i “ingen” skrivs ut till terminalen.

systemd-detect-virt

Ett plattformskänsligt skript

För att ge ett skript möjlighet att upptäcka om det körs i en virtualiserad miljö eller på fysisk hårdvara, kan vi använda systemd -detect-virt kommandot och använd Bash case-satser för att hantera alternativen.

Annons

Det här är skriptet vi kommer att använda. Kopiera denna text och spara den i en fil som heter “platform.sh.”

#!/bin/bash shopt -s nocasematch case $(systemd-detect-virt) in none) echo ” Fysisk hårdvara” ;; *) echo “Virtual Machine” ;; esac

Skriptet använder shopt för att välja skiftlägesokänslig matchning. Kommandot systemd-detect-virt används i case-satsen. Utdata från detta kommando jämförs med var och en av case-satserna i case-satsens brödtext tills en matchning hittas. Allt som inte matchas fångas av “*)” standardklausul.

RELATERATHur man använder falluttalanden i Bash Scripts

Det enklaste sättet är att testa om svaret från systemd-detect-virt är “ingen.” Om det är det, körs skriptet på fysisk hårdvara. I alla andra fall måste skriptet köras på en virtuell maskin.

Innan vi kan köra skriptet måste vi göra det körbart med chmod.

chmod +x platform.sh

Den identifierar korrekt vår Ubuntu VirtualBox VM som en virtuell maskin.

./platform.sh

Annons

Den identifierar också korrekt GNOME Boxes VM som kör Fedora.

./platform.sh

Skriptet upptäcker också korrekt när det körs på en fysisk maskin.

./platform.sh

De olika kasussatserna kan ställa in variabler som kontrollerades på andra ställen i skriptet för att utföra olika typer av bearbetning, eller så kan de anropa specifika funktioner i ditt skript.

Om ditt skript behövde upptäcka och rymma olika typer av virtuella miljöer, kan du lägga till fler case-klausuler och leta efter de olika strängarna som systemd-detect-virt kan returnera. Vi kan se hela listan över möjliga svar genom att använda –list-alternativet. För att göra det enklare att se dem alla på en gång skickar vi utdata via kolumnkommandot.

systemd-detect-virt –list | kolumn

Ta Red Pill

De här teknikerna låter dina skript veta när de körs på naken hårdvara och när de är inuti en virtuell maskin.

Som Neo in the Matrix, de kommer att veta vad som är verkligt och vad som inte är det.

LÄS NÄSTA

  • › 4 värdelösa tekniska produkter du inte bör köpa
  • › Ska du köpa en drönare?
  • › Behöver jag guldplätering på mina kablar?
  • › De bästa budgettalarna 2022
  • › Logitech MX Master 3S Mouse Review: Muted Refinements
  • › Vad är nytt i Chrome 102, tillgängligt nu