6. Optimisation système

Cette section est une liste de quelques trucs et astuces permettant d'optimiser l'usage d'une instance virtuelle de système d'exploitation.

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 dans l'arborescence /var.

# aptitude clean

Il est inutile de conserver les fichiers .deb correspondant aux paquets installés sur le système virtuel. Cette commande 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 cette commande 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.

# 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 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

#VERBOSE

#####################################################
# 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.

Côté système source, celui qui détient le jeu de référence, on utilise la commande aptitude-create-state-bundle et copie le fichier contenant la liste des paquets installés sur le système hôte.

# aptitude-create-state-bundle selections.bz2
# chown etu.etu selections.bz2
# exit
etu@vm:~$ logout
Connection to fe80::b8ad:caff:fefe:5%vlan5 closed
:~/vm$ $ scp etu@[fe80::b8ad:caff:fefe:5%vlan5]:~/selections.bz2 .
Warning: Permanently added 'fe80::b8ad:caff:fefe:5%vlan5' (ECDSA) to the list of known hosts.
etu@fe80::b8ad:caff:fefe:5%vlan5's password: 
selections.bz2                  100%   30MB  30.4MB/s   00:01

Côté système cible, 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$ scp selections.bz2 etu@[fe80::b8ad:caff:fefe:0%vlan214]:~
Warning: Permanently added 'fe80::b8ad:caff:fefe:0%vlan214' (ECDSA) to the list of known hosts.
etu@fe80::b8ad:caff:fefe:0%vlan214's password: 
selections.bz2                  100%   30MB  30.4MB/s   00:00
:~/vm$ ssh etu@fe80::b8ad:caff:fefe:0%vlan214
Warning: Permanently added 'fe80::b8ad:caff:fefe:0%vlan214' (ECDSA) to the list of known hosts.
etu@fe80::b8ad:caff:fefe:0%vlan214's password:

etu@vm:~$ su
Mot de passe :
vm:/home/etu# aptitude-run-state-bundle selections.bz2

Paramétrage de la console

Que l'on accède à une instance de système virtualisé via une connexion SSH ou via un écran distant avec le protocole SPICE, 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.

keyboard-configuration, console-setup

Le paquet keyboard-configuration permet de gérer les codes de touches clavier et les jeux de caractères. La reconfiguration du paquet avec la commande # dpkg-reconfigure keyboard-configuration permet de passer en revue et de modifier les options relatives aux dispositions de claviers.

Le paquet console-setup permet de paramétrer la configuration du clavier et de la police pour la console du système.

spice-vdagent

Dans le cas où l'on accède à un écran graphique de système virtualisé via le protocole SPICE, il est possible de «partager» les actions à la souris entre l'interface graphique du système local et du système virtuel. Cet outil permet aussi le redimensionnement dynamique de l'écran du système virtuel en fonction de la résolution de l'écran du système local.

Configuration graphique

La gestion de l'interface graphique d'une instance de système virtualisé est en constante sur les hyperviseurs disponibles avec le noyau Linux. Dans ce document, on se réfère au protocole SPICE et au contrôleur graphique virtuel QXL.

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. Cette émulation doit être en mesure de traiter tous les appels aux bibliothèques graphiques effectués par les différents gestionnaire d'interface utilisateur. La tâche est donc particulièrement ardue.

Les scripts utilisés pour la rédaction de ce guide désignent le contrôleur QXL comme GPU. Voici quelques éléments d'identification.

$ lspci | grep VGA
00:01.0 VGA compatible controller: Red Hat, Inc. Device 0100 (rev 04)

Malheureusement, la version stable Wheezy ne dispose pas du paquet de pilotage de GPU émulé. Le suuport des fonctions graphiques est donc moins performant. En revanche, la version testing contient bien le paquet xserver-xorg-video-qxl.

  • Extrait du journal d'initialisation du serveur graphique sur la distribution stable Wheezy.

    # grep -i qxl /var/log/Xorg.0.log
    [    10.785] (==) Matched qxl as autoconfigured driver 0
    [    10.785] (II) LoadModule: "qxl"
    [    10.848] (WW) Warning, couldn't open module qxl
    [    10.848] (II) UnloadModule: "qxl"
    [    10.848] (II) Unloading qxl
    [    10.848] (EE) Failed to load module "qxl" (module does not exist, 0)
  • Extrait du journal d'initialisation du serveur graphique sur la distribution testing Jessie.

    # grep -i qxl /var/log/Xorg.0.log
    [    13.206] (==) Matched qxl as autoconfigured driver 0
    [    13.206] (II) LoadModule: "qxl"
    [    13.230] (II) Loading /usr/lib/xorg/modules/drivers/qxl_drv.so
    [    13.240] (II) Module qxl: vendor="X.Org Foundation"
    [    13.252] (II) qxl: Driver for QXL virtual graphics: QXL 1
    [    13.302] (II) qxl(0): Creating default Display subsection in Screen section
    [    13.302] (==) qxl(0): Depth 24, (--) framebuffer bpp 32
    [    13.302] (==) qxl(0): RGB weight 888
    [    13.302] (==) qxl(0): Default visual is TrueColor
    [    13.302] (==) qxl(0): Using gamma correction (1.0, 1.0, 1.0)
    [    13.302] (II) qxl(0): Offscreen Surfaces: Enabled
    [    13.302] (II) qxl(0): Image Cache: Enabled
    [    13.302] (II) qxl(0): Fallback Cache: Enabled
    [    13.303] (II) qxl(0): framebuffer at 0x7f1d30471000 (16384 KB)
    [    13.303] (II) qxl(0): command ram at 0x7f1d31471000 (32760 KB)
    [    13.303] (II) qxl(0): vram at 0x7f1d2c471000 (65536 KB)
    [    13.303] (II) qxl(0): rom at 0x7f1d3852a000
    [    13.303] (II) qxl(0): Device version 0.0
    [    13.303] (II) qxl(0): Compression level 0, log level 0
    [    13.303] (II) qxl(0): 12286 io pages at 0x7f1d30471000
    [    13.303] (II) qxl(0): RAM header offset: 0x3ffe000
    [    13.303] (II) qxl(0): Correct RAM signature 41525851
    [    13.303] (II) qxl(0): 49144 KB of video RAM
    [    13.303] (II) qxl(0): 1024 surfaces

Copie d'écran de l'interface graphique sur une instance de machine virtuelle Debian/testing.

Système de fichiers ext4

Il est possible d'optimiser les accès au système de fichiers ext4 sur un système virtualisé. Dans la mesure où l'on n'accède pas à un véritable dispositif de stockage, certaines options de montage peuvent être modifiées. Voici un extrait de fichier /etc/fstab qui donne la liste des options de montage de la racine du système de fichiers.

etu@vm0:~$ grep ext4 /etc/fstab
/dev/mapper/vm0-root /  ext4   relatime,data=writeback,commit=6000,barrier=0,errors=remount-ro 0 1
relatime

Cette option assure le maintien des méta-données du système de fichiers relatives aux accès. L'enregistrement atime d'un fichier est écrit seulement si le le fichier a été modifié depuis la dernière mise à jour de cet enregistrement (mtime) ou si aucun accès au fichier n'a eu lieu pendant un certain temps.

data=writeback

Le séquencement des données n'est pas préservé. Les données peuvent être écrites dans le système de fichiers principal après que les méta-données aient été enregistrées dans le journal.

Pour activer cette option pour un système de fichiers particulier, la syntaxe est :

# tune2fs -o journal_data_writeback /dev/mapper/vm0-root 
tune2fs 1.42.9 (4-Feb-2014)

# tune2fs -l /dev/mapper/vm0-root | grep '^Default mount options:'
Default mount options:    journal_data_writeback
commit=6000

Cette option contrôle de la synchronisation des méta-données du système de fichiers toutes les 6000 secondes.

barrier=0

Cette option contrôle l'ordonnancement dans le cache du système de fichiers. Sur une machine virtuelle, il n'est pas nécessaire d'exercer un contrôle à ce niveau.

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'alerte 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.2.*.

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