Un moyen facile de déterminer la technologie de virtualisation


115

J'ai un accès en ligne de commande à une machine Linux virtualisée ou non. Je souhaite déterminer le type de technologie de virtualisation sur laquelle il s'exécute, le cas échéant (VMWare, VirtualBox, KVM, OpenVZ, Xen,). Ce n'est pas un environnement hostile: je n'essaie pas de travailler contre une machine virtuelle qui tente de se dissimuler, je diagnostique un serveur floconneux que je connais peu.

Plus précisément, j'aide quelqu'un à diagnostiquer le problème, je ne suis pas assis à la barre. Je dois donc transmettre des instructions telles que «copier-coller cette commande» et non «fouiller /procquelque part». Idéalement, ce serait quelque chose comme lshw: une commande facile à installer (si non préinstallée) qui permet de fouiller et d’imprimer les informations pertinentes.

Quel est le moyen le plus simple de déterminer la technologie de virtualisation utilisée par ce système? J'apprécierais si les propositions mentionnées quelles technologies (y compris le matériel nu) peuvent être détectées de manière concluante et lesquelles peuvent être éliminées de manière définitive. Je suis surtout intéressé par Linux, mais si cela fonctionne aussi pour d'autres unités, c'est bien.


Réponses:


128

dmidecode -s system-product-name

J'ai testé sur VMware Workstation, VirtualBox, QEMU avec KVM, QEMU autonome avec Ubuntu comme système d'exploitation invité. D'autres ont ajouté des plates-formes supplémentaires qu'ils connaissent bien.

Technologies de virtualisation

  • VMware Workstation

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

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

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

    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
    

On bare metal, renvoie une identification du modèle d'ordinateur ou de carte mère.

/dev/disk/by-id

Si vous ne possédez pas les droits nécessaires, dmidecodevous pouvez utiliser:

Technologie de virtualisation: QEMU

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

Sortie

[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

Références


5
Hyper-V retourne un presque sans valeur Virtual Machinepour dmidecode -s system-product-name. Il n’ya rien d’évident sous / dev / disk / by-id non plus. facter semble détecter hyperv en regardant la sortie de lspci.
Zoredache

1
Ouvrir la vérification VZ pour /proc/user_beancounters
exussum le

+1 pour /proc/user_beancountersplus d'OpenVZ qui est probablement sur les VPS bon marché par exemple.
erm3nda

Les deux dmidecodeet /dev/disk/by-idsolutions échouent dans un récipient Docker. Voir unix.stackexchange.com/a/257207/106572
Martin Bramwell le

3
avec qemu 2.5.0 (au moins), dmidecode -s system-product-namerenvoie une description matérielle générique à la place du "KVM" ou des "Bochs" indiqués ci-dessus. Pour moi, cette chaîne est Standard PC (i440FX + PIIX, 1996). dmidecode -s system-manufacturerrenvoie la chaîne beaucoup moins générique QEMU. Puisque qemu permet de fournir des données DMI, je soupçonne que dmidecode est relativement facile à tromper, quel que soit le champ en cours de lecture.
Marc

38

Si le conteneur est en cours d'exécution systemd:

$ systemd-detect-virt
lxc

Sur KVM par exemple, il retourne:

kvm

et sur un hôte non virtualisé:

none

Voir également:


Cela fonctionne aussi pour openvz.
lepe

Il produit kvmpour Google Compute Engine, ce que j’essayais de comprendre. Merci!
vendredi

Commande simple qui fonctionne à merveille sur Ubuntu 18.04! Merci beaucoup :)
develCuy

28

Méthode souhaitable

lshw

Cette commande produit la sortie suivante sur différents invités de technologie VM.

$ sudo lshw -class system

Sortie

  • 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
    

Scripting

Si vous êtes sur Ubuntu / Debian, le paquet open-vm-toolspeut être installé. Il fournit vmware-checkvm. Il ne retourne qu'un chiffre. Un 0signifie que c'est une machine virtuelle, 1c'est un système physique.

Méthodes moins souhaitables

Si c'est KVM, les options /proc/scsi/scsiet ethtoolapparaissent comme suit:

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 fait partie de KVM. Le /proc/scsi/scsivous indique que vous êtes dans une machine virtuelle et que vous êtes probablement KVM.

dmesg

En utilisant les commandes suivantes grepvia 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

    Si l' "-cpu host"option n'a pas été utilisée, QEmu et KVM s'identifieront comme suit:

    CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
    

    sinon, les informations de la CPU de l'hôte seront utilisées à la fois dans dmesgou dans /proc/cpuinfo. Cependant, vous devriez voir quelque chose comme:

    [    0.000000] Booting paravirtualized kernel on KVM
    

    Dans les nouveaux noyaux qui comprennent qu'ils fonctionnent sous paravirtualisation.

  • 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
    

Références


J'espérais éviter ce genre de problème avec les pilotes: ce sera différent pour chaque technologie de machine virtuelle et dépend des paramètres. Le nom du produit signalé par lshw -class systemet dmidecodecorrespond exactement à ce que j'espérais trouver.
Gilles

@ Gilles - Oui, je ne voulais pas que vous les utilisiez, mais seulement pour capturer les méthodes. Je suis en train de mettre en place une instance Virtual Box et VMWare pour confirmer également la lshwsortie pour ces plates-formes. Donnez-moi quelques minutes et je mettrai à jour le A.
slm

@Gilles - on dirait que lshw peut aussi faire le travail pour toutes les technologies. J'ai déplacé les réponses au bas de la réponse qui n'étaient pas ce que vous cherchiez afin que les autres ne soient pas obligées de les ignorer.
slm

dmesg remplit une mémoire tampon de taille fixe avec toutes sortes de choses. C'est complètement inapproprié pour cette tâche. Voir unix.stackexchange.com/a/257207/106572
Martin Bramwell le

@ Martin - et c'est pourquoi c'est dans la partie moins souhaitable de ma réponse. J'écris généralement des réponses tout compris, montrant une variété de méthodes.
slm

16

Le virt-whatscript semble bien couvrir la plupart des cas ...

Je fais comme le déni de responsabilité des auteurs:

La plupart du temps, l’utilisation de ce programme n’est pas la bonne chose à faire. Au lieu de cela, vous devez détecter les fonctionnalités spécifiques que vous souhaitez réellement utiliser.

Il est apparu sur mes systèmes EL5 et EL6 au cours des dernières années dans le cadre d'installations par défaut. Ubuntu l'a, et le source est aussi disponible.

Les faits détectés par le script sont répertoriés ici , mais peuvent facilement être étendus pour les cas extrêmes.


Lien? Quels systèmes reconnaît-il?
Gilles

1
@Gilles Edited: Mais le script détecte généralement KVM, Xen, QEMU, VirtualBox, Parallels, OpenVZ, IBM System Z, LPAR, z / VM, Hitachi Virtage, VMWare, Microsoft Hyper-V. Hmm ... LXC devrait-il être inclus?
ewwhite

LXC est inclus maintenant.
ewwhite

En janvier 2016, cela échouait avec Docker. Voir unix.stackexchange.com/a/257207/106572
Martin Bramwell le

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; }

Ce sont les tests que nous utilisons dans mon entreprise.


9

Si vous avez la personne que vous aidez à installer facter, vous pouvez le faire

facter virtual

Aucun accès root nécessaire.

Invité Debian sur l'hôte Debian:

[user@guest]$ facter virtual
virtualbox

Je ne peux pas garantir que cela fonctionnerait bien avec Xen / KVM / Qemu ...


8

hostnamectlest votre ami (nécessite systemd).

Quelques exemples:

Ordinateur portable sans virtualisation

$ 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

Comment le système d'exploitation détermine-t-il s'il est exécuté dans une machine virtuelle? cela ne devrait pas, j’ai installé une version très basique de debian en ligne de commande et hostnamectl shows même si Virtualization: oracleje n’ai pas installé de paravirtualisation | Ajout d'invités Virtualbox
Ivanzinho

7

Dans les noyaux Linux "récents", le noyau détecte l'hyperviseur pour vous et imprime un message facilement disponible avec dmesg. Cela vous dira simplement:

dmesg | grep "Hypervisor detected"

Par exemple:

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

En ce qui concerne ce que "récent" signifie, je ne sais pas dans quelle version de noyau il a été officiellement publié, mais le commit qui a introduit cette fonctionnalité dans la base de code date du 7 mai 2010. Voir ici .


dmesgremplit une mémoire tampon de taille fixe avec toutes sortes de choses. C'est complètement inapproprié pour cette tâche. Voir unix.stackexchange.com/a/257207/106572
Martin Bramwell le

3

Pour VirtualBox, vous pourriez lspci | grep -i virtualbox, cela donne:

$ 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

Alternativement, dmidecode -s system-product-name(comme @Rahul Patil le suggère) est encore plus direct (mais nécessite une racine):

$ sudo dmidecode -s system-product-name
VirtualBox

Pour QEMU non-KVM, dmidecode -s system-product-nameBochs est confus, mais dmesg | grep -i qemufonctionne (les périphériques de stockage émulés par QEMU ont généralement le nom QEMU HARDDISK, QEMU DVD-ROMetc.).


3

Parfois c'est délicat :)

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

Cela détectera le type de technologie de virtualisation utilisée et l’enverra.

systemd-detect-virt

Distinguer la virtualisation de machine et la virtualisation de conteneur

Utilisez les options --containeret --vmpour limiter le type de virtualisation détecté.

Codes de sortie

Si vous voulez simplement savoir si la virtualisation est détectée ou non, sans les détails, il est alors plus facile de vérifier le code de sortie. Il renverra le code de sortie 0 si la virtualisation est détectée et différent de zéro sinon.



1

Apparemment, la virtualisation comporte plusieurs parties - dans mon cas, QEMU, Bochs et KVM (puis Ubuntu 14.04). J'ai trouvé le moyen le plus simple de découvrir l'hyperviseur utilisé:

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

ce qui dans mon cas a simplement renvoyé kvmles informations de base que je recherchais (également le PO, je pense), car il me dit ce que je suis autorisé à faire (par exemple, exécuter ipset pour bloquer une attaque DDoS) et comment les ressources sont partagées entre les VM .

En plus j'ai essayé

sudo dmidecode -s system-product-name

et

sudo lshw -class system

Aucun de ceux-ci ne mentionnant KVM, mais ils m'ont tous les deux informé que mon émulation matérielle avait été fournie, Bochsce dont j'avoue ne pas avoir entendu parler, mais une recherche rapide a révélé des informations intéressantes ( http://en.wikipedia.org/wiki/ Bochs ). La commande lshw est légèrement plus informative que dmidecode (par exemple, elle me dit que c'est 64 bits).

Les autres réponses ne me disaient rien d'utile, elles facter virtualrevenaient physicalet ls -1 /dev/disk/by-id/renvoyaient, ata-QEMU_DVD-ROM_QM00003ce qui montre que QEMU est impliqué, mais je n'ai pas accès au DVD-ROM émulé de toute façon.


1

Debian est livré avec ce petit paquet pour détecter le type de virtualisation:

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

et un peu plus gros à cause des dépendances Perl:

$ sudo apt-get install imvirt
$ imvirt

Comme d'habitude:

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

Vous m'avez battu au premier abord et je ne savais pas virt-quoi. Souhaitez-vous détailler le résultat des deux réponses précédentes pour améliorer votre message?
Rui F Ribeiro
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.