Les machines virtuelles font tout leur possible pour convaincre leur système d’exploitation qu’elles fonctionnent sur du matériel physique. Alors, pouvez-vous dire à partir de la ligne de commande Linux si l’ordinateur est physique ou virtuel ?

Machines virtuelles et hyperviseurs

Un ordinateur traditionnel est un objet physique. C’est une collection de différentes pièces de matériel qui sont branchées et boulonnées ensemble afin que vous puissiez charger un système d’exploitation, installer des applications, les lancer et les utiliser.

Le matériel coûte cher. Le fait d’être limité à un système d’exploitation par ordinateur physique signifie que le coût d’exploitation de plusieurs systèmes d’exploitation devient rapidement prohibitif. Une meilleure solution serait de permettre à un seul ordinateur physique d’exécuter une sélection de systèmes d’exploitation en même temps, chacun d’entre eux pensant qu’il fonctionne sur son propre matériel.

Un hyperviseur rend cela possible. Un hyperviseur, également appelé gestionnaire de machine virtuelle ou moniteur de machine virtuelle, est un logiciel qui vous permet de créer des machines virtuelles. Celles-ci se comportent comme s’il s’agissait d’ordinateurs physiques individuels, bien qu’elles fonctionnent sur le même hôte physique, dont elles partagent l’espace disque dur, la mémoire et les cœurs de processeur.

Bien entendu, l’ordinateur hôte doit être suffisamment puissant pour répondre aux exigences de l’ensemble des machines virtuelles, mais si la RAM et la puissance de traitement de l’hôte sont suffisantes, les machines virtuelles peuvent fonctionner à des vitesses proches de celles d’une machine nue.

Depuis la publication du noyau 2.6.20 en 2007, Linux a intégré la prise en charge des machines virtuelles basée sur le noyau. Linux dispose de plusieurs hyperviseurs, tels que VirtualBox, GNOME Boxes et QEMU-KVM. Ils utilisent la capacité KVM native de Linux, en s’appuyant sur la fonctionnalité native du noyau pour ajouter des interfaces utilisateur et des fonctionnalités telles que la possibilité de prendre un instantané d’une machine virtuelle.

Les machines virtuelles permettent de réaliser des économies, de gagner en efficacité, de simplifier les déploiements et, si elles sont correctement fournies, de bénéficier d’avantages en matière de sécurité. Elles facilitent également l’évolutivité. De nouveaux serveurs peuvent être mis en service automatiquement lorsque la demande d’un service augmente et être arrêtés lorsque la demande diminue. C’est ce qui les rend extrêmement populaires, tant dans le cloud que dans les infrastructures sur site.

Vous administrez peut-être à distance un serveur Linux et vous avez besoin de savoir s’il s’agit d’une machine virtuelle ou d’un boîtier physique. Ou bien vous avez un script qui a besoin de savoir sur quel type de plateforme il s’exécute. Voici plusieurs façons de détecter si l’ordinateur sur lequel vous travaillez est physique ou virtuel.

COMMENT UTILISER SET ET PIPEFAIL DANS LES SCRIPTS BASH SOUS LINUX

La commande dmidecode

La commande dmidecode prend en charge un grand nombre d’options et de modificateurs. Elle interroge les tables de la Desktop Management Interface (DMI) et affiche les informations dans la fenêtre du terminal.

Nous l’utiliserons avec l’option -s (display a single string), et demanderons le nom du produit système. Notez que nous devons utiliser sudo.

Nous allons exécuter la commande sur une VM VirtualBox fonctionnant sous Ubuntu 22.04.

sudo dmidecode -s nom-du-produit-système

La commande dmidecode identifie correctement une VM VirtualBox

La plateforme est correctement identifiée comme étant VirtualBox.

Sur une VM QEMU-KVM exécutant Fedora 35, nous obtenons cette sortie.

sudo dmidecode -s nom-du-produit-système

La commande dmidecode identifiant correctement une VM GNOME Boxes

Bien qu’il soit signalé comme un PC standard, il s’agit d’un PC virtuel QEMU standard, de type Q35. La plate-forme est donc correctement reconnue comme une machine virtuelle.

Si nous exécutons la même commande sur un ordinateur physique, nous obtenons quelques informations sur le fabricant.

sudo dmidecode -s nom-du-produit-système

La commande dmidecode retourne des informations sur un ordinateur physique

Cet ordinateur est un custom-build basé sur une carte mère Micro-Star International Company Limited, avec le code produit MS-7B86.

COMMENT UTILISER GETOPTS POUR ANALYSER LES OPTIONS DES SCRIPTS SHELL LINUX

La commande lshw

La commande lshw répertorie les détails d’un large éventail de matériel informatique. Nous pouvons choisir la classe de matériel sur laquelle nous voulons que lshw fasse un rapport.

Nous allons utiliser l’option -class avec le modificateur système. L’utilisation de sudo avec cette commande nous assure de voir tous les détails.

Nous allons exécuter cette commande sur notre VM Ubuntu VirtualBox.

sudo lshw -class system

Rapport de la commande lshw sur une VM VirtualBox

Le champ "description" contient une entrée générique "ordinateur".
Le champ "product" nous indique qu'il s'agit d'une machine virtuelle exécutée dans VirtualBox.
Le champ "vendor" contient le nom de la société allemande qui a créé VirtualBox, Innotek GmbH. Innotek a été rachetée par Oracle Corporation en 2010 dans le cadre de son acquisition de Sun Microsystems, Inc.

Nous avons dû installer lshw sur Fedora.

sudo dnf install lshw

Installation de lshw sur Fedora avec la commande dnf

Essayons cette commande dans notre VM Fedora tournant dans des boîtes GNOME.

sudo lshw -class system

Rapport de la commande lshw sur une VM GNOME Boxes

Une fois encore, le champ "description" contient une entrée générique "ordinateur".
Le champ "product" nous donne les mêmes informations standard sur le PC QEMU que nous avons vues avec la commande dmidecode.
Le champ "vendor" contient "QEMU" qui indique clairement qu'il s'agit d'une machine virtuelle.

Voici le résultat de l’exécution de la même commande sur notre ordinateur physique.

sudo lshw -class system

Rapport de la commande lshw sur un ordinateur physique

Nous pouvons voir qu’il s’agit d’un ordinateur matériel, avec une carte mère Micro-Star.

Le matériel est identifié comme étant un ordinateur de bureau.
Le champ "product" nous donne le type de carte mère, MS-7B86.
Le champ "vendor" contient le nom du fabricant.

La commande hostnamectl

Cette commande a l’avantage de ne pas nécessiter les privilèges sudo pour l’exécuter. Cependant, elle n’est disponible que sur les distributions compatibles avec systemd. La majorité des distributions modernes utilisent systemd.

Voici la réponse de l’exécution de la commande sur notre VM Ubuntu VirtualBox.

hostnamectl

La sortie de la commande hostnamectl dans une VM VirtualBox avec la ligne de virtualisation mise en évidence.

Le champ "icon-name" a "-vm" ajouté à celui-ci.
Le champ "Chassis" contient "vm".
Le champ "Virtualization" contient "oracle".
Le champ "Hardware Vendor" contient "innotek GmbH".
Le champ "Hardware Model" contient "VirtualBox".

La sortie sur notre VM Fedora dans les boîtes GNOME est très similaire.

hostnamectl

La sortie de la commande hostnamectl dans une VM GNOME Boxes avec la ligne de virtualisation mise en évidence.

Le champ "icon-name" est complété par "-vm".
Le champ "Chassis" contient "vm".
Le champ "Virtualization" contient "kvm".
Le champ "Hardware Vendor" contient "QEMU".
Le champ "Hardware Model" contient "Standard PC (Q35 + ICH9, 2009)".

Si nous utilisons la commande hostnamectl sur notre bureau physique, la sortie ne contient pas de ligne « Virtualisation ».

hostnamectl

La sortie de la commande hostnamectl sur un ordinateur physique, sans information « Virtualisation ».

S’il n’y a pas de champ « Virtualisation », vous devez être en train de fonctionner sur du métal nu.

La commande systemd-detect-virt

Si vous souhaitez obtenir une réponse aussi courte que possible, la commande systemd-detect-virt est probablement ce que vous recherchez. Encore une fois, cette commande nécessite une distribution équipée de systemd, mais elle ne requiert pas de privilèges sudo. Ceci, ainsi que sa sortie laconique, le rend bien adapté à une utilisation dans des scripts.

Voici le résultat de l’exécution de la commande sur notre VM Ubuntu VirtualBox.

systemd-detect-virt

Identification d’une VM VirtualBox avec systemd-detect-virt

Notre copie de Fedora fonctionnant dans des boîtes GNOME est signalée comme utilisant la virtualisation KVM.

systemd-detect-virt

Identification d’une VM GNOME Boxes avec systemd-detect-virt

L’exécution de systemd-detect-virt sur notre machine matérielle entraîne l’affichage de « none » dans le terminal.

systemd-detect-virt

Un ordinateur physique étant correctement identifié comme n’ayant pas de virtualisation.

Un script sensible à la plate-forme

Pour donner à un script la possibilité de détecter s’il fonctionne dans un environnement virtualisé ou sur un matériel physique, nous pouvons utiliser la commande systemd-detect-virt et utiliser les instructions Bash case pour gérer les options.

Voici le script que nous allons utiliser. Copiez ce texte et enregistrez-le dans un fichier appelé « platform.sh ».

!/bin/bash

shopt -s nocasematch

case $(systemd-detect-virt) in

none)
echo « Matériel Physique »
; ;

*)
echo « Machine virtuelle » ;; ; *)
; ;
esac

Le script utilise shopt pour choisir une correspondance insensible à la casse. La commande systemd-detect-virt est utilisée dans l’instruction case. La sortie de cette commande est comparée à chacune des clauses case dans le corps de l’instruction case jusqu’à ce qu’une correspondance soit trouvée. Tout ce qui ne correspond pas est capturé par la clause par défaut « *) ».

La manière la plus simple est de tester si la réponse de systemd-detect-virt est « none ». Si c’est le cas, le script s’exécute sur du matériel physique. Pour tous les autres cas, le script doit être exécuté sur une machine virtuelle.

Avant de pouvoir exécuter le script, nous devons le rendre exécutable, en utilisant chmod.

chmod +x platform.sh

Rendre le script platform exécutable avec chmod

Il identifie correctement notre VM Ubuntu VirtualBox comme une machine virtuelle.

./platform.sh

Utilisation du script platform.sh dans une VM VirtualBox

Il détecte également correctement la VM GNOME Boxes exécutant Fedora.

./platform.sh

Utilisation du script platform.sh dans une VM GNOME Boxes

Le script détecte aussi correctement s’il est exécuté sur une machine physique.

./platform.sh

Utilisation du script platform.sh sur un ordinateur physique

Les différentes clauses de cas pourraient définir des variables qui ont été vérifiées ailleurs dans le script pour effectuer différents types de traitement, ou elles pourraient appeler des fonctions spécifiques dans votre script.

Si votre script devait détecter et prendre en compte différents types d’environnements virtuels, vous pourriez ajouter d’autres clauses de cas, en recherchant les différentes chaînes de caractères que systemd-detect-virt peut retourner. Nous pouvons voir la liste complète des réponses possibles en utilisant l’option –list. Pour faciliter l’affichage de toutes les réponses en une seule fois, nous allons faire passer la sortie par la commande column.

systemd-detect-virt –list | column

L’ensemble complet des réponses que systemd-detect-virt peut retourner.

Prenez la pilule rouge

Ces techniques permettent à vos scripts de savoir quand ils fonctionnent sur du matériel nu et quand ils sont dans une machine virtuelle.

Comme Neo dans Matrix, ils sauront ce qui est réel et ce qui ne l’est pas.