Rapport d'installation de l'hyperviseur libvirt

  • Date
  • 2012/09/06
  • Utilisation du paquet debian-installer-6.0-netboot-amd64 version 20110106.squeeze4.b1 pour démarrer l'install en TFTP

Prérequis

  • Trouver un nom à la machine
    • Utile pour l'identification lors de l'inventaire, etc.
  • Trouver un adressage
    • Afin de lui trouver une « place » dans le réseau

Réseau

Il faut d'abord préparer la configuration réseau qu'aura chaque hyperviseur :

  • Réserver une/des IPv4 + IPv6
  • Configurer le switch pour que la machine soit sur le(s) VLAN adéquat
  • Configuration DNS et gateway par défaut

Spécifique à chaque machine

Dell R610

A besoin d'un firmware spécifique pour la carte réseau (Broadcom NetXtreme II) contenu dans le paquet firmware-bnx2, disponible dans non-free, à cette adresse par exemple : http://ftp.fr.debian.org/debian/pool/non-free/f/firmware-nonfree/firmware-bnx2_0.28+squeeze1_all.deb

Le mettre sur une clé USB, ou alors utiliser la méthode décrite ici pour l'ajouter à l'initrd : http://wiki.debian.org/DebianInstaller/NetbootFirmware

'''ATTENTION''' bien retirer la clé ''juste'' après que les interfaces réseau aient été détectées, afin qu'elle ne perturbe pas l'ordre de détection des disques. Ça ne pose pas de problème pour Linux qui utilise maintenant des UUID, mais c'est important pour GRUB, qui va s'installer sur le premier disque trouvé. Si vous ne l'avez pas fait, rebootez en mode « rescue », montez la racine puis le /boot, adaptez le /boot/grub/grub.cfg si besoin, et lancez :

# grub-install /dev/sdX

Configuration de l'installeur

Commencer l'installation par le réseau.

Rentrer le nom, le domaine (?).

Ne pas mettre de mot de passe root, ainsi sudo sera utilisé et se logger en root sera interdit.

Partitionnement manuel :

  • Le RAID est géré par le contrôleur hard
  • Créer une partition primaire de 1Go en ext2 pour /boot
  • Créer un volume physique (partition primaire) pour LVM de 20Go
  • Éventuellement créer un volume physique pour LVM sur le reste
  • Créer un groupe de volumes sur le premier PV, qui sera le VG du système (donc avec le nom « system » c'est pas mal)
  • Créer un volume logique dessus pour /
  • Éventuellement séparer /var (genre 10Go/10Go)
  • Ne ''pas'' mettre de swap (un avertissement ultérieur demandera explicitement de confirmer que vous ne voulez vraiment pas de swap), ou alors en mettre met préciser plus tard au kernel de ne l'utiliser qu'en dernier recours
  • Mettre / (et éventuellement /var) sur les LV correspondant, en ext3
  • Si on utilise un /var séparé, prévoir une taille conséquente pour le stockage de la RAM des VMs qui seront mises en pause sur le disque, par exemple 1,5× le volume de RAM minimum

Lors de la sélection des packages, choisir « Serveur SSH » et « Utilitaires standard du système »

Faire attention à l'installation de GRUB si c'est bien sur le bon périphérique qu'il est installé ; une clé USB peut faire changer l'ordre des périphériques par rapport à un boot « normal ».

Après l'installation

Mettre un getty sur le port série, toujours utile pour dépanner. Décommenter/ajouter la ligne suivante dans /etc/inittab :

T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100

Pour recharger la configuration :
# telinit q

Administration de base

Afin de garder l'hyperviseur à l'heure, il faut installer un démon NTP :

# apt-get install ntp

Notez qu'il n'est pas nécessaire, voire néfaste, d'installer un tel démon sur les machines virtuelles : elles n'ont pas de référence assez précise au niveau CPU (qui est virtualisé) pour calculer la dérive de l'horloge « temps réel ». On doit plutôt utiliser un OS qui a un pilote pour le périphérique d'horloge « exacte » qu'exporte l'hyperviseur à l'invité.

Pour des raisons de sécurité, il est mieux de désactiver l'authentification SSH par mot de passe. Pour cela, ajouter dans /etc/ssh/sshd_config la ligne :

PasswordAuthentication no

(commenter PasswordAuthentication yes ne suffit pas !)

Si vous avez mis du swap lors du partitionnement, vous devez indiquer au kernel de ne l'utiliser qu'au minimum. Pour cela, nous allons ajouter à /etc/sysctl.d/local.conf (par exemple) :

# bcama: set swap usage to the minimum; it's just here in case of emergency
vm.swappiness=0

Profitez-en pour activer les sysrq, qui peuvent aider en cas d'urgence si la machine « déconne » ; attention, ces commandes autorisent des choses dangereuses à qui contrôle le clavier local de la machine, comme un reboot immédiat par exemple (Alt+PrintScreen+b ; voir Documentation/sysrq.txt pour les autres) :
# bcama: allow sysrq
kernel.sysrq=1

Et l'activer :
# service procps restart

Installation de libvirt

On utilise le libvirt de squeeze-backports, la version d'origine de squeeze étant un peu vieille. Pour cela, on ajoute d'abord le repository de backports dans le fichier /etc/apt/sources.list.d/squeeze-backports.list qui contient :

deb http://backports.debian.org/debian-backports squeeze-backports main

Puis on installe libvirt :
# apt-get install -t squeeze-backports libvirt0 libvirt-bin

Il faut également ajouter les utilisateurs qui voudront avoir accès y l'hyperviseur au groupe libvirt :
# adduser un_utilisateur libvirt

On peut également installer virtinst, qui contient quelques utilitaires pratique pour l'installation de VM :
# apt-get install --no-install-recommends virtinst
# apt-git install pm-utils

(nous n'installons pas les paquets recommandées car ils ont trop de dépendances inutiles ; et pm-utils est une dépendance non-indiquée dans les vieux paquets libvirt)

Configuration de libvirt

On va configurer deux réseaux : un NATé et un bridgé, en fonction du type de connectivité qu'on souhaite pour les VMs.

Pour définir le réseau NATé, on utilise le XML suivant avec la commande virsh
net-define :

<network>
  <name>routed-nat</name>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254' />
    </dhcp>
  </ip>
</network>

Et pour le bridgé (ça serait mieux d'utiliser macvtap mais ça n'est pas disponible sur squeeze) :
<network>
  <name>bridged</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
</network>

Qui utilisera br0 configuré comme suit dans /etc/network/interfaces (après avoir commenté/effacé la configuration pour eth0) :
allow-hotplug br0
iface br0 inet dhcp
    bridge_ports    eth0

Nous allons également les démarrer automatiquement au démarrage de la machine :
$ virsh net-autostart routed-nat
$ virsh net-autostart bridged

Pour le stockage, nous créons un volume group LVM dédié aux VMs :
# vgcreate vm-group /dev/sda3

Et le pool libvirt associé, avec virsh pool-define :
<pool type='logical'>
    <name>vm</name>
    <source>
        <name>vm-group</name>
        <device path='/dev/sda3' />
    </source>
    <target>
        <path>/dev/vm-group</path>
    </target>
</pool>

On peut également faire un pool réservé aux images qui peuvent être « creuses », et donc mieux stockées dessus :
<pool type='dir'>
    <name>images</name>
    <target>
        <path>/var/lib/libvirt/images</path>
        <permissions>
            <mode>0700</mode>
        </permissions>
    </target>
</pool>

Ces deux pools seront automatiquement démarrés :
$ virsh pool-autostart vm
$ virsh pool-autostart images

Nous pouvons aussi indiquer que nous souhaitons suspendre les machines lors de l'arrêt de l'hyperviseur, et les redémarrer automatiquement à son démarrage, en indiquant dans /etc/default/libvirt-guests les options suivantes :
URIS=qemu:///system
ON_BOOT=start # toutes les machines allumées à l'extinction sont redémarrées
ON_SHUTDOWN=suspend

Configuration du SAN iSCSI

On configure d'abord le VLAN utilisé par le SAN, en ajoutant dans /etc/network/interfaces le paragraphe suivant :

auto eth0.501
iface eth0.501 inet static
    address 10.35.21.66
    netmask 255.255.255.0

On installe le paquet adéquat :
# apt-get install open-iscsi

Le nom de l'initiateur est créé lors du premier démarrage du démon ; il sert parfois pour l'authentification auprès d'une cible, et se trouve dans /etc/iscsi/initiatorname.iscsi. On démarre le démon :
# invoke-rc.d open-iscsi start

On découvre et active le login automatique sur la cible :
# iscsi_discovery 10.35.21.1

Si certains “portals” ne sont pas disponibles, on peut arrêter la recherche avec Ctrl+C. Pour effectuer le login sur tous à la main, plutôt :
# iscsiadm -m node -p 10.35.21.1 --loginall=all

Et pour se délogger à la main :
# iscsiadm -m node -p 10.35.21.1 --logoutall=all

Pour que le “montage” soit automatique au démarrage (i.e. que le démon démarre automatiquement), il faut l'indiquer ainsi :
# iscsiadm -m node -p 10.35.21.1 -o update -n node.startup -v automatic

Nous utilisons également le multipath pour atteindre cette cible ; pour le gérer, nous installons le démon adéquat :
# apt-get install multipath-tools

Pour notre utilisation du multipath, un module noyau non-chargé automatiquement est nécessaire. Nous l'ajoutons au fichier /etc/modprobe.d/iscsi-rdac.conf afin qu'il soit chargé au démarrage :
# bcama: needed module for multipath iSCSI failed-path detection
scsi_dh_rdac

Et utilisons un fichier de configuration basique, dans /etc/multipath.conf :
defaults {
    user_friendly_names yes
}

blacklist {
    &quot;*&quot;
    # do not use the local disk
    devnode &quot;sda&quot;
    # get wwid with /lib/udev/scsi_id --whitelisted /dev/sda
    wwid …
}

multipaths {
    multipath {
        # wwid of the iSCSI volume
        wwid …
        alias my-fancy-volume
    }
}

Nous rechargeons la configuration :
# invoke-rc.d multipath-tools reload

Et vérifions que ça marche :
# multipath -l

Pour le désactiver, si besoin, il faut utiliser le flag `-f`:
# multipath -f /dev/mapper/my-fancy-volume

Nous créons ensuite une partition sur ce volume ; pour les volumes de plus de 2To, il faut utiliser un partitionnement de type GPT, géré par l'utilitaire gdisk :
# apt-get install gdisk
# gdisk /dev/mapper/my-fancy-volume
## do the partitionning

On utilisera ensuite cette partition comme volume physique LVM :
# pvcreate /dev/mapper/my-fancy-volume-part1

Qui sera ajouté à un groupe de volume :
# vgcreate my-fancy-group /dev/mapper/my-fancy-volume-part1

Pour éviter que LVM ne détecte à la fois les volumes « directs » et le volume multipath, on lui précise de ne pas utiliser certains périphériques bloc, dans /etc/lvm/lvm.conf, par exemple :
# bcama: we discard every /dev/sd* except /dev/sda, as this is how iSCSI
# devices appears, and we handle them with multipath
filter = [ &quot;a/.*/&quot;, &quot;r|/dev/sd[^a]|&quot; ]

Pour l'ajouter à libvirt, nous utilisons le XML suivant :
&lt;pool type='logical'&gt;
    &lt;name&gt;iscsi-disi-rsm&lt;/name&gt;
    &lt;source&gt;
        &lt;device path='/dev/mapper/disi-rsm-vol-part1' /&gt;
    &lt;/source&gt;
    &lt;target&gt;
        &lt;path&gt;/dev/iscsi-disi-rsm&lt;/path&gt;
    &lt;/target&gt;
&lt;/pool&gt;

Et nous l'indiquons comme actif au démarrage :
$ virsh pool-autostart iscsi-disi-rsrm
$ # pour le démarrer maintenant :
$ virsh pool-start iscsi-disi-rsm

Configuration complémentaire

Accounting de la mémoire / du CPU

Afin d'activer diverses options d'accounting pour les VM, il est utile d'utiliser les cgroup. Pour cela, il faut monter ce FS spécial dans /cgroup, en créant d'abord ce répertoire :

# mkdir /cgroup

Puis en ajoutant une entrée dans /etc/fstab :
cgroup        /cgroup cgroup  cpuacct,memory,devices,cpu,freezer,blkio        0       0

Attention, le cgroup memory n'est pas activé par défaut dans le kernel 3.2 que nous utilisons, car il provoque une légère dégradation de performances; si on veut l'utiliser, il faut passer le paramètre cgroup_enable=memory au kernel lors du boot. Pour cela, on modifie /etc/default/grub pour y modifier la ligne suivante :
GRUB_CMDLINE_LINUX_DEFAULT=&quot;cgroup_enable=memory quiet&quot;

Et on exécute update-grub afin de prendre en compte ce paramètre. Un redémarrage est nécessaire afin de prendre en compte ces modifications.

Optimisation de l'utilisation mémoire

Une option existe depuis le kernel 2.6.38 qui permet de regrouper les pages mémoire identiques des VMs : le Kernel Samepage Merging. Pour l'activer, il faut écrire “1” dans /sys/kernel/mm/ksm/on, par exemple dans /etc/rc.local :

echo 1 &gt; /sys/kernel/mm/ksm/run

On peut aussi, si l'application le supporte (ce qui est le cas de KVM) utiliser les “huge pages”, qui permettent de réduire la pression sur le TLB. Pour cela, il faut d'abord monter un système de fichiers spécial :
# mkdir /dev/hugepages
# mount -t hugetlbfs hugetlbfs /dev/hugepages  

Puis indiquer à l'OS combien de ces pages il peut allour ; attention, la mémoire réservée pour les hugepages n'est ''pas'' allouable par l'OS pour des pages classiques, et ne sera donc pas disponible même si elle n'est pas allouée :
# sysctl vm.nr_hugepages=2048

La taille des pages est de 2MiB sur x86_64. Il faut ensuite indiquer dans les guests concernés qu'on souhaite les utiliser :
&lt;domain&gt;
…
  &lt;memoryBacking&gt;
    &lt;hugepages/&gt;
  &lt;/memoryBacking&gt;

Attention : cette fonctionnalité désactive la possibilité de swapper la VM, et également le “memory ballooning”.

Optimisation des interruptions

Par défaut, beaucoup d'interruptions sont gérées par le premier cœur du CPU. Pour améliorer les performances sur une machine multi-cœur, on peut les répartir à l'aide de irqbalance. Il faut juste l'installer, il ne demande pas de configuration spécifique :

# apt-get install irqbalance

Installation des utilitaires de gestion RAID

La carte RAID PERC6/i peut être monitorée par un utilitaire spécifique, libre, megactl. Il existe un dépôt Debian d'outils des outils qui fonctionnent avec ces cartes : http://hwraid.le-vert.net/wiki/DebianPackages

Pour l'installer, il faut ajouter un dépôt, dans /etc/apt/sources.list.d/hwraid-le-vert.list par exemple, contenant :

deb http://hwraid.le-vert.net/debian wheezy main

Il faut également ajouter la clé du mainteneur dans notre base de clés de confiance :
$ wget -O - http://hwraid.le-vert.net/debian/hwraid.le-vert.net.gpg.key | sudo apt-key add -

Puis on peut installer l'outil megasasctl :
# apt-get install megactl

Qui se lance simplement avec :
# megasasctl

Si on veut modifier la configuration de la carte, il faut utiliser l'outil propriétaire megacli :
# apt-get install megacli

L'outil a une syntaxe particulière, on peut trouver s'aider de cette cheatsheet : <http://tools.rapidsoft.de/perc/perc-cheat-sheet.pdf&gt;.

Optimisation des Entrées/Sorties

Par défaut, les Linux modernes utilisent cfq comme scheduler d'I/O. Selon les recommendations d'IBM <http://www-01.ibm.com/support/knowledgecenter/api/content/linuxonibm/liaat/liaatbestpractices_pdf.pdf&gt;, il vaut mieux utiliser deadline. On peut l'activer par exemple dans /etc/rc.local :

echo deadline &gt; /sys/block/sdb/queue/scheduler
echo deadline &gt; /sys/block/sdc/queue/scheduler
echo deadline &gt; /sys/block/$(readlink /dev/mapper/disi-rsm-vol | cut -d/ -f2)/queue/scheduler