VMware Linux Server: ¿cómo puede saber si es una máquina virtual o un hardware real?

46

Una pregunta interesante He iniciado sesión en un host Linux (probablemente SuSE). ¿Hay alguna forma en que pueda decir programáticamente que soy un host VM o no?

También suponga que las vmtools no están instaladas.

mdpc
fuente
Compruebe también esta respuesta: unix.stackexchange.com/a/32605/103980
Muhamed Huseinbašić el

Respuestas:

29

Utilice herramientas estándar de Linux para inspeccionar el hardware del sistema.

cat /proc/scsi/scsi

o

ethtool -i eth0

o

dmidecode | grep -i vmware

Si la salida de estos comandos muestra hardware con un nombre de fabricante de "VMWare", está en una VM VMWare. Aquí se proporcionan varios comandos porque las configuraciones y herramientas del sistema son diferentes.

Greg Cain
fuente
12
¿Puedes explicar lo que hacen estos comandos, en lugar de solo proporcionar comandos vagos?
Stefan Lasiewski
Gracias. cat /proc/scsi/scsies bueno porque parece estar disponible en todas partes y no requiere instalar un nuevo software o ejecutarse con derechos privilegiados.
tiktak
@tiktak No veo /proc/scsi/scsien mi caja de Debian 7 ...
Kyle Strand
1
Tenga en cuenta que esto no es 100% confiable. Por ejemplo, los cuadros de AWS no parecerán máquinas virtuales. Consulte man virt-whatel script heurístico creado para este propósito de detección (para los sistemas RedHat / Fedora) y las advertencias involucradas.
Comodín el
13
facter virtual 
xenu

indica que es una VM. Si devuelve "físico", entonces lo contrario es cierto (no una VM), por ejemplo:

facter virtual
Physical
usuario155575
fuente
Sin embargo, este es un paquete especial no estándar ... pero me gusta.
mdpc
1
@mdpc Debería estar presente en cualquier sistema que use puppet.
Michael Hampton
11

Hay una aplicación práctica que podría ayudar llamada virt-what . No lo he usado con VMWare, pero funcionó muy bien con Qemu.

Raynet
fuente
1
Desafortunadamente, el RPM binario tiene dos dependencias, dmidecode y util-linux-ng cuando se prueba en un comercial de SuSE.
mdpc
10

Es posible que pueda obtener una idea mirando a su alrededor /sys. Por ejemplo /sys/class/dmi/id/sys_vendortiene un valor de VMware, Inc..

Si está instalado, puede usar lshw . El comando lshw -class systemdevuelve esto en mi sistema:

server1
    description: Computer
    product: VMware Virtual Platform
    vendor: VMware, Inc.
    version: None
    serial: VMware-...
    width: 64 bits
    capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
Zoredache
fuente
En las instancias de SuSE que tengo acceso a lshw no existe. Además, / sys / class / dmi / ... no existe.
mdpc
6

Algunos entornos virtuales nombran algunos de sus dispositivos virtuales con nombres que son un poco reveladores, por ejemplo, VirtualBox presenta una tarjeta gráfica que se llama a sí misma "Adaptador de pantalla VirtualBox". Pero buscar esos vínculos lo vincula a una VM en particular y posiblemente a una gama limitada de versiones.

Es posible que su código vea qué tipo de virtualización podría configurar. Si eso falla por completo, es posible que esté en una máquina virtual. Pero usted podría estar fácilmente en una caja que no tiene hardware compatible con VM.

staticsan
fuente
Tu primera respuesta fue la correcta. Verifique los nombres de los controladores del dispositivo.
Izzy
4

Para Linux, escriba dmesg |grep DMI:

SALIDA VIRTUAL

[root @ myhost ~] # dmesg | grep DMI
DMI 2.3 presente.
DMI: Máquina virtual de Microsoft Corporation / Máquina virtual, BIOS 090006 23/05/2012

[root @ myhost ~] # dmesg | grep -i virtual
DMI: Máquina virtual de Microsoft Corporation / Máquina virtual, BIOS 090006 23/05/2012
Arranque del kernel paravirtualizado en hardware desnudo
input: emulación del botón del mouse de Macintosh como / devices / virtual / input / input1
scsi 0: 0: 0: 0: Acceso directo Msft Virtual Disk 1.0 PQ: 0 ANSI: 4
entrada: mouse compatible con HID de Microsoft Vmbus como / devices / virtual / input / input4

POR EJEMPLO DE ANFITRIÓN FÍSICA

[root @ backdev1 ~] # dmesg | grep DMI
DMI 2.5 presente.
DMI: IBM System x3650 M3 - [7945AC1] - / 90Y4784, BIOS - [D6E153AUS-1.12] - 30/06/2011
usuario215983
fuente
1
Un problema importante con su solución es que dmesg lee el búfer del núcleo y tiene un tamaño limitado. Si hay muchos mensajes o un poco de tiempo desde que se reinició el sistema, esta información no estará disponible.
mdpc
4

Hay mucho código para detectar si estás en una máquina virtual o no. Comience con la píldora roja y busque desde allí. Este artículo en Offensive Computing también es una buena lectura.

Eso es si ninguno de los fáciles anteriores funciona :)

Bill Weiss
fuente
El primer enlace está roto. El segundo está roto o es lento.
Comodín el
Tienes razón. Las arenas del tiempo se las han comido ... Veré si puedo encontrar enlaces alternativos.
Bill Weiss el
Es una pena; "píldora roja" sonaba interesante. :)
Comodín
1
Actualizado con enlaces archive.org.
Bill Weiss el
3

También puede buscar la primera parte de su dirección de Mac aquí y ver si aparece como asignada a alguna de las empresas de virtualización.

Zypher
fuente
Idea interesante ... Creo que funciona (siempre y cuando se incluya un dispositivo de red en la VM ;-))
mdpc
2
No será confiable En muchos casos, el mac se puede establecer en un valor arbitrario. Esto permite clonar el mac de la máquina original al convertirlo a VM. Algunos programas vinculan su licencia a la Mac y, a menudo, es imposible obtener una nueva licencia (el proveedor se declaró en quiebra o los costos son prohibitivos).
Tonny
3

Los dispositivos virtuales también serán revelados por lspci y / o la información del dispositivo de disco en / proc:

lspci | grep -i vmware

grep -i vmware /proc/scsi/scsi /proc/ide/*/model
Brezo
fuente
2

En Linux, la información del sistema se revela en / sys / devices / virtual / dmi / id /. Vea mi respuesta aquí para obtener un script útil para mostrarle toda la información disponible.

raíz no requerida.

Mike S
fuente
1

No me gustó ninguna de estas soluciones, ya que generalmente hay un controlador VMware CDROM o un controlador de memoria instalado, por lo que dmesg me lo confirma o me lo niega rápidamente.

[servidor @ usuario ~] $ dmesg | grep VMware
hda: Unidad de CDROM virtual IDE de VMware, unidad de CD / DVD-ROM ATAPI
Proveedor: VMware Modelo: Disco virtual Rev: 1.0
Proveedor: VMware Modelo: Disco virtual Rev: 1.0
Proveedor: VMware Modelo: Disco virtual Rev: 1.0
Proveedor: VMware Modelo: Disco virtual Rev: 1.0
Proveedor: VMware Modelo: Disco virtual Rev: 1.0
Proveedor: VMware Modelo: Disco virtual Rev: 1.0
Proveedor: VMware Modelo: Disco virtual Rev: 1.0
Controlador de control de memoria VMware inicializado
Greg
fuente
3
Esto funcionará en el inicio, pero luego no puede garantizar que dmesg no se haya borrado o desbordado.
mattdm
Esto es lo que suelo hacer también, eso es gremear dmesg
tpaul
1

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 ideal 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 -> systemen el servidor de chef.

user751528
fuente