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.
Utiliser dmidecode
ou lshw
et grep
ing semble être le meilleur moyen de le savoir.
Linux ajoute le drapeau hypervisor
à /proc/cpuinfo
si le noyau détecte l'exécution sur une sorte d'hyperviseur.
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
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.
Courir:
$ dmesg |grep -i hypervisor
Hypervisor detected: KVM
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
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.
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.
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.
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
Nécessite APIC, renvoie 0 si la machine virtuelle, 1 si l'ordinateur physique:
grep -q VBOX /sys/firmware/acpi/tables/APIC