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

115

Eu tenho acesso por linha de comando a uma máquina Linux que pode ou não ser virtualizada. 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 sei pouco.

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

Qual é a maneira mais fácil de determinar de que tecnologia de virtualização este sistema pode ser convidado? Eu apreciaria se as propostas mencionassem quais tecnologias (incluindo hardware vazio) podem ser detectadas conclusivamente e quais podem ser eliminadas conclusivamente. Estou interessado principalmente no Linux, mas se ele também funcionar para outros departamentos, isso é bom.

Gilles
fonte

Respostas:

128

dmidecode -s system-product-name

Eu testei no Vmware Workstation, VirtualBox, QEMU com KVM, QEMU autônomo com Ubuntu como sistema operacional convidado. Outros adicionaram plataformas adicionais 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 tem os direitos de execução dmidecode, pode 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

Rahul Patil
fonte
5
Hiper-V retorna uma quase inútil Virtual Machinepara dmidecode -s system-product-name. Também não há nada óbvio em / dev / disk / by-id. O facter parece detectar o hyperv observando a saída lspci.
Zoredache
1
Abra a verificação de VZ para /proc/user_beancounters
exussum
+1 para /proc/user_beancountersmais de OpenVZ, o que é provável em VPS baratos como exemplo.
erm3nda
As soluções dmidecodee /dev/disk/by-idfalham em um contêiner do Docker. Veja unix.stackexchange.com/a/257207/106572
Martin Bramwell
3
com o qemu 2.5.0 (pelo menos), dmidecode -s system-product-nameretorna uma descrição genérica de hardware em vez dos "KVM" ou "Bochs" mostrados acima. Para mim, essa string é Standard PC (i440FX + PIIX, 1996). dmidecode -s system-manufacturerretorna a string muito menos genérica QEMU. Como o qemu permite que dados DMI sejam fornecidos, suspeito que o dmidecode seja relativamente fácil de enganar - não importa o campo que esteja sendo lido.
Mark
38

Se o contêiner estiver em execução systemd:

$ systemd-detect-virt
lxc

No KVM, por exemplo, ele retorna:

kvm

e em um host não virtualizado:

none

Veja também:

starfry
fonte
Isso funciona para o openvz também.
Lepe
Foi produzido kvmpara o Google Compute Engine, que é o que eu estava tentando descobrir. Obrigado!
snetch
Comando simples que funciona como um encanto no Ubuntu 18.04! Agradeço o seu
contato
28

Método desejável

lshw

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

$ sudo lshw -class system

Resultado

  • KVM

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

    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
    

Script

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

Métodos menos desejáveis

Se for KVM, as opções /proc/scsi/scsie ethtoolaparecerão da seguinte maneira:

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/scsidiz que você está em uma VM e que provavelmente é o KVM.

dmesg

Usando os seguintes comandos grepatravés do dmesglog.

$ 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 "-cpu host"opção 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 de 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 kernels mais recentes, eles entendem que estão executando 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

slm
fonte
Esse tipo de bisbilhotar os drivers é o que eu esperava evitar: será diferente para cada tecnologia de VM e dependerá das configurações. O nome do produto relatado lshw -class systeme dmidecodeé exatamente o que eu esperava encontrar.
Gilles
@ Gilles - sim, eu não quis dizer para você usá-los, apenas para capturar os métodos. Estou trazendo agora uma instância de Virtual Box e VMWare para confirmar a lshwsaída também para essas plataformas. Dê-me alguns minutos e eu atualizarei o A.
slm
@Gilles - parece que o lshw pode fazer o trabalho também para todas as tecnologias. Movi as respostas para o final da resposta que não eram o que você estava procurando, para que outras pessoas não precisem pular as respostas.
slm
O dmesg preenche um buffer de anel de tamanho fixo com todos os tipos de coisas. É completamente inapropriado para esta tarefa. Veja unix.stackexchange.com/a/257207/106572
Martin Bramwell
@ Martin - e é por isso que está na seção menos desejável da minha resposta. Normalmente, escrevo respostas com tudo incluído, mostrando uma variedade de métodos.
slm
16

O virt-whatscript parece cobrir bem a maioria dos casos ...

I fazer , como a isenção de responsabilidade de seus autores:

Na maioria das vezes, usar este programa é a coisa errada a se 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 possui, e a fonte também está disponível.

Os fatos detectados pelo script estão listados aqui , mas podem ser facilmente estendidos para casos extremos.

ewwhite
fonte
Ligação? Quais sistemas ele reconhece?
Gilles
1
@Gilles Edited: Mas o script geralmente detecta KVM, Xen, QEMU, VirtualBox, Parallels, OpenVZ, IBM System Z, LPAR, z / VM, Hitachi Virtage, VMWare, Microsoft Hyper-V. Hmm ... o LXC deve ser incluído?
ewwhite
O LXC está incluído agora.
Ewhite #
Em janeiro de 2016, ele falhou com o Docker. Veja unix.stackexchange.com/a/257207/106572
Martin Bramwell
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; }

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

John Kugelman
fonte
9

Se você receber a pessoa que está ajudando a instalar facter, poderá fazer

facter virtual

Não é necessário acesso root.

Convidado Debian no host Debian:

[user@guest]$ facter virtual
virtualbox

Não posso garantir como isso funcionaria com o Xen / KVM / Qemu ...

Joseph R.
fonte
8

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
Derick
fonte
como o sistema operacional determina se está sendo executado dentro de uma máquina virtual? não deveria, eu instalei um debian muito básico da linha de comando e o hostnamectl shows, Virtualization: oracleindependentemente de eu não ter instalado nenhuma paravirtualização | Adições de convidados do Virtualbox
Ivanzinho 23/10
7

Nos kernels linux "recentes", o kernel detecta o hipervisor para você e imprime uma mensagem que está facilmente disponível dmesg. Isso lhe dirá simplesmente:

dmesg | grep "Hypervisor detected"

Por exemplo:

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

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

Russ
fonte
dmesgpreenche um buffer de anel de tamanho fixo com todos os tipos de coisas. É completamente inapropriado para esta tarefa. Veja unix.stackexchange.com/a/257207/106572
Martin Bramwell
3

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

$ 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 sugere @Rahul Patil), é ainda mais direto ao ponto (mas precisa de raiz):

$ sudo dmidecode -s system-product-name
VirtualBox

Para QEMU que não seja KVM, dmidecode -s system-product-nameretorna Bochs de maneira confusa, mas dmesg | grep -i qemufunciona (os dispositivos de armazenamento que o QEMU emula geralmente têm o nome QEMU HARDDISK, QEMU DVD-ROMetc ...).

Renan
fonte
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
jan.polnicky
fonte
2

systemd-detect-virt

Isso detectará o tipo de tecnologia de virtualização usada e a produzirá.

systemd-detect-virt

Distinguir entre virtualização de máquina e virtualização de contêiner

Use as opções --containere --vmpara limitar o tipo de virtualização detectada.

Códigos de saída

Se você deseja apenas saber se a virtualização foi detectada ou não, sem os detalhes, é mais fácil verificar o código de saída. Ele retornará o código de saída 0 se a virtualização for detectada e diferente de zero.


Owen Pauling
fonte
1

Aparentemente, a virtualização vem em várias partes - no meu caso, QEMU, Bochs e KVM (então Ubuntu 14.04). Eu achei 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 simplesmente kvmqual era a informação básica que eu estava procurando (também acho o OP), porque me diz o que 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 ambos me informaram que minha emulação de hardware foi fornecida pela Bochsqual confesso que nem tinha ouvido falar, mas uma rápida pesquisa resultou em informações interessantes ( http://en.wikipedia.org/wiki/ Bochs ). O comando lshw é um pouco mais informativo que o dmidecode (por exemplo, me dizendo que é de 64 bits).

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

Phil McKerracher
fonte
1

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

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

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

$ sudo apt-get install imvirt
$ imvirt

Como sempre:

free
cat /proc/meminfo
cat /proc/cpuinfo
dmesg
htop
lshw
dmidecode
lsmod
hwinfo
gavenkoa
fonte
Você me derrotou para imitar, e eu não sabia o que era. você detalharia a saída de ambos como respostas anteriores para melhorar sua postagem?
Rui F Ribeiro