it-swarm.it

Scopri se il sistema operativo è in esecuzione in un ambiente virtuale

Esiste un modo per scoprire se il sistema operativo in uso (in realtà sto installando) è in esecuzione in una macchina VMWare. Devo disabilitare le impostazioni ntp se l'installazione automatizzata viene eseguita su una macchina virtuale ma mantenerle abilitate se l'installazione su bare metal.

52
ulve

Usare dmidecode o lshw e greping sembra essere il modo migliore per scoprirlo.

11
ulve

Linux aggiunge il flag hypervisor a /proc/cpuinfo se il kernel rileva l'esecuzione su una sorta di hypervisor.

68
Jan Henke

Su Linux puoi usare il comando virt-what

[[email protected]]# virt-what
vmware

Esempio di output per un Linux su Windows HyperV

[[email protected]~] # virt-what
hyperv
26
user66871

Questo ha funzionato meglio per me in quanto mi fornisce informazioni specifiche sul produttore e sul nome del prodotto.

dmidecode -t system|grep 'Manufacturer\|Product'

Uscita sul server Dell:

Manufacturer: Dell Inc.
Product Name: PowerEdge C5220

Output su Virtualbox VM:

Manufacturer: innotek GmbH
Product Name: VirtualBox

Uscita su KVM/QEMU:

Manufacturer: QEMU
Product Name: Standard PC (i440FX + PIIX, 1996)

Questo è ottimo per gli script che possono analizzarli per una migliore identificazione dei server ... ma se usi Chef nella tua infrastruttura, puoi controllare l'attributo del nodo Virtualization -> system nel server dello chef.

19
OkezieE

Correre:

$ dmesg |grep -i hypervisor
Hypervisor detected: KVM
12
Arash

Se tutto ciò che serve è un modo per dire se il sistema operativo/host è un host virtualizzato o meno, basta avere un modulo Perl Sys :: Detect :: Virtualization e lo script con esso virtdetect. Esegue tutte le rilevazioni euristiche/di ipotesi possibili e segnala l'ambiente del sistema operativo rilevato. Provaci.

http://search.cpan.org/dist/Sys-Detect-Virtualization/script/virtdetect

3
Nikhil Mulley

L'idea migliore sarebbe probabilmente guardare l'hardware. Almeno con VirtualBox puoi facilmente determinare che sei su una macchina virtuale, a causa dei nomi di alcuni dei dispositivi hardware (ad esempio /sys/block/sda/device/model dirà "VBOX HARDDISK").

Dal momento che tutte le macchine sono VMware, basta scegliere una di queste cose e verificarla.

3
tante

Potresti provare la pillola rossa di Joanna Rutkowska Questo piccolo programma esamina l'IDTR (registro della tabella dei descrittori di interrupt) usando il SIDT istruzione (solo x86), che apparentemente sarà impostata in modo diverso da VMM differenti.

3
Bruce Ediger

Tutte queste risposte funzionano in alcuni casi, ma non in altri.

Ad esempio, puoi dipendere da dmesg mentre i dettagli del registro di avvio sono ancora nel buffer dell'anello, ma probabilmente falliranno su un computer che è stato in esecuzione per un certo periodo di tempo. Peggio ancora, un sistema operativo bare metal potrebbe registrare un messaggio relativo a un hypervisor in esecuzione, nel qual caso un test ingenuo come dmesg | grep -i vmware restituirà un falso positivo.

I test sotto Docker sono abbastanza diversi. Docker non ha /proc/cpuinfo di per sé; invece passa le informazioni della macchina host. Nel frattempo, dmidecode non riesce a leggere una directory /dev/mem non visto da Docker.

virt-what ha un rilevamento per i contenitori Docker, ma deve essere patchato per far fronte a una recente modifica dei privilegi del contenitore. Si blocca durante il tentativo di accedere a /proc/1/environ prima che raggiunga i test per Docker.

È importante prestare attenzione al virt-what avvertimento:

Il più delle volte, usare questo programma è la cosa sbagliata da fare. Dovresti invece rilevare le funzionalità specifiche che desideri effettivamente utilizzare.

Nel mio caso, pubblicando un tutorial che installa un ton di cazzate che gli utenti potrebbero non voler dopo tutto, mi rifiuto di lasciarlo girare su bare metal, con questo test:

[[ 0 < $(grep -c docker /proc/1/cgroup) ]] || [[ "X$(Sudo virt-what)X" != "XX" ]] && export VIRTUALIZED=true;

Nota: mi rendo conto che l'OP chiede specificamente VMWare nel corpo della domanda, ma il titolo della domanda attirerà molti lettori (come me) alla ricerca del caso più generale.

2
Martin Bramwell

L'ho fatto:

hypervisor=`dmesg --notime | grep -i hypervisor | cut -d ':' -f2 | tr -d " \t\n\r"`
echo "Hypervisor is $hypervisor"

Aiuta sugli script

bene, il modo più intuitivo che faccio sempre è:

$ dmesg | grep -i vmware

1
Shâu Shắc

Richiede APIC, restituisce 0 se macchina virtuale, 1 se computer fisico:

grep -q VBOX /sys/firmware/acpi/tables/APIC
0
user227115