Manera fácil de determinar la tecnología de virtualización


115

Tengo acceso de línea de comando a una máquina Linux que puede o no ser virtualizada. Quiero determinar en qué tipo de tecnología de virtualización se ejecuta, si hay alguna (VMWare, VirtualBox, KVM, OpenVZ, Xen,). Este no es un entorno hostil: no estoy tratando de trabajar contra una máquina virtual que está tratando de disfrazarse, estoy diagnosticando un servidor inestable del que sé poco.

Más precisamente, estoy ayudando a alguien a diagnosticar el problema, no estoy sentado al timón. Así que tengo que transmitir instrucciones como "copiar y pegar este comando" y no "hurgar en /procalguna parte". Idealmente, sería algo así como lshw: un comando fácilmente instalable (si no está preinstalado) que hace la búsqueda e imprime información relevante.

¿Cuál es la forma más fácil de determinar de qué tecnología de virtualización puede ser invitado este sistema? Agradecería que las propuestas mencionaran qué tecnologías (incluido el hardware desnudo) pueden detectarse de manera concluyente y cuáles pueden eliminarse de manera concluyente. Estoy principalmente interesado en Linux, pero si también funciona para otros dispositivos, está bien.


Respuestas:


128

dmidecode -s system-product-name

He probado en Vmware Workstation, VirtualBox, QEMU con KVM, QEMU independiente con Ubuntu como SO huésped. Otros han agregado plataformas adicionales con las que también están familiarizados.

Tecnologías de virtualización

  • VMware Estación de trabajo

    root@router:~# dmidecode -s system-product-name
    VMware Virtual Platform
    
  • VirtualBox

    root@router:~# dmidecode -s system-product-name
    VirtualBox
    
  • Qemu con KVM

    root@router:~# dmidecode -s system-product-name
    KVM
    
  • Qemu (emulado)

    root@router:~# dmidecode -s system-product-name
    Bochs
    
  • Microsoft VirtualPC

    root@router:~# dmidecode | egrep -i 'manufacturer|product'
    Manufacturer: Microsoft Corporation
    Product Name: Virtual Machine
    
  • Virtuozzo

    root@router:~# dmidecode
    /dev/mem: Permission denied
    
  • Xen

    root@router:~# dmidecode | grep -i domU
    Product Name: HVM domU
    

En metal desnudo, esto devuelve una identificación del modelo de computadora o placa base.

/dev/disk/by-id

Si no tiene los derechos para ejecutar dmidecode, puede usar:

Tecnología de virtualización: QEMU

ls -1 /dev/disk/by-id/

Salida

[root@host-7-129 ~]# ls -1 /dev/disk/by-id/
ata-QEMU_DVD-ROM_QM00003
ata-QEMU_HARDDISK_QM00001
ata-QEMU_HARDDISK_QM00001-part1
ata-QEMU_HARDDISK_QM00002
ata-QEMU_HARDDISK_QM00002-part1
scsi-SATA_QEMU_HARDDISK_QM00001
scsi-SATA_QEMU_HARDDISK_QM00001-part1
scsi-SATA_QEMU_HARDDISK_QM00002
scsi-SATA_QEMU_HARDDISK_QM00002-part1

Referencias


55
Hyper-V devuelve un casi inútil Virtual Machinepara dmidecode -s system-product-name. Tampoco hay nada obvio en / dev / disk / by-id. Facter parece detectar hyperv mirando la salida de lspci.
Zoredache

1
Cheque abierto para VZ /proc/user_beancounters
exussum

+1 para /proc/user_beancountersmás de OpenVZ, lo que probablemente sea un VPS barato como ejemplo.
erm3nda

Ambos dmidecodey las /dev/disk/by-idsoluciones fallan en un contenedor Docker. Ver unix.stackexchange.com/a/257207/106572
Martin Bramwell el

3
con qemu 2.5.0 (al menos), dmidecode -s system-product-namedevuelve una descripción genérica de hardware en lugar del "KVM" o "Bochs" que se muestran arriba. Para mí, esta cadena es Standard PC (i440FX + PIIX, 1996). dmidecode -s system-manufacturerdevuelve la cadena mucho menos genérica QEMU. Dado que qemu permite que se proporcionen datos DMI, sospecho que dmidecode es relativamente fácil de engañar, sin importar el campo que se lea.
Mark

38

Si el contenedor se está ejecutando systemd:

$ systemd-detect-virt
lxc

En KVM, por ejemplo, devuelve:

kvm

y en un host no virtualizado:

none

Ver también:


Esto también funciona para openvz.
lepe

Salió kvmpara Google Compute Engine, que es lo que estaba tratando de resolver. ¡Gracias!
snetch

¡Comando simple que funciona de maravilla en Ubuntu 18.04! Muchas gracias :)
develCuy

28

Método deseable

lshw

Este comando produce el siguiente resultado en invitados de tecnología VM variados.

$ sudo lshw -class system

Salida

  • KVM

    mungr                     
        description: Computer
        product: KVM
        vendor: Red Hat
        width: 64 bits
        capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
    
  • Caja virtual

    fedora17                  
        description: Computer
        product: VirtualBox ()
        vendor: innotek GmbH
        version: 1.2
        serial: 0
        width: 64 bits
        capabilities: smbios-2.5 dmi-2.5 vsyscall32
    
  • VMWare

    partedmagic
        description: Computer
        product: VMware Virtual Platform ()
        vendor: VMware, Inc.
        version: None
        serial: VMware-56 4d 94 a0 53 e3 f3 c6-f9 a6 eb 1a 89 70 04 57
        width: 32 bits
        capabilities: smbios-2.4 dmi-2.4 smp-1.4 smp
    

Scripting

Si estás en Ubuntu / Debian, hay un paquete que open-vm-toolsse puede instalar. Proporciona vmware-checkvm. Solo devuelve un dígito. A 0significa que es una VM, 1significa que es un sistema físico.

Métodos menos deseables

Si es KVM, las opciones /proc/scsi/scsiy se ethtoolmuestran de la siguiente manera:

SCSI

$ cat /proc/scsi/scsi 
Attached devices:
Host: scsi1 Channel: 00 Id: 00 Lun: 00
  Vendor: QEMU     Model: QEMU DVD-ROM     Rev: 0.9.
  Type:   CD-ROM                           ANSI  SCSI revision: 05

ethtool

$ ethtool -i eth0
driver: virtio_net
version: 
firmware-version: 
bus-info: virtio0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

El virtio_net es parte de KVM. El /proc/scsi/scsite dice que estás en una VM, y que probablemente eres KVM.

dmesg

Usando los siguientes comandos grep'a través del dmesgregistro.

$ sudo dmesg | grep -i virtual
  • VMWare

    VMware vmxnet virtual NIC driver
     Vendor: VMware    Model: Virtual disk      Rev: 1.0 
    hda: VMware Virtual IDE CDROM Drive, ATAPI CD/DVD-ROM drive
    
  • QEmu o KVM

    Si la "-cpu host"opción no se ha utilizado, QEmu y KVM se identificarán como:

    CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
    

    de lo contrario, la información de la CPU del host se usará tanto en dmesgcomo en /proc/cpuinfo. Sin embargo, debería ver algo como:

    [    0.000000] Booting paravirtualized kernel on KVM
    

    En núcleos más nuevos que entienden que se están ejecutando bajo paravirtualización.

  • Microsoft VirtualPC

    hda: Virtual HD, ATA DISK drive
    hdc: Virtual CD, ATAPI CD/DVD-ROM drive
    
  • Xen

    $ sudo dmesg | grep -i xen
    Xen virtual console successfully installed as tty1
    
  • Virtuozzo

    # method #1
    $ sudo dmesg
    (returns no output)
    
    # method #2
    $ sudo cat /var/log/dmesg
    (returns no output)
    
    # method #3
    $ sudo ls -al /proc/vz
    veinfo  veinfo_redir  veredir  vestat  vzaquota  vzdata
    

Referencias


Ese tipo de hurgar en los controladores es lo que esperaba evitar: será diferente para cada tecnología VM y dependerá de la configuración. El nombre del producto informado por lshw -class systemy dmidecodees exactamente lo que esperaba encontrar.
Gilles

@Gilles: sí, no quise que los usaras solo para capturar los métodos. Estoy presentando una instancia de Virtual Box y VMWare ahora para confirmar la lshwsalida también para esas plataformas. Dame un par de minutos y actualizaré el A.
slm

@Gilles: parece que lshw también puede hacer el trabajo para todas las tecnologías. He movido las respuestas al final de la respuesta que no eran lo que estabas buscando para que otros no tengan que saltarlas.
slm

dmesg llena un buffer de anillo de tamaño fijo con todo tipo de cosas. Es completamente inapropiado para esta tarea. Ver unix.stackexchange.com/a/257207/106572
Martin Bramwell el

@ Martin - y es por eso que está en la sección menos deseable de mi respuesta. Normalmente escribo respuestas que incluyen todo, mostrando una variedad de métodos.
slm

16

El virt-whatguión parece cubrir bien la mayoría de los casos ...

Yo hago como el descargo de responsabilidad de los autores:

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.

Apareció en mis sistemas EL5 y EL6 durante los últimos años como parte de las instalaciones predeterminadas. Ubuntu lo tiene, y la fuente también está disponible.

Los hechos detectados por el script se enumeran aquí , pero pueden ampliarse fácilmente para casos extremos.


¿Enlazar? ¿Qué sistemas reconoce?
Gilles

1
@Gilles Edited: Pero el script generalmente detecta KVM, Xen, QEMU, VirtualBox, Parallels, OpenVZ, IBM System Z, LPAR, z / VM, Hitachi Virtage, VMWare, Microsoft Hyper-V. Hmm ... ¿debería incluirse LXC?
ewwhite

LXC está incluido ahora.
ewwhite

A partir de enero de 2016, falla con Docker. Ver unix.stackexchange.com/a/257207/106572
Martin Bramwell el

13
isVMware() { [[ $(dmidecode -s system-manufacturer) = 'VMware, Inc.' ]]; }
isXen   () { [[ $(dmidecode -s system-manufacturer) = 'Xen'          ]]; }
isKVM   () { [[ $(dmidecode -s system-product-name) = 'KVM'          ]]; }
isVBox  () { [[ $(dmidecode -s system-product-name) = 'VirtualBox'   ]]; }
isVM    () { isVMware || isXen || isKVM || isVBox; }

Esas son las pruebas que utilizamos en mi empresa.


9

Si obtiene la persona que está ayudando a instalar facter, puede hacerlo

facter virtual

No se necesita acceso de root.

Invitado de Debian en el host de Debian:

[user@guest]$ facter virtual
virtualbox

No puedo garantizar cuán bien funcionaría esto con Xen / KVM / Qemu ...


8

hostnamectles tu amigo (requiere systemd)

Algunos ejemplos:

Laptop sin ninguna virtualización

$ hostnamectl status
   Static hostname: earth.gangs.net
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: 18a0752e1ccbeef09da51ad17fab1f1b
           Boot ID: beefdc99969e4a4a8525ff842b383c62
  Operating System: Ubuntu 16.04.2 LTS
            Kernel: Linux 4.4.0-66-generic
      Architecture: x86-64

Xen

$ hostnamectl status
   Static hostname: pluto.gangs.net
         Icon name: computer-vm
           Chassis: vm
        Machine ID: beef39aebbf8ba220ed0438b54497609
           Boot ID: beefc71e97ed48dbb436a470fe1920e1
    Virtualization: xen
  Operating System: Ubuntu 16.04.2 LTS
            Kernel: Linux 3.13.0-37-generic
      Architecture: x86-64

OpenVZ

$ hostnamectl status
   Static hostname: mars.gangs.net
         Icon name: computer-container
           Chassis: container
        Machine ID: 55296cb0566a4aaca10b8e3a4b28beef
           Boot ID: 1bb259b0eb064d9eb8a22d112211beef
    Virtualization: openvz
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 2.6.32-042stab120.16
      Architecture: x86-64

KVM

$ hostnamectl status
   Static hostname: mercury.gangs.net
         Icon name: computer-vm
           Chassis: vm
        Machine ID: beeffefc50ae499881b024c25895ec86
           Boot ID: beef9c7662a240b3b3b04cef3d1518f0
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-514.10.2.el7.x86_64
      Architecture: x86-64

¿Cómo determina el sistema operativo si se está ejecutando dentro de una máquina virtual? no debería, he instalado un debian muy básico desde la línea de comandos y hostnamectl se muestra Virtualization: oracleindependientemente de que no haya instalado ninguna paravirtualización | Adiciones de invitados de Virtualbox
Ivanzinho

7

En los núcleos "recientes" de Linux, el núcleo detecta el hipervisor por usted e imprime un mensaje que está fácilmente disponible dmesg. Esto te dirá simplemente:

dmesg | grep "Hypervisor detected"

Por ejemplo:

$ dmesg | grep "Hypervisor detected"
Hypervisor detected: VMware

En cuanto a lo que significa "reciente", no estoy claro en qué versión del kernel se lanzó oficialmente, pero el compromiso que introdujo esta característica en la base del código fue el 7 de mayo de 2010. Vea aquí .


dmesgllena un búfer de anillo de tamaño fijo con todo tipo de cosas. Es completamente inapropiado para esta tarea. Ver unix.stackexchange.com/a/257207/106572
Martin Bramwell el

3

Para VirtualBox, podría lspci | grep -i virtualbox, eso da:

$ lspci | grep -i virtualbox
00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter
00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service

Alternativamente, dmidecode -s system-product-name(como sugiere @Rahul Patil) es aún más directo al punto (pero necesita root):

$ sudo dmidecode -s system-product-name
VirtualBox

Para QEMU no KVM, dmidecode -s system-product-namedevuelve Bochs de manera confusa, pero dmesg | grep -i qemufunciona (los dispositivos de almacenamiento que emula QEMU generalmente tienen el nombre QEMU HARDDISK, QEMU DVD-ROMetc.).


3

A veces es complicado :)

root@server:~# dmidecode -s system-product-name
Bochs

root@server:~# dmidecode | egrep -i 'manufacturer|product|vendor'
        Vendor: Bochs
        Manufacturer: Bochs
        Product Name: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs

root@server:~# virt-what
root@server:~# dpkg -l |grep virt-what
ii  virt-what                           1.2-1                        detect if we are running in a virtual machine

root@server:~# egrep -i 'virtual|vbox' /var/log/dmesg
[    0.000000] Booting paravirtualized kernel on KVM
[    0.385701] input: Macintosh mouse button emulation as /devices/virtual/input/input0

2

systemd-detect-virt

Esto detectará el tipo de tecnología de virtualización utilizada y la generará.

systemd-detect-virt

Distinguir entre virtualización de máquinas y virtualización de contenedores

Use las opciones --containery --vmpara limitar el tipo de virtualización que se detecta.

Códigos de salida

Si solo desea saber si se detecta la virtualización o no, sin los detalles, entonces es más fácil verificar el código de salida. Devolverá el código de salida 0 si se detecta virtualización y, de lo contrario, no será cero.



1

Aparentemente, la virtualización viene en varias partes, en mi caso QEMU, Bochs y KVM (luego Ubuntu 14.04). Encontré que la forma más fácil de descubrir el hipervisor en uso era:

sudo apt-get install virt-what
sudo virt-what

que en mi caso devolvió simplemente kvmcuál era la información básica que estaba buscando (también el OP, creo), porque me dice lo que tengo permitido hacer (por ejemplo, ejecutar ipset para bloquear un ataque DDoS) y cómo se comparten los recursos entre las máquinas virtuales .

Además lo intenté

sudo dmidecode -s system-product-name

y

sudo lshw -class system

ninguno de los cuales menciona KVM, pero ambos me informaron que mi emulación de hardware fue proporcionada por Bochslo que confieso que ni siquiera había oído hablar, pero una búsqueda rápida arrojó información interesante ( http://en.wikipedia.org/wiki/ Bochs ). El comando lshw es un poco más informativo que dmidecode (por ejemplo, me dice que es de 64 bits).

Las otras respuestas realmente no me dijeron nada útil: facter virtualsolo regresaron physicaly ls -1 /dev/disk/by-id/regresaron, lo ata-QEMU_DVD-ROM_QM00003que muestra que QEMU está involucrado, pero de todos modos no tengo acceso al DVD-ROM emulado.


1

Debian viene con este pequeño paquete para detectar el tipo de virtualización:

$ sudo apt-get install virt-what
$ virt-what

y un poco más grande debido a las dependencias de Perl:

$ sudo apt-get install imvirt
$ imvirt

Como siempre corre:

free
cat /proc/meminfo
cat /proc/cpuinfo
dmesg
htop
lshw
dmidecode
lsmod
hwinfo

Me golpeaste para imvirtir, y no sabía virt-what. ¿detallarías el resultado de ambos como respuestas anteriores para mejorar tu publicación?
Rui F Ribeiro
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.