ti-enxame.com

Descubra se o sistema operacional está sendo executado em um ambiente virtual

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.

52
ulve

Usar dmidecode ou lshw e greping parece ser a melhor maneira de descobrir.

11
ulve

O Linux adiciona o sinalizador hypervisor a /proc/cpuinfo se o kernel detectar a execução em algum tipo de hipervisor.

68
Jan Henke

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
26
user66871

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.

19
OkezieE

Corre:

$ dmesg |grep -i hypervisor
Hypervisor detected: KVM
12
Arash

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

3
Nikhil Mulley

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.

3
tante

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.

3
Bruce Ediger

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.

2
Martin Bramwell

Eu fiz isso:

hypervisor=`dmesg --notime | grep -i hypervisor | cut -d ':' -f2 | tr -d " \t\n\r"`
echo "Hypervisor is $hypervisor"

Ajuda em scripts

2

bem, a maneira mais intuitiva que sempre faço é:

$ dmesg | grep -i vmware

1
Shâu Shắc

Requer APIC, retorna 0 se máquina virtual, 1 se computador físico:

grep -q VBOX /sys/firmware/acpi/tables/APIC
0
user227115