web-dev-qa-db-fra.com

Un moyen facile de déterminer la technologie de virtualisation

J'ai accès en ligne de commande à une machine Linux qui peut ou non être virtualisée. Je souhaite déterminer le type de technologie de virtualisation sur laquelle il fonctionne, le cas échéant (VMWare, VirtualBox, KVM, OpenVZ, Xen,). Ce n'est pas un environnement hostile: je n'essaie pas de travailler contre un VM qui essaie de se déguiser, je diagnostique un serveur feuilleté 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 comme "copier-coller cette commande" et non "fouiner /proc quelque part". Idéalement, ce serait quelque chose comme lshw: une commande facilement installable (si elle n'est pas préinstallée) qui fait le tour et imprime les informations pertinentes.

Quelle est la façon la plus simple de déterminer de quelle technologie de virtualisation ce système peut être l'hôte? J'apprécierais que les propositions mentionnent quelles technologies (y compris le matériel nu) peuvent être détectées de manière concluante et lesquelles peuvent être définitivement éliminées. Je suis principalement intéressé par Linux, mais si cela fonctionne également pour d'autres unités, c'est bien.

dmidecode -s system-product-name

J'ai testé sur Vmware Workstation, VirtualBox, QEMU avec KVM, QEMU autonome avec Ubuntu comme OS invité. D'autres ont également ajouté des plates-formes qu'ils connaissent également.

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
    

Sur le métal nu, cela renvoie une identification du modèle d'ordinateur ou de carte mère.

/dev/disk/by-id

Si vous n'avez pas le droit d'exécuter dmidecode, vous 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

130
Rahul Patil

Si le conteneur exécute systemd:

$ systemd-detect-virt
lxc

On KVM par exemple, il renvoie:

kvm

et sur un hôte non virtualisé:

none

Voir également:

41
starfry

Méthode souhaitable

lshw

Cette commande produit la sortie suivante sur les invités de la technologie vairous VM.

$ Sudo lshw -class system

Production

  • KVM

    mungr                     
        description: Computer
        product: KVM
        vendor: Red Hat
        width: 64 bits
        capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
    
  • Boîte virtuelle

    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, il y a le package open-vm-tools peut être installé. Il offre vmware-checkvm . Il ne renvoie qu'un chiffre. UNE 0 signifie que c'est une machine virtuelle, un 1 signifie que c'est un système physique.

Méthodes moins souhaitables

Si c'est KVM le /proc/scsi/scsi et ethtool options apparaissent 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/scsi vous indique que vous êtes dans une machine virtuelle et que vous êtes probablement KVM.

dmesg

Utilisation des commandes suivantes grep 'via 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

    Si la "-cpu Host" option n'a pas été utilisée, QEmu et KVM s'identifiera comme:

    CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
    

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

    [    0.000000] Booting paravirtualized kernel on KVM
    

    Dans les noyaux plus récents 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

28
slm

Le virt-what script semble bien couvrir la plupart des cas ...

I do comme l'avertissement des auteurs:

La plupart du temps, utiliser 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 des installations par défaut. Ubuntu l'a, et la source est également disponible.

Les faits détectés par le script sont listés ici , mais peuvent facilement être étendus pour les cas Edge.

16
ewwhite
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.

13
John Kugelman

hostnamectl est votre ami (nécessite systemd).

Quelques exemples:

Ordinateur portable sans aucune 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
9
Derick

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

facter virtual

Aucun accès root requis.

Invité Debian sur l'hôte Debian:

[user@guest]$ facter virtual
virtualbox

Je ne peux pas garantir à quel point cela fonctionnerait avec Xen/KVM/Qemu ...

9
Joseph R.

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

dmesg | grep "Hypervisor detected"

Par exemple:

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

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

7
Russ

systemd-detect-virt

Cela détectera le type de technologie de virtualisation utilisé et le restituera.

systemd-detect-virt

Distinction entre virtualisation de machine et virtualisation de conteneur

Utilisez le --container et --vm options pour 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 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.


3
Owen Pauling

Pour VirtualBox, vous pouvez lspci | grep -i virtualbox, ça 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 a besoin de root):

$ Sudo dmidecode -s system-product-name
VirtualBox

Pour QEMU non KVM, dmidecode -s system-product-name renvoie Bochs, mais dmesg | grep -i qemu fonctionne (les périphériques de stockage que QEMU émule portent généralement le nom QEMU HARDDISK, QEMU DVD-ROM etc...).

3
Renan

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
3
jan.polnicky

Apparemment, la virtualisation se déroule en plusieurs parties - dans mon cas, QEMU, Bochs et KVM (puis Ubuntu 14.04). J'ai trouvé que la façon la plus simple de découvrir l'hyperviseur utilisé était:

Sudo apt-get install virt-what
Sudo virt-what

qui dans mon cas a simplement renvoyé kvm qui étaient les informations de base que je cherchais (également l'OP je pense), car cela me dit ce que je suis autorisé à faire (par exemple, exécuter un ipset pour bloquer une attaque DDoS) et comment les ressources sont partagées entre les machines virtuelles.

De plus j'ai essayé

Sudo dmidecode -s system-product-name

et

Sudo lshw -class system

aucun d'eux ne mentionne KVM mais ils m'ont tous les deux informé que mon émulation matérielle était fournie par Bochs dont j'avoue que je n'avais même pas entendu parler, mais une recherche rapide est apparue informations intéressantes ( http://en.wikipedia.org/wiki/Bochs ). La commande lshw est légèrement plus informative que dmidecode (par exemple en me disant que c'est 64 bits).

Les autres réponses ne m'ont rien dit d'utile - facter virtual vient de renvoyer physical et ls -1 /dev/disk/by-id/ revenu ata-QEMU_DVD-ROM_QM00003 qui montre que QEMU est impliqué mais je n'ai de toute façon pas accès au DVD-ROM émulé.

1
Phil McKerracher

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

$ Sudo apt-get install virt-what
$ virt-what

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

$ Sudo apt-get install imvirt
$ imvirt

Comme d'habitude, exécutez:

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