Existe alguma maneira de descobrir se o sistema operacional que estou executando (atualmente instalando) está executando em uma máquina VMWare. Preciso desativar as configurações ntp
se a instalação automatizada for feita em uma máquina virtual, mas mantê-las ativadas se estiver instalando no bare metal.
Usar dmidecode
ou lshw
e grep
ing parece ser a melhor maneira de descobrir.
O Linux adiciona o sinalizador hypervisor
a /proc/cpuinfo
se o kernel detectar a execução em algum tipo de hipervisor.
No Linux, você pode usar o comando virt-what
[[email protected]]# virt-what
vmware
Exemplo de saída para um Linux no Windows HyperV
[[email protected]~] # virt-what
hyperv
Isso funcionou melhor para mim, pois 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 em KVM/QEMU:
Manufacturer: QEMU
Product Name: Standard PC (i440FX + PIIX, 1996)
Isso é ótimo para scripts que podem analisá-los para uma 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.
Corre:
$ dmesg |grep -i hypervisor
Hypervisor detected: KVM
Se tudo o que você precisa é uma maneira de saber se o SO/host é ou não um host virtualizado, basta ter um módulo Perl Sys :: Detect :: Virtualization e o script com ele virtdetect
. Ele faz todas as heurísticas possíveis/detecções de palpites e relata o ambiente do SO detectado. De uma chance.
http://search.cpan.org/dist/Sys-Detect-Virtualization/script/virtdetect
A melhor idéia 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.
Você pode experimentar a Pílula Vermelha de Joanna Rutkowska Este pequeno programa examina o IDTR (registro da tabela de descritores de interrupção) usando o SIDT
instrução (somente x86), que aparentemente será definida de forma diferente por diferentes VMMs.
Todas essas respostas funcionam em alguns casos, mas não em outros.
Por exemplo, você pode depender de dmesg
enquanto os detalhes do log de inicialização ainda estiverem no buffer de anel, mas provavelmente ocorrerá falha em uma máquina que esteja sendo executada por qualquer período de tempo. Pior ainda, uma mensagem pode ser registrada pelo sistema operacional bare metal referente a um hipervisor em execução; nesse caso, um teste ingênuo como dmesg | grep -i vmware
retornará um falso positivo.
Os testes no Docker são bem diferentes. O Docker não tem /proc/cpuinfo
própria; 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 por Docker.
virt-what
possui detecção para contêineres do Docker, mas precisa ser corrigido para lidar com uma alteração recente nos privilégios do contêiner. Falha ao tentar acessar /proc/1/environ
antes de atingir os testes do Docker.
É importante prestar atenção ao virt-what
advertência emptor:
Na maioria das vezes, usar esse programa é a coisa errada a se fazer. Em vez disso, você deve detectar os recursos específicos que realmente deseja usar.
No meu caso, publicar um tutorial que instala um ton de usuários ruins 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: Eu sei que o OP pergunta especificamente sobre o VMWare no corpo da pergunta, mas o título da pergunta atrairá muitos leitores (como eu) que procuram o caso mais geral.
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 sempre faço é:
$ dmesg | grep -i vmware
Requer APIC, retorna 0 se máquina virtual, 1 se computador físico:
grep -q VBOX /sys/firmware/acpi/tables/APIC