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.
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.
Passée l'installation de Linux, il faut ajouter les composants de virtualisation :
sudo apt-get install virt-viewer libvirt-daemon virt-manager pwgen
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.
virt-manager
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.
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
adduser virtlauncher echo virtlauncher:$(pwgen 20 1) | chpasswd passwd -l virtlauncher addgroup virtlauncher libvirt
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'est winxp
. 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
#! /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
poweroff
qui éteint le PC hôte. Pour cela, on crée un fichier /etc/sudoers.d/virtlauncher
avec la commande visudo -f /etc/sudoers.d/virtlauncher
Le contenu doit être celui-ci :
virtlauncher ALL = NOPASSWD: /usr/sbin/poweroff
/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
[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
editor /var/lib/AccountsService/users/virtlauncher chmod 0600 /var/lib/AccountsService/users/virtlauncher
Voilà le contenu du fichier.
[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
/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
[daemon] AutomaticLoginEnable=True AutomaticLogin=virtlauncher
Et voilà ! C'est fini. Si on récapitule :
C'est le moment de tester.
reboot
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.