8. Optimisation d'une machine virtuelle

Cette section est commune aux deux solutions de virtualisation QEMU et KVM. Il s'agit d'un catalogue de quelques trucs et astuces permettant d'optimiser l'usage d'une instance virtuelle de système d'exploitation.

8.1. Optimisation de la gestion de paquets

Pour optimiser la gestion de paquets avec APT sur une machine virtuelle Debian GNU/Linux on essaie de limiter au maximum l'occupation disque de façon à donner un maximum d'espace aux services Internet dans l'arborescence /var.

# aptitude clean

Il est inutile de conserver les fichiers .deb correspondant aux paquets installés sur le système virtuel. La commande # aptitude clean sert justement à nettoyer l'arborescence /var/cache/apt.

# aptitude purge $(deborphan)

La commande deborphan appartenant au paquet du même nom recherche les paquets orphelins installé sur le système. Les paquets trouvés ne sont pas nécessaires au fonctionnement des services installés ; on peut donc les supprimer sans problème pour gagner de la place disque.

Le résultat de la commande suivante montre que le «ménage» a été fait.

# aptitude purge $(deborphan)
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Lecture de l'information d'état étendu
Initialisation de l'état des paquets... Fait
Aucun paquet ne va être installé, mis à jour ou enlevé.
0 paquets mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 0o d'archives. Après dépaquetage, 0o seront utilisés.
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Lecture de l'information d'état étendu
Initialisation de l'état des paquets... Fait
# localepurge

La commande localepurge appartenant au paquet du même nom. Elle sert à effacer tous les fichiers de «localisation» (langues étrangères) inutiles sur le disque. Elle est appelée automatiquement à chaque opération de gestion de paquets avec dselect, apt-get ou aptitude.

La fin du fichier de configuration /etc/locale.nopurge répertorie les paramètres des fichiers de localisation à conserver.

# tail /etc/locale.nopurge
#####################################################
# Following locales won't be deleted from this system
# after package installations done with apt-get(8):

en
fr
fr_FR.UTF-8
Transparent proxy, Service Mandataire

L'utilisation du gestionnaire de paquets peut poser problème lorsque le système hôte se trouve derrière un service mandataire ou proxy transparent.

Dans ce cas, il faut compléter la configuration du gestionnaire de paquets sur chaque instance de système virtuel en ajoutant un fichier dans le répertoire /etc/apt/apt.conf.d/.

# cat /etc/apt/apt.conf.d/10proxy
Acquire::http::No-Cache "true";
Acquire::http::Max-Age "0";
Duplication du jeu de paquets entre systèmes, aptitude-create-state-bundle, aptitude-run-state-bundle

Pour dupliquer le jeu de paquets installés entre instances système, il est possible de créer un fichier image de l'état d'une installation. Cette technique permet de transférer la liste des paquets installés entre architectures différentes. Le transfert le plus courant consiste à passer d'une architecture 32 bits ou i386 à une architecture 64 bits ou amd64.

Côté système source, celui qui détient le jeu de référence, on utilise la commande aptitude-create-state-bundle.

# aptitude-create-state-bundle selections.bz2
# exit
etu@vm:~$ logout
Connection to 192.0.2.2 closed.
:~/vm$ scp etu@192.0.2.2:~/selections.bz2 .
etu@192.0.2.2's password:
selections.bz2  100%   30MB  15.0MB/s   00:02

Côté système destination, celui sur lequel on doit appliquer le jeu de référence pour compléter sa liste de paquets installés, on utilise la commande aptitude-run-state-bundle.

:~/vm$ ./scripts/startup.sh vm0-debian-stable-amd64-base.raw 384 2
Adresse MAC : 52:54:00:12:34:02 et N° port 2
:~/vm$ scp selections.bz2 etu@192.0.2.2:~
etu@192.0.2.2's password:
selections.bz2  100%   30MB  29.9MB/s   00:01
:~/vm$ ssh etu@192.0.2.2
etu@192.0.2.2's password:
etu@vm:~$ su
Mot de passe :
vm:/home/etu# aptitude-run-state-bundle selections.bz2
vm:/home/etu# aptitude -u

8.2. Optimisation de la console

Que l'on accède à une instance de système virtualisé via le terminal d'exécution, VNC ou SSH, il est important de disposer d'un jeu de caractères et d'un affichage cohérent.

Terminal d'exécution, gpm

Le paquet gpm permet d'utiliser la souris en mode console pour effectuer les opérations du type copier/coller.

console-data

Avec une instance stable (Lenny) de système virtuel sans interface graphique, c'est le paquet console-data qui permet de gérer les codes de touches clavier, les jeux de caractères et les polices en mode console.

La reconfiguration du paquet console-data avec la commande # dpkg-reconfigure -plow console-data permet de sélectionner les options suivantes :

Politique de gestion des codages clavier :Choisir un codage clavier pour votre architecture

Disposition générale du clavier :azerty

Disposition du clavier :French

Variante du clavier :Same as X11 (latin 9)

console-setup

Dans le cas d'une instance testing ou unstable de système virtuel avec ou sans interface graphique, c'est le paquet console-setup qui gère les codes de touches clavier, les jeux de caractères et les polices en mode console.

La reconfiguration du paquet console-setup avec la commande # dpkg-reconfigure -plow console-setup permet de sélectionner les options suivantes :

Modèle du clavier :Generic 105-key (Intl) PC

Origine du clavier :France

Disposition du clavier :France - (Legacy) Alternative

Touche de remplacement d'AltGr :Touche Alt de droite

Touche « compose » :Pas de touche « compose »

Codage de la console :UTF-8

Jeu de caractères devant être pris en charge par la police de la console :# latin1 et latin5 : langues de l'Europe de l'ouest et turc

Police de caractères pour la console :Fixed

Taille de la police :18

Consoles virtuelles utilisées :/dev/tty[1-6]

8.3. Optimisation de la configuration graphique

La gestion de l'interface graphique d'une instance de système virtualisé ne peut prétendre atteindre les mêmes performances que sur un système hôte. En effet, sur un système non virtualisé le graphisme utilise les ressources d'un composant spécifique baptisé Graphics Processing Unit ou GPU. La virtualisation implique l'émulation d'un composant GPU et vu la complexité des traitements assurés par ces composants, la tâche est particulièrement ardue. À l'heure actuelle, on ne trouve pas d'émulation de composant interfacé sur bus PCI Express dans les solutions libres.

Pour corser un peu plus la situation, les bibliothèques X.Org sont en pleine mutation au moment de la rédaction de ces lignes. Historiquement, le serveur graphique procède lui-même à l'inventaire des fonctions graphiques offertes par le GPU présent sur le système. C'est le mode de fonctionnement que l'on retrouve sur la version stable de la distribution Debian GNU/Linux.

Avec les versions les plus récentes des bibliothèques X.org, le logiciel serveur ne procède plus à un inventaire autonome et doit s'appuyer sur d'autres outils de façon à réagir à chaud aux modifications de configuration matérielle : connexion/déconnexion de périphériques.

Comme les solutions KVM et QEMU partagent les mêmes fonctions d'émulation, elles proposent la même carte graphique très basique.

$ lspci |grep VGA
00:02.0 VGA compatible controller: Cirrus Logic GD 5446

La lecture de la documentation du composant CL-GD5446 indique clairement que la meilleure qualité d'affichage est obtenue pour une résolution de 1024x768. Toute augmentation de cette résolution se fait au détriment de la profondeur de couleur. Pour cette raison, nous ne chercherons pas à dépasser la résolution nominale du composant émulé.

À titre d'exemple, voici une copie du fichier de configuration sur une instance de système virtuel Debian/testing, un extrait de l'inventaire des caractéristiques du composant graphique identifiées ainsi que deux copies d'écran de l'interface KDE 4.2.

  • Fichier de configuration principal X.Org : /etc/X11/xorg.conf.

    Section "InputDevice"
            Identifier      "Generic Keyboard"
            Driver          "kbd"
            Option          "XkbRules"      "xorg"
            Option          "XkbModel"      "pc105"
            Option          "XkbLayout"     "fr"
            Option          "XkbVariant"    "latin9"
            Option          "XkbOptions"    "lv3:ralt_switch"
    EndSection
    
    Section "InputDevice"
            Identifier      "Configured Mouse"
            Driver          "mouse"
    EndSection
    
    Section "Device"
            Identifier      "Configured Video Device"
    EndSection
    
    Section "Monitor"
            Identifier      "Configured Monitor"
            HorizSync       30 - 90
            VertRefresh     50 - 160
    EndSection
    
    Section "Screen"
            Identifier      "Default Screen"
            Monitor         "Configured Monitor"
            DefaultDepth    24
            Subsection "Display"
                    Depth         24
                    Modes         "1024x768" "800x600"
            EndSubSection
    EndSection
    
  • Extraits du journal d'exécution du serveur graphique.

    # less /var/log/Xorg.0.log
    <snip/>
    (--) PCI:*(0:2:0) Cirrus Logic GD 5446 rev 0, Mem @ 0xf0000000/25, 0xf2000000/12
    <snip/>
    (==) CIRRUS(0): Write-combining range (0xf0000000,0x100000)
    (--) CIRRUS(0): Memory Config reg 1 is 0x98
    (--) CIRRUS(0): Memory Config reg 2 is 0x20
    (--) CIRRUS(0): VideoRAM: 4096 kByte
    (==) CIRRUS(0): Min pixel clock is 12 MHz
    (--) CIRRUS(0): Max pixel clock is 85 MHz
    (II) CIRRUS(0): Configured Monitor: Using hsync range of 30.00-90.00 kHz
    (II) CIRRUS(0): Configured Monitor: Using vrefresh range of 50.00-160.00 Hz
    (II) CIRRUS(0): Clock range:  12.00 to  85.50 MHz
    <snip/>
    (--) CIRRUS(0): Virtual size is 1024x768 (pitch 1024)
    (**) CIRRUS(0): *Default mode "1024x768": 78.8 MHz, 60.0 kHz, 75.0 Hz
    (II) CIRRUS(0): Modeline "1024x768"x75.0   78.75  1024 1040 1136 1312  768 769 772 800 +hsync +vsync (60.0 kHz)
    
  • Copies d'écran de l'interface graphique sur une instance de machine virtuelle Debian/testing.

Une autre solution consiste à utiliser le paramètre -vga lors de l'initialisation de l'instance de machine virtuelle en indiquant une autre émulation graphique. L'émulation d'adaptateur compatible VMWare SVGA-II offre un panel de résolutions plus important. Relativement à l'émulation de la carte Cirrus CL-GD5446 présentée ci-dessus, la configuration est considérablement simplifiée puisqu'il n'est plus nécessaire d'utiliser un fichier /etc/X11/xorg.conf paramétré manuellement. La reconnaissance automatisée du composant graphique fonctionne directement.

8.4. Optimisation des accès SSH

Pour administrer des systèmes à distance, le protocole SSH est le mode de connexion universel. Dans le contexte particulier de l'administration des instances de systèmes virtuels, une même image système avec une même clé d'hôte RSA est dupliquée autant de fois que nécessaire. On se trouve rapidement confronté aux traditionnels messages d'alertes sur l'usurpation de cette clé d'hôte lorsque l'on accès aux instances virtuelles depuis le système hôte.

On peut configurer le client SSH du système hôte de façon à ne pas vérifier «l'identité», c'est à dire la clé d'hôte RSA, des instances de systèmes virtualisées. La documentation complète sur la configuration du client SSH est fournie dans les pages de manuels : $ man ssh_config.

Voici un extrait de fichier ~/.ssh/config qui désactive les contrôles pour tous les hôtes dont les adresses IP correspondent au masque 192.0.*.

Host 192.0.*
  CheckHostIP no
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null