Installer et régler une machine virtuelle Windows10 avec Qemu-KVM dand un linux

Motivations

Cette migration vers Qemu-KVM a été entreprise du fait de la conjonction de trois événements : * l'apparition de sérieux problèmes d'installation des mises à jour du logiciel Virtualbox en version testing de debian ayant rendu la machine virtuelle Windows 7 indisponible * le caractère obsolète de windows7 et le nécessaire passage à windows10 * le fait que la multiplication des usages des Raspberies Pi imposait une façon plus efficace de compiler les logiciels embarqués que sur une instance dédiée de RaspberryPi.

Cette migration s'est révélée plus difficile que prévu !


Sommaire

  1. Environnement dépendances et téléchargements

    a. ISO windows10

    b. Vérification de la configuration hardware

    c. Installation des paquets nécessaires

  2. Création de la machine virtuelle et installation de windows10

    a. Configuration standard de virt-manager

    b. Configuration particulière de virt-manager

    c. En cas d'utilisation de disque externe

  3. Mise en production


Téléchargements

  1. Logiciels VirtIO

1. Environnement dépendances et téléchargements

L'installation a été réalisée et testée sur une machine debian testing (bullseye] équipée d'une cartegraphique nvidia.

1.1 ISO windows10

Il est nécessaire disposer d'une licence VDA de windows10 pour pouvoir l'installer dans une machine virtuelle. Cette licence particulière pour machines virtuelle dispose d'une documentation concernant exclusivement l'utilisation des solutions propriétaires du vendeur et il faut trouver le support Qemu-KVM ailleurs. L'image ISO qui m'a été fournie propose plusieurs installations possibles, il est bien sûr crucial de choisir l'installation qui correspond au code qui vous a été fourni. En ce qui me concerne la désignation du code qui m'avait été fourni n'avait rien à voir avec aucun des noms d'installations proposés, je suis passé par le support pour obtenir le nom de l'installation à utiliser.

Vous devez disposer d'une image iso du type X##-$$$$$.ISO

1.2 Vérification de la configuration hardware

Pour installer la virtualisation il est nécessaire que ces fonctions aient été activées depuis le BIOS. Afin de vérifier plusieurs solutions sont possibles.

La plus simple

Utiliser la commande lscpu et vérifier que la ligne "Virtualisation contient une information, par exemple :

Virtualisation :                        VT-x

La plus aboutie

Installer le paquet libvirt-clients et utiliser la commande de validation de l'hote.

sudo apt install libvirt-clients
[sudo] Mot de passe de ######## : 
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
  cpp-7 lib32asan4 lib32gcc-7-dev libasan4 libx32asan4 libx32gcc-7-dev libx86emu2
Veuillez utiliser « sudo apt autoremove » pour les supprimer.
Les paquets supplémentaires suivants seront installés : 
  dmeventd libdevmapper-event1.02.1 liblvm2cmd2.03 libvirt0 lvm2 thin-provisioning-tools
Paquets suggérés :
  libvirt-daemon
Les NOUVEAUX paquets suivants seront installés :
  dmeventd libdevmapper-event1.02.1 liblvm2cmd2.03 libvirt-clients libvirt0 lvm2 thin-provisioning-tools
0 mis à jour, 7 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 6 447 ko dans les archives.
Après cette opération, 33,0 Mo d'espace disque supplémentaires seront utilisés.


.../...

virt-host-validate
  QEMU : Vérification for hardware virtualization                                  : PASS
  QEMU : Vérification if device /dev/kvm exists                                    : PASS
  QEMU : Vérification if device /dev/kvm is accessible                             : PASS
  QEMU : Vérification if device /dev/vhost-net exists                              : PASS
  QEMU : Vérification if device /dev/net/tun exists                                : PASS
  QEMU : Vérification for cgroup 'cpu' controller support                          : PASS
  QEMU : Vérification for cgroup 'cpuacct' controller support                      : PASS
  QEMU : Vérification for cgroup 'cpuset' controller support                       : PASS
  QEMU : Vérification for cgroup 'memory' controller support                       : PASS
  QEMU : Vérification for cgroup 'devices' controller support                      : PASS
  QEMU : Vérification for cgroup 'blkio' controller support                        : PASS
  QEMU : Vérification for device assignment IOMMU support                          : PASS
  QEMU : Vérification if IOMMU is enabled by kernel                                : PASS
   LXC : Vérification pour Linux >= 2.6.26                                         : PASS
   LXC : Vérification for namespace ipc                                            : PASS
   LXC : Vérification for namespace mnt                                            : PASS
   LXC : Vérification for namespace pid                                            : PASS
   LXC : Vérification for namespace uts                                            : PASS
   LXC : Vérification for namespace net                                            : PASS
   LXC : Vérification for namespace user                                           : PASS
   LXC : Vérification for cgroup 'cpu' controller support                          : PASS
   LXC : Vérification for cgroup 'cpuacct' controller support                      : PASS
   LXC : Vérification for cgroup 'cpuset' controller support                       : PASS
   LXC : Vérification for cgroup 'memory' controller support                       : PASS
   LXC : Vérification for cgroup 'devices' controller support                      : PASS
   LXC : Vérification for cgroup 'freezer' controller support                      : PASS
   LXC : Vérification for cgroup 'blkio' controller support                        : PASS
   LXC : Vérification if device /sys/fs/fuse/connections exists                    : PASS

D'autres solutions et explications sont disponibles sur Test des cpu

1.3 Installation des paquets nécessaires

Il est possible de construire des images "à la main" en composant soi même la commande qemu qui créera la machine virtuelle mais il est plus simple d'utiliser l'interface graphique de virt-manager qui s'appuie sut la librairie libvirt. Fette stratégie facilite la configuration mais impose un certain nombre de choix compatibles avec l'usage moyen, pour des utilisations particulières prévoir une autre stratégie.

sudo apt install qemu-kvm virt-manager libvirt-daemon
[sudo] Mot de passe de vidal : 
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés : 
  augeas-lenses gir1.2-gtk-vnc-2.0 gir1.2-libosinfo-1.0 gir1.2-libvirt-glib-1.0
  gir1.2-spiceclientglib-2.0 gir1.2-spiceclientgtk-3.0 libaugeas0 libgovirt-common libgovirt2
  libnetcf1 libnss-mymachines libvirt-daemon-driver-lxc libvirt-daemon-driver-qemu
  libvirt-daemon-driver-vbox libvirt-daemon-driver-xen libvirt-daemon-system
  libvirt-daemon-system-systemd libvirt-glib-1.0-0 libxencall1 libxendevicemodel1
  libxenevtchn1 libxenforeignmemory1 libxengnttab1 libxenmisc4.11 libxenstore3.0
  libxentoolcore1 libxentoollog1 libxml2-utils netcat-openbsd ovmf python3-libvirt
  qemu-system-x86 seabios systemd-container virt-viewer virtinst
Paquets suggérés :
  augeas-doc augeas-tools libvirt-daemon-driver-storage-gluster
  libvirt-daemon-driver-storage-rbd libvirt-daemon-driver-storage-zfs numad auditd nfs-common
  open-iscsi pm-utils radvd systemtap zfsutils samba vde2 qemu-block-extra python3-guestfs
  ssh-askpass
Les NOUVEAUX paquets suivants seront installés :
  augeas-lenses gir1.2-gtk-vnc-2.0 gir1.2-libosinfo-1.0 gir1.2-libvirt-glib-1.0
  gir1.2-spiceclientglib-2.0 gir1.2-spiceclientgtk-3.0 libaugeas0 libgovirt-common libgovirt2
  libnetcf1 libnss-mymachines libvirt-daemon libvirt-daemon-driver-lxc
  libvirt-daemon-driver-qemu libvirt-daemon-driver-vbox libvirt-daemon-driver-xen
  libvirt-daemon-system libvirt-daemon-system-systemd libvirt-glib-1.0-0 libxencall1
  libxendevicemodel1 libxenevtchn1 libxenforeignmemory1 libxengnttab1 libxenmisc4.11
  libxenstore3.0 libxentoolcore1 libxentoollog1 libxml2-utils netcat-openbsd ovmf
  python3-libvirt qemu-kvm qemu-system-x86 seabios systemd-container virt-manager virt-viewer
  virtinst
0 mis à jour, 39 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 16,7 Mo dans les archives.
Après cette opération, 64,5 Mo d'espace disque supplémentaires seront utilisés.

Il est aussi nécessaire de télécharger une image contenant les logiciels windows nécessaires à la gestion de la virtualisation depuis le site fedora.

curl https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.171-1/virtio-win-0.1.171.iso -o virtio-win

2. Création de la machine virtuelle et installation de windows10

On utilise le gestionnaire de machines virtuelles virt-manger connecté au serveur libvirt, suivant les types d'installation les services libvirt* peuvent ne pas être démarrés par défaut, ils sont lancé au premier démarrage de virt-manager.

2.1 Configuration standard de virt-manager

ajouter le user qui lancera la machine au groupe kvm sinon seul root dispose de ce privilège sudo adduser name kvm

  • Lancer virt-manager autoriser la connection au serveur qemu et choisir "créer une nouvelle machinevirtuelle"
  • Choisir le media d'installation X##-$$$$$.ISO choisir manuellement windows10
  • Choisir la taille de la mémoire et le nombre de cpus de la machine virtuelle
  • Sélectionner un stockage personnalisé
  • Créer une image au format raw (impératif pour des raisons de performance
  • Nommer la nouvelle machine et cocher "personnaliser la configuration avant l'installation"
  • terminer et activer le réseau virtuel (proposé automatiquement) Modifier les paramètres avancés du disque dur :
Mode de cache none
mode d'E/S native

Lancer l'installation.

Avec cette configuration on obtient un client windows10 opérationnel (après un reboot et une phase d'installation classique de windows) mais qui peut être très lent voir même se figer complètement. ce problème n'arrive peut-être pas pour toutes les configurations (ça reste du windows ;-) ), ce n'est pas risqué de tester car l'arrêt forcé fonctionne bien et ne cause pas de dommages à la machine virtuelle qui vient d'être installée. Le chapitre suivant précise les modifications de configuration à effectuer pour éviter cette lenteur si elle apparait..

Le plus efficace est d'éteindre proprement la machine avant qu'elle ne ralentisse pour procéder aux manipulations suivantes La commande suivante permet de lancer automatiquement le réseau lorsque libvirt démarre.

virsh net-autostart default

2.2 Configuration particulière de virt-manager

Les modifications proposées permettent soit d'éviterle bug de lenteur excessive de windows soit de profiter des avantages de libvirt. Relancer virt-manager, choisir la machine qui vient d'être installée puis ouvrir, cliquer sur l'ampoule afficher les détails puis réaliser les modifications suivantes.

  • Ajouter un lecteur de cd contenant le lien vers la deuxième image téléchargée depuis fedora nommée virtio-win.iso dans cet article.
  • Ajouter un disque dur au format VirtIO qui permettra de rajouter le driver virtIO dans le client win10
  • Vérifier et modifier si nécessaire les paramètres avancés des deux disques durs :
Mode de cache none
mode d'E/S native
  • Dans les préférences du gestionnaire virt-manager autoriser la modification des fichiers XML puis ans l'un des quatre premiers éléments de la liste du matériel choisir l'onglet XML chercher le paramètre machine ajouter kernel_irqchip=on

Au redémarrage vous devez obtenir une machine windows10 stable (ne ralentissant pas et ne se figeant pas).Le premier travail à réaliser est l'ajout de guest-additionsdepuis le CD VirtIO. pour cela ouvrir le navigateur de fichiers, le CD VirtIO, aller dans le répertoire guest agentchoisir l'xécutable qemu-ga-x86_64. Une autre cause de ralentissement peut-être le fait que windows10 ne dispose pas nativement des drivers pour la machine virtuelle. Dans ce cas taper dans la barre de recherche "device manager" ensuite cliquer sur le bouton droit de la souris sur les drivers présentant une anomalie (icone jaune attention sur le coin de l'icone du driver) et rechercher le driver dans le CDROM virtIO, la procédure est automatisée le driver se trouve et se charge seul.

Il est possible que certains problèmes apparaissent, voici une solution si le réseau défault à disparu (après un reboot de l'hôte par exemple) et que la machine virtuelle refuse de booter. Exécuter la liste de commandes suivante.

sudo virsh net-define /etc/libvirt/qemu/networks/default.xml
sudo virsh net-autostart default
sudo virsh net-start default
sudo virsh net-list
```shell



Dernière cause possible la gestion du cache de windows10, aller dans performance du paneau de configuration et dimensionner le cache manuellement.

une fois toutes les améliorations de driver effectuées il est possible de passer le disque dur en `virtIO` ce qui est aussi sensé améliorer la performance.

## <a name="head2.3"></a>2.3 En cas d'utilisation de disque externe

Si on utilise un disque externe monté sur `/media/user` il est nécessaire de permettre à `libvirt-qemu` d'accéder à ce disque en modifiant les ` ACL`  avec la commande suivante :

```shell
sudo setfacl -m u:libvirt-qemu:rx /media/vidal

S'il ne s'agit pas d'une installation standard et si le user qui lance la machine virtuelle n'est pas libvirt-qemu modifier le nom de user en conséquence.

3. Mise en production

La machine windows10 est totalement opérationnelle, il ne reste plus qu'ajouter le code d'activation et configurer l'univers windows comme vous le spouhaitez. Bon travail.


Webographie

  1. Test des cpu
  2. documentation Qemu
  3. documentation debian
  4. documentation ubuntu
  5. logiciels pour VirtIO
  6. Guide virtualisation
  7. Amélioration de la performance windows10

Commentaires