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 exija a instalação de pacotes adicionais. Até agora, descobri que, se o sistema tiver 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 sob o nome do ícone e o 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 hostnamectl
e 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 está 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 frequência mínima e máxima da CPU na lscpu
saída.
Sob determinadas condições:
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, é
Mais possibilidades:
Fora das condições fornecidas pelo autor do OP, existem abordagens mais complicadas como esta: Onde estou? Identificação de sistema operacional e virtualização sem chamadas de sistema
Isso também requer systemd (que é bastante onipresente hoje em dia), 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 pelo
systemd-detect-virt
, você notará que ele realmente procura em muitos lugares para detectar várias tecnologias de virtualização distintas...Acho que algo ingênuo, como olhar para a
lscpu
saí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 thread por núcleo, portanto, nem acho que esse recurso específico seja suficiente para fazer qualquer tipo de detecção confiável aqui.