it-swarm-es.tech

Averigüe si el sistema operativo se ejecuta en un entorno virtual

¿Hay alguna manera de averiguar si el sistema operativo que estoy ejecutando (realmente instalando) se está ejecutando en una máquina VMWare. Necesito deshabilitar la configuración de ntp si la instalación automatizada se realiza en una máquina virtual, pero mantenerla habilitada si la instalación se realiza en metal desnudo.

52
ulve

Usar dmidecode o lshw y greping parece ser la mejor manera de averiguarlo.

11
ulve

Linux agrega la bandera hypervisor a /proc/cpuinfo si el núcleo detecta la ejecución en algún tipo de hipervisor.

68
Jan Henke

En Linux puedes usar el comando virt-what

[[email protected]]# virt-what
vmware

Ejemplo de salida para un linux en Windows HyperV

[[email protected]~] # virt-what
hyperv
26
user66871

Esto funcionó mejor para mí, ya que me da información específica sobre el fabricante y el nombre del producto.

dmidecode -t system|grep 'Manufacturer\|Product'

Salida en el servidor Dell:

Manufacturer: Dell Inc.
Product Name: PowerEdge C5220

Salida en Virtualbox VM:

Manufacturer: innotek GmbH
Product Name: VirtualBox

Salida en KVM/QEMU:

Manufacturer: QEMU
Product Name: Standard PC (i440FX + PIIX, 1996)

Esto es excelente para los scripts que pueden analizarlos para una mejor identificación de los servidores ... pero si usa Chef en su infraestructura, puede verificar el atributo de nodo Virtualization -> system en el servidor del chef.

19
OkezieE

Correr:

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

Si todo lo que necesita es una forma de saber si el SO/Host es un Host virtualizado o no, solo tiene un módulo Perl Sys :: Detect :: Virtualization y el script con él virtdetect. Realiza todas las posibles detecciones heurísticas/conjeturas e informa el entorno del sistema operativo detectado. Darle una oportunidad.

http://search.cpan.org/dist/Sys-Detect-Virtualization/script/virtdetect

3
Nikhil Mulley

La mejor idea probablemente sería mirar el hardware. Al menos con VirtualBox puede determinar fácilmente que está en una máquina virtual, debido a los nombres de algunos de los dispositivos de hardware (por ejemplo, /sys/block/sda/device/model dirá "VBOX HARDDISK").

Como todas sus máquinas son VMware, simplemente elija una de esas cosas y verifique eso.

3
tante

Puedes probar Joanna Rutkowska's Red Pill Este pequeño programa examina el IDTR (registro de la tabla del descriptor de interrupciones) usando la instrucción SIDT (solo x86), que aparentemente lo hará ser configurado de manera diferente por diferentes VMM.

3
Bruce Ediger

Todas estas respuestas funcionan en algunos casos pero no en otros.

Por ejemplo, puede depender de dmesg mientras los detalles del registro de arranque todavía están en el búfer de anillo, pero es probable que falle en una máquina que ha estado funcionando durante un período de tiempo prolongado. Peor aún, un sistema operativo simple puede registrar un mensaje con respecto a un hipervisor en ejecución, en cuyo caso una prueba ingenua como dmesg | grep -i vmware devolverá un falso positivo.

Las pruebas con Docker son bastante diferentes. Docker no tiene /proc/cpuinfo de su propia; en su lugar, pasa la información de la máquina Host. Mientras tanto, dmidecode falla al intentar leer un directorio /dev/mem no visto por Docker.

virt-what tiene detección para contenedores Docker, pero necesita ser parcheado para hacer frente a un cambio reciente en los privilegios de contenedor. Se bloquea al intentar acceder /proc/1/environ antes de que llegue a las pruebas de Docker.

Es importante prestar atención a la virt-what advertencia emptor:

La mayoría de las veces, usar este programa es algo incorrecto. En su lugar, debe detectar las características específicas que realmente desea utilizar.

En mi caso, al publicar un tutorial que instala un ton de basura que los usuarios pueden no querer después de todo, me niego a dejar que se ejecute en metal desnudo, con esta prueba:

[[ 0 < $(grep -c docker /proc/1/cgroup) ]] || [[ "X$(Sudo virt-what)X" != "XX" ]] && export VIRTUALIZED=true;

Nota: Me doy cuenta de que el OP pregunta específicamente sobre VMWare en el cuerpo de la pregunta, pero el título de la pregunta atraerá a muchos lectores (como yo) que buscan el caso más general.

2
Martin Bramwell

Lo he hecho:

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

Ayuda en guiones

bueno, la forma más intuitiva que siempre hago es:

$ dmesg | grep -i vmware

1
Shâu Shắc

Requiere APIC, devuelve 0 si es una máquina virtual, 1 si es una computadora física:

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