Comando del terminale per scoprire se un server è virtuale o fisico


13

Sto cercando un comando terminale che non richieda all'utente di far parte del gruppo sudoers e anche di essere universale e non richiede l'installazione di pacchetti aggiuntivi. Finora ho scoperto che se il sistema ha systemd installato, posso usare:

$ hostnamectl status
   Static hostname: mint
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
           Boot ID: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  Operating System: Linux Mint LMDE
            Kernel: Linux 3.16.0-6-amd64

e sotto Nome icona e Chassis posso vedere se si tratta di VM o macchina fisica. Ma mi chiedevo se potevo usare lscpu, soprattutto perché è un metodo più universale di hostnamectle non richiede systemd. La mia teoria è che se la CPU ha un solo thread per core e non elenca la frequenza minima e massima della CPU, ciò dovrebbe indicare che il server è effettivamente virtualizzato.

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Model name:            Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz
Stepping:              3
CPU MHz:               2500.488
CPU max MHz:           3500.0000
CPU min MHz:           800.0000
BogoMIPS:              4988.18
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              6144K
NUMA node0 CPU(s):     0-7

So che se una CPU ha un solo thread per core non significa necessariamente che sia sicuramente una VM, ma quindi tutte le CPU moderne dovrebbero avere 2 thread per core e inoltre posso anche tenere conto della mancanza / presenza di frequenza minima e massima della CPU in lscpuuscita.


4
"tutte le CPU moderne dovrebbero avere 2 thread per core" - Da dove viene questa idea? Quest'anno Intel ha rilasciato 20 processori che non ce l'hanno. E questo è solo Intel.
marcelm,

@marcelm, non lo sapevo.
Georgе Stoyanov,

2
Ci sono anche casi d'uso in cui le migliori prestazioni richiedono che l'hyperthreading sia disattivato nel BIOS.
doneal24,

Risposte:


17

In determinate condizioni:

comando terminale che non richiede che l'utente che esegue sia nel gruppo sudoers e sia universale e non richieda l'installazione di pacchetti aggiuntivi.

il metodo ovvio più semplice per le VM non modificate, che i proprietari non hanno intenzionalmente cercato di nascondere il fatto che il sistema operativo sia VM, è

cat /sys/class/dmi/id/product_name

Più possibilità:

Al di fuori di quanto indicato dalle condizioni dell'autore del PO ci sono approcci più complicati come questo: dove sono? Identificazione del sistema operativo e della virtualizzazione senza chiamate di sistema


1
@ GeorgеStoyanov Prego!
Bob,

Senza configurazione aggiuntiva, una libvirt-kvm-VM mostra "PC standard (i440FX + PIIX, 1996)" durante l'esecuzione cat /sys/class/dmi/id/product_name, quindi non sono sicuro di quanto sia utile.
Jonas Schäfer,

2
@JonasWielicki Questa è una descrizione del sistema ben definita utilizzata di default per qualsiasi VM basata su QEMU, e non è mai vista sul normale hardware.
Austin Hemmelgarn,

1
@JonasWielicki Standard PC (i440FX + PIIX, 1996)è un'impronta digitale ben nota delle macchine virtuali QEMU / KVM. A proposito, questa impronta digitale può essere facilmente ignorata: askubuntu.com/questions/564643/…
Bob

2
@JonasWielicki, pr -t /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/product_nameil contenuto di questi due file dovrebbe anche darti un'idea abbastanza precisa se il sistema è fisico o virtuale.
Georgе Stoyanov,

12

Ciò richiede anche systemd (che è abbastanza onnipresente in questi giorni), ma systemd-detect-virtè uno strumento migliore per dire se questo è in esecuzione su hardware fisico o virtuale.

Puoi dare un'occhiata alla logica utilizzata da systemd-detect-virt, noterai che in realtà cerca in molti luoghi per rilevare diverse tecnologie di virtualizzazione distinte ...

Penso che qualcosa di ingenuo come guardare l' lscpuoutput possa funzionare in alcuni casi qualche volta, ma penso che difficilmente funzionerebbe sempre. Inoltre, tieni presente che molte tecnologie rendono possibile (e persino probabile) che le macchine virtuali abbiano più di un thread per core, quindi non penso nemmeno che una particolare funzionalità sia sufficiente per eseguire alcun tipo di rilevamento affidabile qui.


Sto pensando che se la frequenza minima e massima mancano da lscpu, ciò potrebbe anche indicare che la macchina è effettivamente VM. Ma il tuo metodo sembra essere più affidabile.
Georgе Stoyanov,

1
@ GeorgеStoyanov Ciò potrebbe anche significare che il ridimensionamento di frequenza è completamente disabilitato per qualche altro motivo, quindi non è affidabile.
Austin Hemmelgarn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.