Comando Terminal para descobrir se um servidor é virtual ou físico

13

Estou procurando um comando terminal que não exija que o usuário em execução esteja no grupo sudoers e também seja universal e não exija a instalação de pacotes adicionais. Até agora, descobri que, se o sistema possui o systemd instalado, posso usar:

$ 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 em Nome do ícone e chassi, posso ver se é VM ou máquina física. Mas eu queria saber se posso usar lscpu, especialmente porque é um método mais universal do que hostnamectle não requer systemd. Minha teoria é que, se a CPU tiver apenas um thread por núcleo e também não listar a frequência mínima e máxima da CPU, isso deve ser uma indicação de que o servidor é realmente virtualizado.

$ 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

Eu sei que se uma CPU tiver apenas um thread por núcleo não significa necessariamente que é VM, com certeza, mas todas as CPUs modernas devem ter 2 threads por núcleo e, além disso, também posso levar em consideração a falta / presença de freqüência mínima e máxima da CPU na lscpusaída.

Georgе Stoyanov
fonte
4
"todas as CPUs modernas devem ter 2 threads por núcleo" - De onde você tira essa idéia? A Intel lançou 20 processadores este ano que não possuem isso. E isso é apenas Intel.
marcelm
@ marcelm, eu não sabia disso.
Georgе Stoyanov 26/07/19
2
Também existem casos de uso em que o melhor desempenho exige que o hyperthreading seja desativado no BIOS.
doneal24

Respostas:

17

Sob determinadas condições:

comando terminal que não requer que o usuário em execução esteja no grupo sudoers e também seja universal e não requer a instalação de pacotes adicionais.

o método mais óbvio e simples para VMs não modificadas, cujos proprietários intencionalmente não tentaram esconder o fato de o SO ser VM, é

cat /sys/class/dmi/id/product_name

Mais possibilidades:

Fora das condições dadas pelo autor do OP, existem abordagens mais complicadas como esta: Onde estou? Identificação do sistema operacional e da virtualização sem chamadas do sistema

Prumo
fonte
1
@ GeorgеStoyanov De nada!
26418 Bob
Sem configuração adicional, uma libvirt-kvm-VM é exibida como "PC padrão (i440FX + PIIX, 1996)" ao executar cat /sys/class/dmi/id/product_name, portanto, não tenho certeza do quanto isso é útil.
Jonas Schäfer
2
@JonasWielicki Essa é uma descrição do sistema bem definida usada por padrão para qualquer VM baseada em QEMU e nunca é vista em hardware normal.
Austin Hemmelgarn
1
O @JonasWielicki Standard PC (i440FX + PIIX, 1996)é uma impressão digital bem conhecida das máquinas virtuais QEMU / KVM. By the way, esta impressão digital pode ser facilmente anulado: askubuntu.com/questions/564643/...
Bob
2
@JonasWielicki, pr -t /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/product_nameo conteúdo desses dois arquivos também deve fornecer uma idéia bastante precisa se o sistema é físico ou virtual.
Georgе Stoyanov 26/07/19
12

Isso também requer systemd (o que é bastante onipresente atualmente), mas systemd-detect-virté uma ferramenta melhor para saber se isso está sendo executado em hardware físico ou virtual.

Você pode dar uma olhada na lógica usada systemd-detect-virt, perceberá que ela realmente olha para muitos lugares para detectar várias tecnologias de virtualização distintas ...

Acho que algo ingênuo, como olhar para a lscpusaída, pode funcionar em alguns casos algumas vezes, mas acho que dificilmente funcionaria o tempo todo. Observe também que muitas tecnologias tornam possível (e até provável) que as VMs tenham mais de um encadeamento por núcleo; portanto, nem acho que esse recurso específico seja suficiente para fazer qualquer tipo de detecção confiável aqui.

filbranden
fonte
Estou pensando que, se a frequência mínima e máxima estiverem ausentes no lscpu, isso também poderá ser uma indicação de que a máquina é realmente VM. Mas seu método parece ser mais confiável.
Georgе Stoyanov
1
@ GeorgеStoyanov Isso também pode significar que a escala de frequência está completamente desativada por algum outro motivo, portanto, não é confiável.
Austin Hemmelgarn