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 { "*" # do not use the local disk devnode "sda" # 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 = [ "a/.*/", "r|/dev/sd[^a]|" ]
Pour l'ajouter à libvirt, nous utilisons le XML suivant :
<pool type='logical'> <name>iscsi-disi-rsm</name> <source> <device path='/dev/mapper/disi-rsm-vol-part1' /> </source> <target> <path>/dev/iscsi-disi-rsm</path> </target> </pool>
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="cgroup_enable=memory quiet"
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 > /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 :
<domain> … <memoryBacking> <hugepages/> </memoryBacking>
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>.
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>, il vaut mieux utiliser deadline. On peut l'activer par exemple dans /etc/rc.local :
echo deadline > /sys/block/sdb/queue/scheduler echo deadline > /sys/block/sdc/queue/scheduler echo deadline > /sys/block/$(readlink /dev/mapper/disi-rsm-vol | cut -d/ -f2)/queue/scheduler