¿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.
Usar dmidecode
o lshw
y grep
ing parece ser la mejor manera de averiguarlo.
Linux agrega la bandera hypervisor
a /proc/cpuinfo
si el núcleo detecta la ejecución en algún tipo de hipervisor.
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
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.
Correr:
$ dmesg |grep -i hypervisor
Hypervisor detected: KVM
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
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.
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.
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
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