Modo semplice per determinare la tecnologia di virtualizzazione


115

Ho accesso dalla riga di comando a una macchina Linux che può o meno essere virtualizzata. Voglio determinare su quale tipo di tecnologia di virtualizzazione funziona (VMWare, VirtualBox, KVM, OpenVZ, Xen,). Questo non è un ambiente ostile: non sto cercando di lavorare contro una VM che sta cercando di mascherarsi, sto diagnosticando un server instabile di cui so poco.

Più precisamente, sto aiutando qualcuno a diagnosticare il problema, non sono seduto al timone. Quindi devo trasmettere istruzioni come "copia-incolla questo comando" e non "frugare /procda qualche parte". Idealmente, sarebbe qualcosa del tipo lshw: un comando facilmente installabile (se non preinstallato) che esegue la ricerca e stampa le informazioni rilevanti.

Qual è il modo più semplice per determinare di quale tecnologia di virtualizzazione può essere ospite questo sistema? Gradirei se le proposte menzionassero quali tecnologie (incluso l'hardware nudo) possano essere rilevate in modo definitivo e quali possano essere definitivamente eliminate. Sono per lo più interessato a Linux, ma se funziona anche per altri unice è bello.


Risposte:


128

dmidecode -s system-product-name

Ho testato su Vmware Workstation, VirtualBox, QEMU con KVM, QEMU autonomo con Ubuntu come SO guest. Altri hanno aggiunto altre piattaforme con cui hanno familiarità.

Tecnologie di virtualizzazione

  • VMware Workstation

    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 (emulato)

    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
    

Su bare metal, questo restituisce un'identificazione del modello di computer o scheda madre.

/dev/disk/by-id

Se non si dispone dei diritti per l'esecuzione, dmidecodeè possibile utilizzare:

Tecnologia di virtualizzazione: QEMU

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

Produzione

[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

Riferimenti


5
Hyper-V restituisce un valore quasi inutile Virtual Machineper dmidecode -s system-product-name. Non c'è nulla di ovvio in / dev / disk / by-id. facter sembra rilevare hyperv guardando l'output di lspci.
Zoredache,

1
Apri il controllo VZ per /proc/user_beancounters
exussum

+1 per /proc/user_beancountersoltre OpenVZ che è probabilmente su VPS economici come esempio.
erm3nda,

Entrambe dmidecodee le /dev/disk/by-idsoluzioni falliscono in un contenitore Docker. Vedi unix.stackexchange.com/a/257207/106572
Martin Bramwell,

3
con qemu 2.5.0 (almeno), dmidecode -s system-product-namerestituisce una descrizione hardware generica invece di "KVM" o "Bochs" mostrati sopra. Per me questa stringa è Standard PC (i440FX + PIIX, 1996). dmidecode -s system-manufacturerrestituisce la stringa molto meno generica QEMU. Poiché qemu consente di fornire dati DMI, sospetto che dmidecode sia relativamente facile da ingannare, indipendentemente dal campo letto.
Segna il


28

Metodo desiderabile

lshw

Questo comando produce il seguente output su guest con tecnologia VM vairous.

$ sudo lshw -class system

Produzione

  • KVM

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

    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 sei su Ubuntu / Debian c'è il pacchetto che open-vm-toolspuò essere installato. Fornisce vmware-checkvm. Restituisce solo una cifra. Un 0significa che è una VM, un 1mezzo è un sistema fisico.

Metodi meno desiderabili

Se è KVM, le opzioni /proc/scsi/scsie ethtoolvengono visualizzate come segue:

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

Virtio_net fa parte di KVM. Il /proc/scsi/scsiti dice che sei in una macchina virtuale, e che siete più probabile KVM.

dmesg

Utilizzo dei seguenti comandi greptramite il 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

    Se l' "-cpu host"opzione non è stata utilizzata, QEmu e KVM si identificheranno come:

    CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
    

    in caso contrario, le informazioni sulla CPU dell'host verranno utilizzate sia in dmesg, sia in /proc/cpuinfo. Tuttavia, dovresti vedere qualcosa di simile:

    [    0.000000] Booting paravirtualized kernel on KVM
    

    Nei kernel più recenti che capiscono di essere in esecuzione sotto paravirtualizzazione.

  • 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
    

Riferimenti


Quel tipo di frugare nei driver è ciò che speravo di evitare: sarà diverso per ogni tecnologia VM e dipenderà dalle impostazioni. Il nome del prodotto riportato da lshw -class systemed dmidecodeè esattamente quello che speravo di trovare.
Gilles,

@Gilles - sì, non intendevo che tu li usassi davvero, solo per catturare i metodi. Sto presentando un istante di Virtual Box e VMWare per confermare l' lshwoutput anche per quelle piattaforme. Dammi un paio di minuti e aggiornerò A.
slm

@Gilles - sembra che anche lshw possa fare il lavoro per tutte le tecnologie. Ho spostato le risposte in fondo alla risposta che non erano quelle che stavi cercando in modo che gli altri non debbano saltarle.
slm

dmesg riempie un buffer ad anello di dimensioni fisse con tutti i tipi di cose. È del tutto inappropriato per questo compito. Vedi unix.stackexchange.com/a/257207/106572
Martin Bramwell,

@Martin - ed è per questo che è nella sezione meno desiderabile della mia risposta. In genere scrivo risposte tutto compreso, mostrando una varietà di metodi.
slm

16

La virt-whatsceneggiatura sembra coprire bene la maggior parte dei casi ...

Io faccio come il disclaimer da parte degli autori:

Il più delle volte, usare questo programma è la cosa sbagliata da fare. Dovresti invece rilevare le funzionalità specifiche che desideri effettivamente utilizzare.

È apparso sui miei sistemi EL5 ed EL6 negli ultimi anni come parte delle installazioni predefinite. Ubuntu ce l'ha e anche la fonte è disponibile.

I fatti rilevati dallo script sono elencati qui , ma possono essere facilmente estesi per casi limite.


Link? Quali sistemi riconosce?
Gilles,

1
@Gilles Edited: Ma lo script generalmente rileva KVM, Xen, QEMU, VirtualBox, Parallels, OpenVZ, IBM System Z, LPAR, z / VM, Hitachi Virtage, VMWare, Microsoft Hyper-V. Hmm ... dovrebbe essere incluso LXC?
ewwhite,

LXC è ora incluso.
ewwhite,

A partire da gennaio 2016, non riesce con Docker. Vedi 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; }

Quelli sono i test che usiamo nella mia azienda.


9

Se ottieni la persona che stai aiutando a installare facter, puoi farlo

facter virtual

Non è necessario l'accesso root.

Ospite Debian su host Debian:

[user@guest]$ facter virtual
virtualbox

Non posso garantire quanto bene funzionerebbe con Xen / KVM / Qemu ...


8

hostnamectlè tuo amico (richiede systemd).

Alcuni esempi:

Laptop senza alcuna virtualizzazione

$ 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

come determina il sistema operativo se è in esecuzione all'interno di una macchina virtuale? non dovrebbe, ho installato un debian molto semplice dalla riga di comando e hostnamectl mostra a Virtualization: oracleprescindere da non aver installato alcuna paravirtualizzazione | Aggiunte agli ospiti di Virtualbox
Ivanzinho,

7

Nei kernel "recenti" di Linux, il kernel rileva l'hypervisor per te e stampa un messaggio facilmente disponibile con dmesg. Questo ti dirà semplicemente:

dmesg | grep "Hypervisor detected"

Per esempio:

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

Per quanto riguarda il significato di "recente", non sono chiaro in quale versione del kernel sia stata ufficialmente rilasciata, ma il commit che ha introdotto questa funzionalità nella base di codice è stato il 7 maggio 2010. Vedi qui .


dmesgriempie un buffer ad anello di dimensioni fisse con tutti i tipi di cose. È del tutto inappropriato per questo compito. Vedi unix.stackexchange.com/a/257207/106572
Martin Bramwell,

3

Per VirtualBox, potresti lspci | grep -i virtualbox, che 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

In alternativa, dmidecode -s system-product-name(come suggerisce @Rahul Patil) è ancora più diretto al punto (ma ha bisogno di root):

$ sudo dmidecode -s system-product-name
VirtualBox

Per QEMU non KVM, dmidecode -s system-product-namerestituisce confusamente Bochs, ma dmesg | grep -i qemufunziona (i dispositivi di archiviazione che emula QEMU di solito hanno il nome QEMU HARDDISK, QEMU DVD-ROMecc ...).


3

A volte è difficile :)

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

Questo rileverà il tipo di tecnologia di virtualizzazione utilizzata e lo emetterà.

systemd-detect-virt

Distinguere tra virtualizzazione della macchina e virtualizzazione del contenitore

Utilizzare le opzioni --containere --vmper limitare il tipo di virtualizzazione rilevata.

Codici di uscita

Se vuoi solo sapere se la virtualizzazione viene rilevata o meno, senza i dettagli, è più facile controllare il codice di uscita. Restituirà il codice di uscita 0 se viene rilevata la virtualizzazione, altrimenti diversa da zero.



1

Apparentemente la virtualizzazione arriva in diverse parti - nel mio caso QEMU, Bochs e KVM (quindi Ubuntu 14.04). Ho trovato il modo più semplice per scoprire l'hypervisor in uso era:

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

che nel mio caso ha restituito semplicemente kvmquali erano le informazioni di base che stavo cercando (anche l'OP penso), perché mi dice cosa mi è permesso fare (ad esempio eseguire ipset per bloccare un attacco DDoS) e come le risorse sono condivise tra VM .

Inoltre ci ho provato

sudo dmidecode -s system-product-name

e

sudo lshw -class system

nessuno dei quali menziona KVM ma entrambi mi informarono che la mia emulazione hardware era fornita dalla Bochsquale confesso di non aver nemmeno sentito parlare, ma una rapida ricerca ha rivelato informazioni interessanti ( http://en.wikipedia.org/wiki/ Bochs ). Il comando lshw è leggermente più informativo di dmidecode (es. Dirmi che è a 64 bit).

Le altre risposte in realtà non mi hanno detto nulla di utile: sono facter virtualappena tornate physicale sono ls -1 /dev/disk/by-id/tornate, il ata-QEMU_DVD-ROM_QM00003che dimostra che QEMU è coinvolto, ma non ho comunque accesso al DVD-ROM emulato.


1

Debian viene fornito con questo piccolo pacchetto per rilevare il tipo di virtualizzazione:

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

e un po 'più grande a causa delle dipendenze del Perl:

$ sudo apt-get install imvirt
$ imvirt

Come al solito corri:

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

Mi hai battuto per imvirtare, e non sapevo virt-cosa. descriveresti in dettaglio l'output di entrambi come risposte precedenti per migliorare il tuo post?
Rui F Ribeiro,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.