Maneira fácil de determinar a tecnologia de virtualização

108

Eu tenho acesso de linha de comando a uma máquina Linux que pode ou não ser virtualizada. Eu quero determinar em que tipo de tecnologia de virtualização ele é executado, se houver (VMWare, VirtualBox, KVM, OpenVZ, Xen). Este não é um ambiente hostil: não estou tentando trabalhar contra uma VM que está tentando se disfarçar, estou diagnosticando um servidor esquisito sobre o qual não sei muito bem.

Mais precisamente, estou ajudando alguém a diagnosticar o problema, não estou no comando. Então eu tenho que transmitir instruções como "copiar e colar este comando" e não "cutucar /proc em algum lugar". Idealmente, seria algo como lshw : um comando facilmente instalável (se não pré-instalado) que faz a pesquisa e imprime informações relevantes.

Qual é a maneira mais fácil de determinar de qual tecnologia de virtualização esse sistema pode ser um convidado? Eu apreciaria se as propostas mencionassem quais tecnologias (incluindo hardware descoberto) podem ser conclusivamente detectadas e quais podem ser conclusivamente eliminadas. Eu estou mais interessado no Linux, mas se ele também funciona para outros unices, é legal.

    
por Gilles 06.09.2013 / 22:56

12 respostas

124

dmidecode -s system-product-name

Eu testei em Vmware Workstation, VirtualBox, QEMU com KVM, QEMU autônomo com o Ubuntu como o sistema operacional convidado. Outros adicionaram outras plataformas com as quais estão familiarizados.

Tecnologias de virtualização

  • Estação de trabalho VMware

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

    root@router:~# dmidecode -s system-product-name
    VirtualBox
    
  • Qemu com 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
    

No bare metal, isso retorna uma identificação do modelo do computador ou da placa-mãe.

/dev/disk/by-id

Se você não tiver os direitos para executar dmidecode , poderá usar:

Tecnologia de virtualização: QEMU

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

Resultado

[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

Referências

por 06.09.2013 / 23:18
32

Se o contêiner estiver executando systemd :

$ systemd-detect-virt
lxc

No KVM, por exemplo, ele retorna:

kvm

e em um host não virtualizado:

none

Veja também:

por 20.09.2014 / 17:49
25

Método desejável

lshw

Este comando produz a seguinte saída em convidados de tecnologia VM VM.

$ sudo lshw -class system

Saída

  • KVM

    mungr                     
        description: Computer
        product: KVM
        vendor: Red Hat
        width: 64 bits
        capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
    
  • Caixa 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

Se você estiver no Ubuntu / Debian, o pacote open-vm-tools pode ser instalado. Ele fornece vmware-checkvm . Retorna apenas um dígito. Um 0 significa que é uma VM, um 1 significa que é um sistema físico.

Métodos menos desejáveis

Se for o KVM, as opções /proc/scsi/scsi e ethtool aparecerão da seguinte forma:

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

O virtio_net faz parte do KVM. O /proc/scsi/scsi informa que você está em uma VM e que provavelmente você é o KVM.

dmesg

Usando os seguintes comandos grep 'ing through dmesg log.

$ 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 ou KVM

    Se a opção "-cpu host" não tiver sido usada, o QEmu e o KVM se identificarão como:

    CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
    

    caso contrário, as informações da CPU do host serão usadas em dmesg ou em /proc/cpuinfo . No entanto, você deve ver algo como:

    [    0.000000] Booting paravirtualized kernel on KVM
    

    Nos novos kernels que entendem que eles estão sendo executados sob paravirtualização.

  • 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
    

Referências

por 07.09.2013 / 00:51
14

O % scriptvirt-what parece cobrir a maioria dos casos bem ...

Eu faço como o aviso dos autores:

Na maioria das vezes, usando este programa é a coisa errada a fazer. Em vez disso, você deve detectar os recursos específicos que realmente deseja usar.

Ele apareceu nos meus sistemas EL5 e EL6 nos últimos anos como parte das instalações padrão. O Ubuntu tem isso, e a fonte também está disponível.

Os fatos detectados pelo script são listados aqui , mas pode ser facilmente estendido para casos de borda.

    
por 23.03.2014 / 09:32
12
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; }

Esses são os testes que usamos na minha empresa.

    
por 07.09.2013 / 01:00
7

Se você receber a pessoa que está ajudando a instalar o facter , faça

facter virtual

Não é necessário acesso root.

Debian Guest no host Debian:

[user@guest]$ facter virtual
virtualbox

Eu não posso garantir o quanto isso funcionaria com o Xen / KVM / Qemu ...

    
por 06.09.2013 / 23:31
7

Em kernels Linux "recentes", o kernel detecta o hipervisor para você e imprime uma mensagem que está facilmente disponível com dmesg . Isto irá dizer-lhe simplesmente:

dmesg | grep "Hypervisor detected"

Por exemplo:

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

Quanto ao que "recente" significa, não estou claro qual versão do kernel foi lançada oficialmente, mas o commit que introduziu esse recurso no código base foi em 7 de maio de 2010. Veja aqui .

    
por 22.01.2015 / 19:37
5

hostnamectl é seu amigo (requer systemd ).

Alguns exemplos:

Laptop sem virtualização

$ 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
    
por 15.03.2017 / 07:34
3

Para o VirtualBox, você pode lspci | grep -i virtualbox , que dá:

$ 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

Como alternativa, dmidecode -s system-product-name (como sugerido por @Rahul Patil) é ainda mais direto ao ponto (mas precisa de root):

$ sudo dmidecode -s system-product-name
VirtualBox

Para o QEMU não KVM, dmidecode -s system-product-name retorna confusamente Bochs, mas dmesg | grep -i qemu funciona (os dispositivos de armazenamento que o QEMU emula normalmente têm o nome QEMU HARDDISK , QEMU DVD-ROM etc ...).

    
por 06.09.2013 / 23:23
3

Às vezes é 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
    
por 10.10.2013 / 12:47
1

Aparentemente, a virtualização vem em várias partes - no meu caso, QEMU, Bochs e KVM (então Ubuntu 14.04). Eu achei que a maneira mais fácil de descobrir o hipervisor em uso era:

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

que no meu caso retornou apenas kvm , que era a informação básica que eu estava procurando (também o OP eu acho), porque me diz o que eu tenho permissão para fazer (por exemplo, executar o ipset para bloquear um ataque DDoS) e como os recursos são compartilhados entre as VMs.

Além disso, tentei

sudo dmidecode -s system-product-name

e

sudo lshw -class system

nenhum dos quais menciona o KVM, mas eles me informaram que minha emulação de hardware foi fornecida por Bochs , que eu confesso que eu nem tinha ouvido falar, mas uma pesquisa rápida revelou informações interessantes ( link ). O comando lshw é um pouco mais informativo do que o dmidecode (por exemplo, dizendo que é 64 bits).

As outras respostas realmente não me disseram nada de útil - facter virtual acabou de retornar physical e ls -1 /dev/disk/by-id/ retornaram ata-QEMU_DVD-ROM_QM00003 , o que mostra que o QEMU está envolvido, mas eu não tenho acesso ao DVD-ROM emulado .

    
por 16.01.2015 / 18:36
1

O Debian vem com este pequeno pacote para detectar o tipo de virtualização:

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

e pouco maior por causa das dependências do Perl:

$ sudo apt-get install imvirt
$ imvirt

Como de costume, execute:

free
cat /proc/meminfo
cat /proc/cpuinfo
dmesg
htop
lshw
dmidecode
lsmod
hwinfo
    
por 02.08.2015 / 23:01