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.
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
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:
Cette commande produit la sortie suivante sur les invités de la technologie vairous VM.
$ Sudo lshw -class system
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
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.
Si c'est KVM le /proc/scsi/scsi
et ethtool
options apparaissent comme suit:
$ 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 -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.
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
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.
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.
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
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 ...
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 .
Cela détectera le type de technologie de virtualisation utilisé et le restituera.
systemd-detect-virt
Utilisez le --container
et --vm
options pour limiter le type de virtualisation détecté.
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.
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...).
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
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é.
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