Descubra se o SO está sendo executado em um ambiente virtual [duplicado]

43

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.

    
por ulve 01.11.2010 / 17:02

12 respostas

9

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

    
por 02.11.2010 / 08:07
52

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

    
por 24.02.2012 / 21:36
19

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
    
por 05.05.2014 / 10:27
14

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.

    
por 10.09.2015 / 22:51
7

Executar:

$ dmesg |grep -i hypervisor
Hypervisor detected: KVM
    
por 31.08.2014 / 02:20
3

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.

link

    
por 24.02.2012 / 22:07
3

Você poderia experimentar a Red Pill de Joanna Rutkowska. Este pequeno programa examina o IDTR (registro da tabela de descritores de interrupção) usando o instrução SIDT (apenas x86), que aparentemente será definida de maneira diferente por diferentes VMMs.

    
por 25.02.2012 / 03:10
3

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.

    
por 01.11.2010 / 17:14
1

Eu fiz isso:

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

Ajuda em scripts

    
por 12.04.2015 / 19:05
0

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

$ dmesg | grep -i vmware

    
por 09.05.2013 / 16:31
0

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.

    
por 23.01.2016 / 16:44
0

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

grep -q VBOX /sys/firmware/acpi/tables/APIC
    
por 15.04.2017 / 21:01