web-dev-qa-db-fra.com

Découvrez si le système d'exploitation s'exécute dans un environnement virtuel

Existe-t-il un moyen de savoir si le système d'exploitation que j'exécute (en fait l'installation) fonctionne sur une machine VMWare. Je dois désactiver les paramètres de ntp si l'installation automatisée est effectuée sur une machine virtuelle, mais les garder activés si l'installation sur du métal nu.

52
ulve

Utiliser dmidecode ou lshw et greping semble être le meilleur moyen de le savoir.

11
ulve

Linux ajoute le drapeau hypervisor à /proc/cpuinfo si le noyau détecte l'exécution sur une sorte d'hyperviseur.

68
Jan Henke

Sous Linux, vous pouvez utiliser la commande virt-what

[root@myhost]# virt-what
vmware

Exemple de sortie pour un Linux sur Windows HyperV

[root@linuxvm11~] # virt-what
hyperv
26
user66871

Cela a mieux fonctionné pour moi car il me donne des informations spécifiques sur le fabricant et le nom du produit.

dmidecode -t system|grep 'Manufacturer\|Product'

Sortie sur serveur Dell:

Manufacturer: Dell Inc.
Product Name: PowerEdge C5220

Sortie sur Virtualbox VM:

Manufacturer: innotek GmbH
Product Name: VirtualBox

Sortie sur KVM/QEMU:

Manufacturer: QEMU
Product Name: Standard PC (i440FX + PIIX, 1996)

C'est très bien pour les scripts qui peuvent les analyser pour une meilleure identification des serveurs ... mais si vous utilisez Chef dans votre infrastructure, vous pouvez vérifier l'attribut de nœud Virtualization -> system sur le serveur du chef.

19
OkezieE

Courir:

$ dmesg |grep -i hypervisor
Hypervisor detected: KVM
12
Arash

Si tout ce dont vous avez besoin est un moyen de savoir si l'OS/l'hôte est un hôte virtualisé ou non, il vous suffit d'avoir un module Perl Sys :: Detect :: Virtualization et le script avec lui virtdetect. Il effectue toutes les détections heuristiques/conjectures possibles et signale l'environnement de système d'exploitation détecté. Essaie.

http://search.cpan.org/dist/Sys-Detect-Virtualization/script/virtdetect

3
Nikhil Mulley

La meilleure idée serait probablement de regarder le matériel. Au moins avec VirtualBox, vous pouvez facilement déterminer que vous êtes sur une machine virtuelle, en raison des noms de certains périphériques matériels (par exemple /sys/block/sda/device/model dira "VBOX HARDDISK").

Étant donné que toutes vos machines sont VMware, choisissez simplement l'une de ces choses et vérifiez-la.

3
tante

Vous pouvez essayer la pilule rouge de Joanna Rutkowska Ce petit programme examine l'IDTR (registre de table de descripteur d'interruption) en utilisant le SIDT instruction (x86 uniquement), qui sera apparemment définie différemment par les différents VMM.

3
Bruce Ediger

Toutes ces réponses fonctionnent dans certains cas mais pas dans d'autres.

Par exemple, vous pouvez dépendre de dmesg pendant que les détails du journal de démarrage sont toujours dans le tampon en anneau, mais il échouera probablement sur une machine qui a fonctionné pendant une durée quelconque. Pire, un message peut être enregistré par le système d'exploitation nu concernant un hyperviseur en cours d'exécution, auquel cas un test naïf comme dmesg | grep -i vmware renverra un faux positif.

Les tests sous Docker sont très différents. Docker n'a pas de /proc/cpuinfo de sa propre; au lieu de cela, il transmet les informations de la machine hôte. Pendant ce temps, dmidecode ne parvient pas à lire un répertoire /dev/mem pas vu par Docker.

virt-what a la détection des conteneurs Docker, mais doit être corrigé pour faire face à une récente modification des privilèges des conteneurs. Il se bloque en essayant d'accéder à /proc/1/environ avant qu'il n'atteigne les tests pour Docker.

Il est important de faire attention aux virt-what caveat emptor:

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.

Dans mon cas, publier un tutoriel qui installe un ton de merde que les utilisateurs peuvent ne pas vouloir après tout, je refuse de le laisser fonctionner sur du métal nu, avec ce test:

[[ 0 < $(grep -c docker /proc/1/cgroup) ]] || [[ "X$(Sudo virt-what)X" != "XX" ]] && export VIRTUALIZED=true;

Note: Je me rends compte que l'OP pose spécifiquement des questions sur VMWare dans le corps de la question, mais le titre de la question attirera de nombreux lecteurs (comme moi) à la recherche du cas plus général.

2
Martin Bramwell

Je l'ai fait:

hypervisor=`dmesg --notime | grep -i hypervisor | cut -d ':' -f2 | tr -d " \t\n\r"`
echo "Hypervisor is $hypervisor"

Il aide sur les scripts

eh bien, la façon la plus intuitive que je fais toujours est:

$ dmesg | grep -i vmware

1
Shâu Shắc

Nécessite APIC, renvoie 0 si la machine virtuelle, 1 si l'ordinateur physique:

grep -q VBOX /sys/firmware/acpi/tables/APIC
0
user227115