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

8

Estou procurando um comando de terminal que não exija que o usuário em execução esteja no grupo sudoers e também seja universal e não precise instalar pacotes adicionais. Até agora, descobri que, se o sistema tiver o systemd instalado, poderei 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 sob o nome do ícone e Chassis eu posso ver se é VM ou máquina física. Mas eu queria saber se eu posso usar lscpu , especialmente porque é um método mais universal do que hostnamectl e não requer systemd. Minha teoria é que, se a CPU tem apenas um segmento por núcleo e também não listado 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 tem apenas um thread por core não significa necessariamente que é VM com certeza, mas então todas as CPUs modernas devem ter 2 threads por core e além disso eu também posso levar em conta a falta / presença de frequência mínima e máxima da CPU na saída lscpu .

    
por Georgе Stoyanov 26.07.2018 / 06:09

2 respostas

8

Sob determinadas condições:

terminal command which doesn't require the executing user to be in the sudoers group and also to be universal and not requiring to install additional packages.

o método mais simples óbvio para VMs não modificadas, cujos proprietários intencionalmente não tentaram esconder o fato de que o sistema operacional é 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? Sistema Operacional e Identificação de Virtualização sem Chamadas do Sistema

    
por 26.07.2018 / 07:49
10

Isso também requer o systemd (que, de qualquer forma, é onipresente nos dias de hoje), 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 por systemd-detect-virt , você notará que realmente procura em muitos lugares para detectar várias tecnologias distintas de virtualização ...

Acho que algo ingênuo, como ver a lscpu output, pode funcionar em alguns casos, 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 thread por núcleo, portanto, nem acho que esse recurso específico seja suficiente para fazer qualquer tipo de detecção confiável aqui.

    
por 26.07.2018 / 07:11