Usar dmidecode
ou lshw
e grep
ing parece ser a melhor maneira de descobrir.
Existe alguma maneira de descobrir se o SO que estou executando (na verdade, instalando) está sendo executado em uma máquina VMWare. Eu preciso desabilitar ntp
configurações se a instalação automatizada for feita em uma máquina virtual, mas mantenha-as ativadas se estiver instalando em bare-metal.
O Linux adiciona o hypervisor
flag a /proc/cpuinfo
se o kernel detectar a execução em algum tipo de hipervisor.
No Linux, você pode usar o comando virt-what
[root@myhost]# virt-what
vmware
Exemplo de saída para um linux no Windows HyperV
[root@linuxvm11~] # virt-what
hyperv
Isso funcionou melhor para mim, pois me fornece informações específicas sobre o fabricante e o nome do produto.
dmidecode -t system|grep 'Manufacturer\|Product'
Saída no servidor Dell:
Manufacturer: Dell Inc.
Product Name: PowerEdge C5220
Saída na VM do Virtualbox:
Manufacturer: innotek GmbH
Product Name: VirtualBox
Saída no KVM / QEMU:
Manufacturer: QEMU
Product Name: Standard PC (i440FX + PIIX, 1996)
Isso é ótimo para scripts que podem analisá-los para melhor identificação de servidores ... mas se você usar o Chef em sua infraestrutura, poderá verificar o atributo do nó Virtualization -> system
no servidor do chef.
Executar:
$ dmesg |grep -i hypervisor
Hypervisor detected: KVM
Se tudo o que você precisa é uma maneira de saber se o OS / host é um host virtualizado ou não, basta ter um módulo perl Sys :: Detect :: Virtualization e o script com ele virtdetect
. Ele faz todas as possíveis detecções de heurística / adivinhação e relata o ambiente do sistema operacional detectado. Experimente.
A melhor ideia provavelmente seria olhar para o hardware. Pelo menos com o VirtualBox, você pode facilmente determinar que está em uma máquina virtual, devido aos nomes de alguns dos dispositivos de hardware (por exemplo, /sys/block/sda/device/model
dirá "VBOX HARDDISK").
Como todas as suas máquinas são VMware, basta escolher uma dessas coisas e verificar isso.
Eu fiz isso:
hypervisor='dmesg --notime | grep -i hypervisor | cut -d ':' -f2 | tr -d " \t\n\r"
echo "Hypervisor is $hypervisor"
Ajuda em scripts
bem, a maneira mais intuitiva que eu sempre faço é:
$ dmesg | grep -i vmware
Todas essas respostas funcionam em alguns casos, mas não em outras.
Por exemplo, você pode depender de dmesg
enquanto os detalhes do log de inicialização ainda estiverem no buffer de anel, mas provavelmente falhará em uma máquina que esteja em execução por qualquer período de tempo. Pior ainda, uma mensagem pode ser registrada pelo sistema operacional de metal referente a um hipervisor em execução; nesse caso, um teste ingênuo como dmesg | grep -i vmware
retornará um falso positivo.
O teste no Docker é bem diferente. O Docker não possui /proc/cpuinfo
próprio; em vez disso, passa as informações da máquina host. Enquanto isso, dmidecode
falha ao tentar ler um diretório /dev/mem
não visto pelo Docker.
virt-what
tem detecção para contêineres do Docker, mas precisa ser corrigido para lidar com uma alteração recente nos privilégios de contêiner. Ele falha ao acessar /proc/1/environ
antes de atingir os testes do Docker.
É importante prestar atenção ao virt-what
caveat emptor:
Most of the time, using this program is the wrong thing to do. Instead you should detect the specific features you actually want to use.
No meu caso, publicar um tutorial que instale uma tonelada de usuários de porcaria pode não querer, afinal, eu me recuso a deixá-lo rodar no bare metal, com este teste:
[[ 0 < $(grep -c docker /proc/1/cgroup) ]] || [[ "X$(sudo virt-what)X" != "XX" ]] && export VIRTUALIZED=true;
Nota : percebo que o OP pergunta especificamente sobre o VMWare no corpo da pergunta, mas o título da pergunta atrairá muitos leitores (como eu) procurando o caso mais geral.
Requer APIC, retorna 0 se máquina virtual, 1 se computador físico:
grep -q VBOX /sys/firmware/acpi/tables/APIC