meta données pour cette page
machine virtuelle pour OS historique
objectif | installer dans une VM isolée du réseau, un vieil OS dont on a encore besoin |
---|---|
difficulté | ★★★☆☆ |
★★★★☆ | |
public | Béotiens GNU/Linux, utilisateurs GNU/Linux avancés, sysadmin |
date | 30 novembre 2022 |
Assistance | Votre moteur de recherche |
Parfois, on a un vieil instrument extrêmement onéreux, comme un microscope, ou une sonde quelconque, qui est pilotée par un logiciel fonctionnant sous windows XP, ou autre OS du même âge. Le PC de pilotage contrôle l'appareil par un lien éthernet ou USB. Ces vieux PC ne peuvent plus être sur le réseau, et quand il tombent en panne, ne peuvent plus non plus être réparés. On peut faire fonctionner ces vieux OS sur une machine virtuelle (MV) à l'intérieur d'un PC récent. Ce document explique comment faire.
Commençons un peu par préciser ce qu'on souhaite. Une expérience utilisateur aussi proche que possible du fonctionnement ordinaire du PC historique. Au démarrage du PC hôte, la MV doit se lancer automatiquement. Il faut également qu'un visualisateur plein écran se lance automatiquement sans qu'aucune intervention de l'utilisateur ne soit nécessaire. Lorsque la MV est éteinte, le PC hôte doit s'éteindre. Si le visualisateur s'arrête mais que la MV est toujours en fonctionnement, c'est un plantage et il faut le relancer.
Il faut également prévoir un mode qui permet à un administrateur de se connecter, de lancer un visualisateur, de faire des tests, etc… On utilisera un fichier garde-fou dans /etc
. Le simple fait que ce fichier existe empêche la session de visualisation automatique d'éteindre le PC ou de se relancer si le visualisateur s'arrête, laissant le champ libre à l'administrateur.
J'ai fait des essais en utilisant windows comme système hôte et en utilisant linux. Le plus simple a été au final d'utiliser Ubuntu GNU/Linux comme système hôte. Le tout est très facile. Il suffit de partir d'une installation d'Ubuntu GNU/Linux Desktop, d'ajouter quelques composants logiciels pour avoir le système de virtualisation et d'effectuer une poignée de réglages.
L'installation d'Ubuntu GNU/Linux n'est pas compliquée non plus. Le tutoriel officiel, bien qu'en anglais est très facile à suivre.
Pour le reste, ça se fait en quelques minutes.
terminal
Les commandes indiquées comme celles ci :
echo "Bonjour Monde"
doivent être saisies dans un émulateur de terminal. Chaque ligne doit être validée par l'appui sur la touche ↵ Entrée. Vous trouverez le terminal en tapant «terminal» dans la recherche d'application. Il suffit alors de double-cliquer sur l'icône. Souvent, le raccourci Ctrl+Alt+T démarre un nouveau terminal.
pour les débutants en terminal
saisie de mots de passe
Dans un terminal, si on vous demande de taper votre mot de passe, il faudra le faire à l'aveugle. Il n'y a rien qui indique que vous avez appuyé sur une touche, on dirait bien que «ça ne fonctionne pas» ou «que ça n'écrit pas». C'est normal, c'est juste la manière de faire des terminaux. Quand vous avez fini de saisir votre mot de passe à l'aveugle, n'oubliez pas de valider avec la touche ↵ Entrée.- Copier/coller
Ne cherchez pas à utiliser Ctrl+C et Ctrl+V pour les copier/coller. Utiliser le clic secondaire de votre souris et choisissez l'option «coller» - utilisation de la souris
Pour le reste, oubliez l'usage de la souris dans un émulateur de terminal ; ça ne fera probablement pas ce à quoi vous vous attendez. N'utilisez que le clavier. Si vous avez saisi une erreur, le plus simple est d'effacer et de recommencer.
Installation des composants logiciels nécessaires
Passée l'installation de Linux, il faut ajouter les composants de virtualisation :
sudo apt-get install virt-viewer libvirt-daemon virt-manager pwgen
Utilisation de deux réseaux virtuels
Par défaut, libvirt propose un seul réseau NATé ce qui donne accès à internet à la machine invitée. On va ajouter une seconde connexion réseau, purement interne, qui ne permet que des connexions entre l'invité et l'hôte. Une fois terminé tous les réglages de l'invité, on pourra supprimer la liaison réseau NAT et ne conserver que la liaison interne.
- Avec le compte d'utilisateur ordinaire créé lors de l'installation d'Ubuntu GNU/Linux, ouvrir un émulateur de terminal et exécuter la commande
virt-manager
- Choisir alors «Édition» ⇒ «Détails de la connexion» image
- Onglet «Réseau virtuels» on voit le réseau par défaut. En bas de la fenêtre, chosir + pour ajouter un réseau image
- Ajouter alors le réseau «intermachine» de type isolé. image
Installation d'un système invité
Toujours à partir de virt-manager
, créer une machine virtuelle et y installer le système de son choix. Votre moteur de recherche vous indiquera comment faire.
La seule chose à laquelle il faudra faire attention à ce niveau est l'ajout de deux cartes réseau virtuelles à la MV. L'une sur un réseau purement interne au PC, celle qui, une fois tout réglé sera la seule à fonctionner et l'autre utilisée temporairement pour l'installation du système invité et de ses composants.
Pour le reste, installez donc votre OS invité comme vous le voulez.
À partir de maintenant, toutes les commandes en root
Toutes les commandes ci-dessous sont à exécuter avec l'utilisateur root. Donc, une bonne fois pour toute, dans un émulateur de terminal, lancer la commande suivante :
sudo -i
Réaliser les réglages de démarrage et d'arrêt automatique
- Création d'un utilisateur dédié virtlauncher
adduser virtlauncher echo virtlauncher:$(pwgen 20 1) | chpasswd passwd -l virtlauncher addgroup virtlauncher libvirt
- exécutable
run-viewer
dans le foyer de virtlauncher qui lance le visualisateur puis éteint le PC, et prend en charge le fichier garde-fou/etc/virtlauncher.nopoweroff
. Adaptez le nom du domaine à visualiser à ce que vous avez utilisé. Ici c'estwinxp
. La commande suivante lance l'éditeur, le contenu du fichier est indiqué juste en dessous.mkdir /home/virtlauncher/bin editor /home/virtlauncher/bin/run-viewer
- /home/virtlauncher/bin/run-viewer
#! /bin/sh domain=winxp while : ; do env LANG=C.utf8 LC_ALL=C.utf8 LANGUAGE=C.utf8 \ VIRSH_DEFAULT_CONNECT_URI=qemu:///system \ virt-viewer -w -f -a --domain-name "$domain" # check if guest is still running. If not, exit the loop. virsh list --name | grep -q "$domain" || break # guest is still running, check stop file. If stop file # exists, just leave the loop. test -f /etc/virtlauncher.nopoweroff && break done ! test -f /etc/virtlauncher.nopoweroff && sudo /usr/sbin/poweroff
Une fois le fichier créé, ne pas oublier de le rendre exécutable :
chmod 0755 /home/virtlauncher/bin/run-viewer
- Ajout du compte d'utilisateur virtlauncher dans aux sudoers juste pour l'autoriser à exécuter la commande
poweroff
qui éteint le PC hôte. Pour cela, on crée un fichier/etc/sudoers.d/virtlauncher
avec la commandevisudo -f /etc/sudoers.d/virtlauncher
Le contenu doit être celui-ci :
- /etc/sudoers.d/virtlauncher
virtlauncher ALL = NOPASSWD: /usr/sbin/poweroff
- Création d'une session qui ne fait que lancer la commande
/home/virtlauncher/bin/run-viewer
. Créer le fichier/usr/share/xsessions/virtlauncher-session.desktop
. Le dossier existe déjà.editor /usr/share/xsessions/virtlauncher-session.desktop
Le contenu
- /usr/share/xsessions/virtlauncher-session.desktop
[Desktop Entry] Name=WinXP Comment=This session logs you into WindowsXP Exec=/home/virtlauncher/bin/run-viewer TryExec=/usr/bin/virt-viewer Type=Application DesktopNames=ubuntu:WinXP X-GDM-SessionRegisters=false
- Utilisation de cette session pour le compte virtlauncher. Là encore, un simple fichier desktop appartenant à root:root et en lecture seule pour son propriétaire.
editor /var/lib/AccountsService/users/virtlauncher chmod 0600 /var/lib/AccountsService/users/virtlauncher
Voilà le contenu du fichier.
- /var/lib/AccountsService/users/virtlauncher
[User] Session=virtlauncher-session Icon=/var/lib/AccountsService/icons/virtlauncher SystemAccount=false [InputSource0] xkb=fr
Si vous avez une image .png de dimension 512×512 qui peut servir d'icône au compte virtlauncher, vous pouvez la copier dans
/var/lib/AccountsService/icons/virtlauncher
. Sinon, c'est pas grave.cp /tmp/uneimage.png /var/lib/AccountsService/icons/virtlauncher
- Démarrage automatique de la session de l'utilisateur virtlauncher. Deux lignes dans la section daemon du fichier
/etc/gdm3/custom.conf
. Prévoir un gestionnaire de configuration style puppet, une mise à jour qui rétablit le fichier d'origine arrive si vite…editor /etc/gdm3/custom.conf
- /etc/gdm3/custom.conf
[daemon] AutomaticLoginEnable=True AutomaticLogin=virtlauncher
Et voilà ! C'est fini. Si on récapitule :
- au boot :
- la machine virtuelle démarre seule
- l'utilisateur virtlauncher est connecté automatiquement
- sa session n'est qu'un visualisateur de la MV
- quand le visualisateur se termine, le PC hôte est arrêté
C'est le moment de tester.
reboot
Communication avec le monde
Une machine isolée du réseau pour contrôller un appareil, c'est bien, mais parfois on veut tout de même communiquer un peu avec l'extérieur. Par exemple pour mettre à disposition les résultats issus de l'appareil. On peut alors partager un dossier depuis la machine hôte (la machine GNU/Linux) à la fois vers la machine invitée sur le réseau isolé, et vers le réseau local sur lequel se trouve le PC GNU/Linux. Toutes sortes de réglages sont possibles, partage en lecture/écriture vers la machine invitée et en lecture seule vers le reste, afin de rendre impossible le dépôt de fichiers sur la machine historique, dont l'antivirus n'est pas forcément à jour…
Ainsi, depuis le système invité (WinXP ici), on peut déposer les documents dans ce dossier partagé, et les lire depuis le poste de travail habituel.
Ceci n'est pas expliqué ici. Ce n'est pas très compliqué à mettre en place. Votre moteur de recherche favori est votre ami sur ce coup.