Come consentire agli script Linux di rilevare che sono in esecuzione su macchine virtuali

0
139
diy13/Shutterstock.com

Le macchine virtuali si sforzano davvero di convincere i loro sistemi operativi che funzionano su hardware fisico. Quindi puoi dire dalla riga di comando di Linux se il computer è fisico o virtuale?

Macchine virtuali e hypervisor

Un computer tradizionale è un oggetto fisico. È una raccolta di diversi componenti hardware che sono collegati e imbullonati insieme in modo da poter caricare un sistema operativo, installare applicazioni, avviarle e utilizzarle.

L'hardware è costoso. Essere limitati a un sistema operativo per computer fisico significa che il costo dell'esecuzione di più sistemi operativi diventa presto proibitivo. Una soluzione migliore sarebbe quella di consentire a un singolo computer fisico di eseguire una selezione di sistemi operativi contemporaneamente, ognuno dei quali pensa che sia in esecuzione nel proprio hardware unico.

RELATEDChe cos'è un hypervisor di macchine virtuali?

Un hypervisor lo rende possibile. Un hypervisor, chiamato anche gestore di macchine virtuali o monitor di macchine virtuali, è un software che consente di creare macchine virtuali. Questi si comportano come se fossero singoli computer fisici anche se girano sullo stesso host fisico, condividendone lo spazio su disco rigido, la memoria e i core della CPU.

Ovviamente, il computer host deve essere abbastanza potente da far fronte alle richieste della raccolta di macchine virtuali, ma, data la RAM sufficiente e la potenza di elaborazione nell'host, le macchine virtuali possono funzionare a velocità quasi bare-metal.

Pubblicità

Dal rilascio del kernel 2.6.20 nel 2007, Linux è stato integrato nel supporto Kernel Virtual Machine. Linux dispone di diversi hypervisor, come VirtualBox, GNOME Boxes e QEMU-KVM. Utilizzano la funzionalità KVM nativa di Linux, basandosi sulla funzionalità nativa del kernel aggiungendo interfacce utente e funzionalità come la possibilità di scattare un'istantanea di una macchina virtuale.

Le macchine virtuali offrono risparmi sui costi, efficienza, implementazioni semplificate e vantaggi in termini di sicurezza. Inoltre facilitano la scalabilità. I nuovi server possono essere avviati automaticamente all'aumentare della domanda di un servizio e chiusi quando la domanda diminuisce. Questo li rende estremamente popolari sia nel cloud che nell'infrastruttura on-premise.

Forse stai amministrando in remoto un server Linux e devi sapere se si tratta di una macchina virtuale o di una scatola fisica. Oppure hai uno script che deve sapere su quale tipo di piattaforma è in esecuzione. Di seguito sono riportati diversi modi per rilevare se il computer su cui stai lavorando è fisico o virtuale.

Il comando dmidecode

Il dmidecode comando supporta un gran numero di opzioni e modificatori. Interroga le tabelle DMI (Desktop Management Interface) e stampa le informazioni nella finestra del terminale.

< strong class='relatedtext'>RELATEDCome elencare i dispositivi del tuo computer dal terminale Linux

Lo useremo con l'opzione -s (visualizza una singola stringa) e chiederemo il nome del prodotto di sistema. Nota che dobbiamo usare sudo.

Eseguiremo il comando su una VM VirtualBox che esegue Ubuntu 22.04.

sudo dmidecode -s system-product-name

La piattaforma è stata correttamente identificata come VirtualBox.

Pubblicità

Su una QEMU -KVM VM con Fedora 35, otteniamo questo output.

sudo dmidecode -s system-product-name

Sebbene questo sia segnalato come PC standard, è un PC virtuale QEMU standard, di tipo Q35. Quindi la piattaforma viene correttamente riconosciuta come macchina virtuale.

Se eseguiamo lo stesso comando su un computer fisico otteniamo alcune informazioni sul produttore.

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

Questo computer è una build personalizzata basata su una scheda madre Micro-Star International Company Limited, con il codice prodotto di MS-7B86.

Il comando lshw

Il comando lshw elenca i dettagli per un'ampia gamma di hardware per computer. Possiamo scegliere su quale classe di hardware vogliamo che lshw riporti.

RELAZIONATOCome usare lshw in Linux (con un esempio pratico)

Useremo l'opzione -class con il modificatore di sistema. L'uso di sudo con questo comando ci assicura di vedere tutti i dettagli.

Eseguiremo questo comando sulla nostra macchina virtuale Ubuntu VirtualBox.

sudo lshw -class system

  • La “descrizione” contiene una voce generica di “computer.”
  • Il “prodotto” campo ci dice che questa è una macchina virtuale in esecuzione in VirtualBox.
  • Il “venditore” campo contiene il nome della società tedesca che ha creato VirtualBox, Innotek GmbH. Innotek è stata acquisita da Oracle Corporation nel 2010 come parte dell'acquisizione di Sun Microsystems, Inc.

Abbiamo dovuto installare lshw su Fedora.

sudo dnf install lshw

Pubblicità

Proviamo quel comando nella nostra macchina virtuale Fedora in esecuzione Scatole GNOME.

sudo lshw -class system

  • Ancora una volta, la “descrizione” contiene una voce generica di “computer.”
  • Il “prodotto” ci fornisce le stesse informazioni standard per PC QEMU che abbiamo visto con il comando dmidecode.
  • Il “vendor” il campo contiene “QEMU” che indica chiaramente che si tratta di una macchina virtuale.

Questo è il risultato dell'esecuzione dello stesso comando sul nostro computer fisico.

sudo lshw -class system

Possiamo vedere che si tratta di un computer hardware, con una scheda madre Micro-Star.

  • L'hardware è identificato come un computer desktop.
  • Il “prodotto” campo indica il tipo di scheda madre, MS-7B86.
  • Il “venditore” contiene il nome del produttore.

Il comando hostnamectl

Questo comando ha il vantaggio che non è necessario disporre dei privilegi sudo per eseguirlo. Tuttavia, è disponibile solo su distribuzioni abilitate per systemd. La maggior parte delle moderne distribuzioni utilizza systemd.

Questa è la risposta dall'esecuzione del comando sulla nostra macchina virtuale Ubuntu VirtualBox.

hostnamectl

  • Il “nome-icona” il campo ha “-vm” aggiunto ad esso.
  • Il “Telaio” il campo contiene “vm.”
  • La “Virtualizzazione” contiene “oracle.”
  • Il “fornitore di hardware” contiene “innotek GmbH.”
  • Il “Modello hardware” contiene “VirtualBox.”

L'output sulla nostra macchina virtuale Fedora all'interno di GNOME Boxes è molto simile.

hostnamectl

  • Il “nome-icona” il campo ha “-vm” in allegato.
  • Il “Telaio” il campo contiene “vm.”
  • La “Virtualizzazione” contiene “kvm.”
  • Il “fornitore di hardware” il campo contiene “QEMU”
  • Il “Modello hardware” il campo contiene “PC standard (Q35 + ICH9, 2009).”

Pubblicità

Se utilizziamo il comando hostnamectl sul nostro desktop fisico, l'output non contiene una “Virtualizzazione” riga.

hostnamectl

Se non ci sono & #8220;Virtualizzazione” campo, devi essere in esecuzione su bare metal.

Il comando systemd-detect-virt

Se vuoi ottenere una risposta il più breve possibile, systemd-detect-virt è probabilmente quello che stai cercando. Anche in questo caso è necessaria una distribuzione dotata di systemd, ma non richiede privilegi sudo. Questo—e il suo output conciso—lo rendono adatto per l'uso negli script.

Questo è il risultato dell'esecuzione del comando sulla nostra macchina virtuale Ubuntu VirtualBox.

systemd-detect-virt

La nostra copia di Fedora in esecuzione in GNOME Boxes utilizza la virtualizzazione KVM.

systemd-detect-virt

L'esecuzione di systemd-detect-virt sulla nostra macchina hardware genera “none” in fase di stampa sul terminale.

systemd-detect-virt

Uno script sensibile alla piattaforma

Per dare a uno script la capacità di rilevare se è in esecuzione in un ambiente virtualizzato o su hardware fisico, possiamo usare systemd -detect-virt e usa le istruzioni Bash case per gestire le opzioni.

Pubblicità

Questo è lo script che useremo. Copia questo testo e salvalo in un file chiamato “platform.sh.”

#!/bin/bash shopt -s nocasematch case $(systemd-detect-virt) in nessuno) echo ” Hardware fisico” ;; *) echo “Macchina virtuale” ;; esac

Lo script utilizza shopt per scegliere la corrispondenza senza distinzione tra maiuscole e minuscole. Il comando systemd-detect-virt viene utilizzato nell'istruzione case. L'output di questo comando viene confrontato con ciascuna delle clausole case nel corpo dell'istruzione case finché non viene trovata una corrispondenza. Tutto ciò che non corrisponde viene catturato da “*)” clausola predefinita.

RELATEDCome utilizzare le istruzioni del caso in Bash Scripts

Il modo più semplice è verificare se la risposta di systemd-detect-virt è “none.” In tal caso, lo script è in esecuzione su hardware fisico. Per tutti gli altri casi, lo script deve essere in esecuzione su una macchina virtuale.

Prima di poter eseguire lo script dobbiamo renderlo eseguibile, usando chmod.

chmod +x platform.sh

Identifica correttamente la nostra macchina virtuale Ubuntu VirtualBox come macchina virtuale.

./platform.sh

Pubblicità

Rileva anche correttamente la VM GNOME Boxes che esegue Fedora.

./platform.sh

Lo script rileva anche correttamente quando è in esecuzione su una macchina fisica.

./platform.sh

Le diverse clausole case potrebbero impostare variabili che sono state controllate altrove nello script per eseguire diversi tipi di elaborazione, oppure potrebbero chiamare funzioni specifiche all'interno dello script.

Se il tuo script doveva rilevare e ospitare diversi tipi di ambienti virtuali, potresti aggiungere più clausole case, cercando le diverse stringhe che systemd-detect-virt può restituire. Possiamo vedere l'elenco completo delle possibili risposte usando l'opzione –list. Per rendere più facile vederli tutti in una volta, invieremo l'output tramite il comando della colonna.

systemd-detect-virt –list | column

Prendi il Red Pill

Queste tecniche consentono ai tuoi script di sapere quando sono in esecuzione su hardware nudo e quando si trovano all'interno di una macchina virtuale.

Come Neo in Matrix, sapranno cosa è reale e cosa no.

LEGGI SUCCESSIVO

  • › I migliori relatori economici del 2022
  • › Dovresti comprare un drone?
  • › Ho bisogno della placcatura in oro sui miei cavi?
  • › 4 prodotti tecnologici inutili che non dovresti acquistare
  • › Novità di Chrome 102, ora disponibile
  • › Recensione del mouse Logitech MX Master 3S: perfezionamenti silenziati