Einfache Methode zur Bestimmung der Virtualisierungstechnologie


115

Ich habe Befehlszeilenzugriff auf einen Linux-Computer, der möglicherweise virtualisiert ist oder nicht. Ich möchte feststellen, auf welcher Art von Virtualisierungstechnologie diese ausgeführt wird (VMWare, VirtualBox, KVM, OpenVZ, Xen,). Dies ist keine feindliche Umgebung: Ich versuche nicht, gegen eine VM zu arbeiten, die sich zu tarnen versucht. Ich diagnostiziere einen schuppigen Server, über den ich wenig weiß.

Genauer gesagt, ich helfe jemandem bei der Diagnose des Problems. Ich sitze nicht am Steuer. Also muss ich Anweisungen wie "Kopieren-Einfügen dieses Befehls" übermitteln und nicht " /procirgendwo herumstöbern". Im Idealfall handelt es sich um Folgendes lshw: einen einfach zu installierenden (falls nicht vorinstallierten) Befehl, der das Stöbern durchführt und relevante Informationen ausgibt.

Wie lässt sich am einfachsten feststellen, bei welcher Virtualisierungstechnologie dieses System zu Gast sein kann? Ich würde mich freuen, wenn Vorschläge erwähnen würden, welche Technologien (einschließlich der bloßen Hardware) endgültig erkannt und welche endgültig beseitigt werden können. Ich interessiere mich hauptsächlich für Linux, aber wenn es auch für andere Unices funktioniert, ist das schön.


Antworten:


128

dmidecode -s system-product-name

Ich habe auf VMware Workstation, VirtualBox, QEMU mit KVM, Standalone-QEMU mit Ubuntu als Gastbetriebssystem getestet. Andere haben zusätzliche Plattformen hinzugefügt, mit denen sie ebenfalls vertraut sind.

Virtualisierungstechnologien

  • VMware Workstation

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

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

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

    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
    

Auf Bare-Metal-Systemen wird eine Identifikation des Computer- oder Motherboard-Modells zurückgegeben.

/dev/disk/by-id

Wenn Sie nicht über die Berechtigung zum Ausführen verfügen, können dmidecodeSie Folgendes verwenden:

Virtualisierungstechnologie: QEMU

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

Ausgabe

[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

Verweise


5
Hyper-V gibt eine nahezu wertlos Virtual Machinefür dmidecode -s system-product-name. Unter / dev / disk / by-id ist ebenfalls nichts ersichtlich. Facter scheint Hyperv zu erkennen, indem er sich die lspci-Ausgabe ansieht.
Zoredache

1
Öffnen Sie den VZ-Check für /proc/user_beancounters
exussum

+1 für /proc/user_beancountersüber OpenVZ, was bei billigen VPS's als Beispiel wahrscheinlich ist.
erm3nda

Beides dmidecodeund /dev/disk/by-idLösungen schlagen in einem Docker-Container fehl. Siehe unix.stackexchange.com/a/257207/106572
Martin Bramwell,

3
Gibt mit qemu 2.5.0 (mindestens) dmidecode -s system-product-nameeine allgemeine Hardwarebeschreibung anstelle des oben gezeigten "KVM" oder "Bochs" zurück. Für mich ist diese Zeichenfolge Standard PC (i440FX + PIIX, 1996). dmidecode -s system-manufacturerGibt die weitaus weniger generische Zeichenfolge zurück QEMU. Da qemu die Bereitstellung von DMI-Daten ermöglicht, ist dmidecode meiner Meinung nach relativ leicht zu täuschen - unabhängig davon, welches Feld gelesen wird.
Mark

38

Wenn der Container läuft systemd:

$ systemd-detect-virt
lxc

Auf KVM gibt es zum Beispiel Folgendes zurück:

kvm

und auf einem nicht virtualisierten Host:

none

Siehe auch:


Dies funktioniert auch für openvz.
Lepe

Es wurde kvmfür Google Compute Engine ausgegeben , was ich herausfinden wollte. Vielen Dank!
Samstag,

Einfacher Befehl, der unter Ubuntu 18.04 wie ein Zauber wirkt!
Vielen

28

Wünschenswerte Methode

lshw

Dieser Befehl erzeugt die folgende Ausgabe auf verschiedenen VM-Technologie-Gastsystemen.

$ sudo lshw -class system

Ausgabe

  • KVM

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

Scripting

Wenn Sie unter Ubuntu / Debian arbeiten, kann das Paket open-vm-toolsinstalliert werden. Es bietet vmware-checkvm. Es wird nur eine Ziffer zurückgegeben. A 0bedeutet, dass es sich um eine VM handelt. A bedeutet, 1dass es sich um ein physisches System handelt.

Weniger wünschenswerte Methoden

Wenn es KVM ist das /proc/scsi/scsiund ethtoolzeigen Optionen wie folgt zusammen :

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

Das virtio_net ist Teil von KVM. Das /proc/scsi/scsisagt Ihnen, dass Sie sich in einer VM befinden und dass Sie höchstwahrscheinlich KVM sind.

dmesg

Mit den folgenden Befehlen grepdurch 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 oder KVM

    Wenn die "-cpu host"Option nicht verwendet wurde, identifizieren sich QEmu und KVM wie folgt:

    CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
    

    Andernfalls werden die CPU-Informationen des Hosts sowohl in als dmesgauch in verwendet /proc/cpuinfo. Sie sollten jedoch Folgendes sehen:

    [    0.000000] Booting paravirtualized kernel on KVM
    

    In neueren Kernels, die verstehen, dass sie unter Paravirtualisierung laufen.

  • 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
    

Verweise


Diese Art des Herumstöberns in Treibern wollte ich vermeiden: Sie ist für jede VM-Technologie unterschiedlich und von den Einstellungen abhängig. Der Produktname berichtet von lshw -class systemund dmidecodeist genau das, was ich hatte gehofft , zu finden.
Gilles

@ Gilles - ja, ich wollte nicht, dass du sie tatsächlich benutzt, nur um die Methoden festzuhalten. Ich rufe jetzt eine Virtual Box und VMWare-Instanzen auf, um die lshwAusgabe auch für diese Plattformen zu bestätigen . Geben Sie mir ein paar Minuten und ich aktualisiere den A.
slm

@Gilles - wie es aussieht, kann lshw die Arbeit auch für alle Technologien erledigen. Ich habe die Antworten an den unteren Rand der Antwort verschoben, nach denen Sie nicht gesucht haben, damit andere sie nicht überspringen müssen.
slm

dmesg füllt einen Ringpuffer fester Größe mit allem möglichen. Es ist völlig ungeeignet für diese Aufgabe. Siehe unix.stackexchange.com/a/257207/106572
Martin Bramwell

@Martin - und deshalb ist es in dem weniger wünschenswerten Abschnitt meiner Antwort. Ich schreibe in der Regel All-inclusive-Antworten und zeige eine Vielzahl von Methoden.
SLM

16

Das virt-whatSkript scheint die meisten Fälle gut abzudecken ...

Ich tun , wie die rechtlichen Hinweise von den Autoren:

Meistens ist es falsch, dieses Programm zu verwenden. Stattdessen sollten Sie die spezifischen Funktionen ermitteln, die Sie tatsächlich verwenden möchten.

Es ist in den letzten Jahren als Teil der Standardinstallation auf meinen EL5- und EL6-Systemen erschienen. Ubuntu hat es und die Quelle ist auch verfügbar.

Die vom Skript erkannten Fakten werden hier aufgelistet , können aber leicht für Randfälle erweitert werden.


Verknüpfung? Welche Systeme erkennt es?
Gilles

1
@Gilles Bearbeitet: Das Skript erkennt jedoch im Allgemeinen KVM, Xen, QEMU, VirtualBox, Parallels, OpenVZ, LPAR, Hitachi Virtage, VMWare, Microsoft Hyper-V. Hmm ... sollte LXC enthalten sein?
Ewwhite

LXC ist jetzt enthalten.
ewwhite

Ab Januar 2016 schlägt dies mit Docker fehl. Siehe 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; }

Das sind die Tests, die wir in meiner Firma durchführen.


9

Wenn Sie die Person finden, die Sie bei der Installation unterstützen facter, können Sie dies tun

facter virtual

Kein root-Zugriff erforderlich.

Debian-Gast auf Debian-Host:

[user@guest]$ facter virtual
virtualbox

Ich kann nicht garantieren, wie gut dies mit Xen / KVM / Qemu funktionieren würde ...


8

hostnamectlist dein Freund (benötigt systemd).

Einige Beispiele:

Laptop ohne Virtualisierung

$ 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

Wie stellt das Betriebssystem fest, ob es in einer virtuellen Maschine ausgeführt wird? Sollte dies nicht der Fall sein, habe ich ein sehr einfaches Debian von der Kommandozeile aus installiert und hostnamectl zeigt dies an, auch Virtualization: oraclewenn ich keine Paravirtualisierung installiert habe Virtualbox-
Gastzugänge

7

In "neueren" Linux-Kerneln erkennt der Kernel den Hypervisor für Sie und druckt eine Nachricht, die leicht verfügbar ist dmesg. Dies wird Ihnen einfach sagen:

dmesg | grep "Hypervisor detected"

Zum Beispiel:

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

Was "kürzlich" bedeutet, ich bin nicht sicher, in welcher Kernel-Version es offiziell veröffentlicht wurde, aber das Commit, das diese Funktion in der Codebasis einführte, war am 7. Mai 2010. Siehe hier .


dmesgFüllt einen Ringpuffer fester Größe mit allem möglichen. Es ist völlig ungeeignet für diese Aufgabe. Siehe unix.stackexchange.com/a/257207/106572
Martin Bramwell

3

Für VirtualBox könnte dies Folgendes lspci | grep -i virtualboxbedeuten:

$ 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

Alternativ dmidecode -s system-product-name(wie @Rahul Patil vorschlägt) geht es noch direkter zur Sache (benötigt aber Wurzel):

$ sudo dmidecode -s system-product-name
VirtualBox

Für Nicht-KVM QEMU, dmidecode -s system-product-namekehrt zum Verwechseln Bochs, sondern dmesg | grep -i qemuarbeitet (die Speichergeräte , die QEMU emuliert in der Regel die Namen hat QEMU HARDDISK, QEMU DVD-ROMetc ...).


3

Manchmal ist es schwierig :)

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

Dadurch wird der Typ der verwendeten Virtualisierungstechnologie erkannt und ausgegeben.

systemd-detect-virt

Unterscheidung zwischen Maschinenvirtualisierung und Containervirtualisierung

Verwenden Sie die Optionen --containerund --vm, um die Art der erkannten Virtualisierung zu begrenzen.

Exit-Codes

Wenn Sie nur wissen möchten, ob Virtualisierung erkannt wurde oder nicht, ohne die Details zu kennen, ist es einfacher, den Exit-Code zu überprüfen. Wenn eine Virtualisierung erkannt wird, wird der Exit-Code 0 zurückgegeben, andernfalls ein Wert ungleich Null.



1

Anscheinend besteht die Virtualisierung aus mehreren Teilen - in meinem Fall aus QEMU, Bochs und KVM (damals Ubuntu 14.04). Der einfachste Weg, den verwendeten Hypervisor zu ermitteln, war:

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

Das hat in meinem Fall einfach kvmdie grundlegenden Informationen zurückgegeben, nach denen ich gesucht habe (auch das OP, glaube ich), weil es mir sagt, was ich tun darf (z. B. ipset ausführen, um einen DDoS-Angriff zu blockieren) und wie Ressourcen zwischen VMs geteilt werden .

Außerdem habe ich es versucht

sudo dmidecode -s system-product-name

und

sudo lshw -class system

Keiner von beiden erwähnte KVM, aber beide informierten mich, dass meine Hardware-Emulation bereitgestellt wurde, von Bochsder ich zugeben konnte, dass ich noch nicht einmal davon gehört hatte, aber eine schnelle Suche ergab interessante Informationen ( http://en.wikipedia.org/wiki/ Bochs ). Der Befehl lshw ist etwas informativer als der Befehl dmidecode (z. B. 64-Bit).

Die anderen Antworten sagten mir nicht wirklich etwas Sinnvolles - ich bin facter virtualgerade zurückgekehrt physicalund ls -1 /dev/disk/by-id/zurückgekehrt, ata-QEMU_DVD-ROM_QM00003was zeigt, dass QEMU involviert ist, aber ich habe sowieso keinen Zugriff auf die emulierte DVD-ROM.


1

Debian wird mit diesem kleinen Paket zur Erkennung des Virtualisierungstyps geliefert:

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

und etwas größer wegen Perl-Abhängigkeiten:

$ sudo apt-get install imvirt
$ imvirt

Wie gewohnt laufen:

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

Du hast mich geschlagen, um es zu tun, und ich wusste nicht, was ich tun sollte. Würden Sie die Ausgabe beider als vorherige Antworten beschreiben, um Ihren Beitrag zu verbessern?
Rui F Ribeiro
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.