9 Feb 2016

Debian en tant qu'hyperviseur QEMU/KVM et LXC

Ce guide à pour objectif de vous expliquer comment installer un hyperviseur complet sous Debian Jessie. C’est l’équivalent d’un serveur Hyper-V ou VMware ESX.

Voici les fonctionnalités supportées

  • Interface d’administration Web des machines virtuelles permettant de les créer ou de les démarrer.
  • Possibilité de faire des snapshots à froid avec l’interface d’administration.
  • Possibilité de faire des snapshot à chaud pour les sauvegardes.
  • Support de la majorité des systèmes d’exploitations invités.
  • QEMU/KVM permet l’émulation d’une machine virtuelle complète et permet l’installation de presque n’importe quel système d’exploitation invité.
  • LXC permet de faire de la paravirtualisation. Ce mode est très économe en ressource, mais ne permet d’utiliser que certaines distributions GNU/Linux invité.

Matériel recommandé

Il faudra bien entendu un processeur supportant la virtualisation (Intel VT ou AMD-V). Il est également possible de virtualiser avec certains processeurs ARM ou PowerPC. Plus d’information :

http://www.linux-kvm.org/page/Processor_support

La mémoire vive est également très importante, minimum 4 Go ou plus suivant le nombre de machines que vous prévoyez de faire fonctionner. Enfin prévoyez un disque dur externe pour les sauvegardes.

Installation de Debian

Effectuez une installation classique d’une Debian Jessie à l’aide d’une Netinstall par exemple. N’oubliez pas de partitionner votre disque avec LVM prenant le soin de laisser un peu de place dans votre pool LVM. Je suggère le schéma de partitionnement suivant.

Partition schema

L’espace libre dans le pool lvm servira à d’éventuel snapshot de la partition home dans le but de faire les sauvegardes. Cet espace devra pouvoir accueillir les données modifiées tout le long de votre sauvegarde.

Configuration du réseau

Lorsque votre système est installé, la première chose à faire est de configurer le réseau. En effet, si vous souhaitez accéder facilement à vos machines virtuelles depuis votre réseau comme s’il s’agissait d’une machine physique connectée sur votre switch, il faut configurer un bridge.

Vérifiez que vous ayez le paquet bridge-utils installé avec la commande suivante.

apt-get install bridge-utils

Modifiez le fichier /etc/network/interfaces commentez les lignes concernants votre carte réseau (dans notre cas eth0) et ajoutez les lignes suivantes.

auto br0
iface br0 inet static
    address 192.168.3.4
    netmask 255.255.255.0
    gateway 192.168.3.1
    bridge_ports eth0

Remplacez bien entendu eth0 par le nom de votre carte réseau. Relancez la configuration réseau (ne lancer pas cette commande depuis un SSH car vous risquez de vous couper l’herbe sous les pieds).

service networking restart

Activation de l’IP forwarding

Afin d’autoriser vos machines virtulles à communiquer avec le reste de votre réseau, vous devez autoriser votre serveur a transmettre les frames réseaux. Modifier le fichier /etc/sysctl.conf

nano /etc/sysctl.conf

Et décommentez ou ajoutez la ligne suivante.

net.ipv4.ip_forward=1

Validez les changements.

sysctl -p

N’oubliez pas d’autoriser cette même règle dans votre pare-feu si vous en avez installé un.

Installation des utilitaires pour la virtualisation

apt-get install kvm libvirt-bin sasl2-bin lxc libvirt-bin debootstrap cgroupfs-mount

Afin de pouvoir utiliser LXC avec libvirt-bin, il sera nécessaire d’ajouter un argument au démarrage de votre ordinateur.

nano /etc/default/grub

Et modifier la ligne GRUB_CMDLINE_LINUX_DEFAULT pour qu’elle ressemble à cette ci.

GRUB_CMDLINE_LINUX_DEFAULT="quiet cgroup_enable=memory swapaccount=1"

Actualisez le menu avec la commande

update-grub

Puis une fois n’est pas coutume, redémarrer votre système.

Installation du frontend webvirtmgr (avec des paquets tout prêt)

Pour ce tuto, j’ai préparé une version toute prête du paquet. On commence donc par installer le dépôt :

wget http://open.iabsis.com/iabsis.list -O /etc/apt/sources.list.d/iabsis.list

Ajoutez le certificat

wget http://open.iabsis.com/open.iabsis.com.asc -O- | apt-key add -

Rafraichissez la liste des paquets

apt-get update

Et installer tous les paquets en une seule fois

apt-get install supervisor webvirtmgr webvirtmgr-supervisor

Il vous sera demandé à l’installation un identifiant ainsi qu’un mot de passe. Ouvrez ensuite votre navigateur à l’adresse suivante :

http://ip_de_votre_serveur:8000

Configuration de votre serveur

Il est maintenant nécessaire de faire quelques petites configurations depuis l’interface d’administration de webvirtmgr.

Ajoutez votre propre serveur KEMU/QVM dans la liste :

  • Cliquez sur le buton Add connection
  • Cliquez sur l’onglet Local Socket
  • Tapez le nom de votre choix (ex: le nom de votre serveur)
  • Dans la liste Hypervisor type, choisissez QEMU.

Ajoutez aussi votre propre serveur LXC dans la liste :

  • Cliquez sur le buton Add connection
  • Cliquez sur l’onglet Local Socket
  • Tapez le nom de votre choix (ex: le nom de votre serveur)
  • Dans la liste Hypervisor type, choisissez LXC.

Désormais votre serveur devrais s’afficher comme connected dans la page Connections.

Configurer l’interface réseau :

  • Cliquez sur votre serveur pour ouvrir les détails.
  • Cliquez sur Networks
  • Supprimez les réseaux existants
  • Cliquez sur New network
  • Dans le champ Name tapez default
  • Dans le champ Type forwarding choisissez BRIDGE
  • Dans le champ Bridge Name tapez br0
  • Ne pas cocher Open vSwitch

Configurer votre stockage :

  • Cliquez sur Storages
  • Supprimez éventuellement les stockages prédéfinis
  • Cliquez sur New Storage
  • Choisissez l’onglet DIR.
  • Dans le champ Name tapez default
  • Dans le champ Path tapez /home/qemu

Le dossier doit exister sur le serveur, vous pouvez bien entendu changer ce chemin, mais gardez à l’idée que ce dossier dans être dans un volume du pool lvm. Pour créer un dossier en mode commande :

mkdir /home/qemu

Vous pouvez aussi créer un pool séparé pour vos fichiers iso

mkdir /home/iso

Puis ajouter un stockage comme précédemment mais en cliquant sur l’onget ISO.

Note concernant LVM : il est également possible d’ajouter directement le pool lvm créé pour avoir ainsi un volume par machine. Néanmoins je trouve que cette solution est plus contraignante pour des raisons techniques et surtout car le support thin provisionning n’est pas disponible dans ce mode.

Création de votre première machine virtuelle avec QEMU/KVM

La création de machine QEMU/KVM est très simple. Copiez bien entendu un ou plusieurs iso dans votre stockage /home/iso.

  • Cliquez sur le bouton New Instance
  • Choisissez un des profils et cliquez sur Create. Vous pouvez également créer vos profils personnalisés en cliquant sur New Flavor.
  • Donnez un nom à votre machine virtuelle. Je conseille à ce stage de mettre le même nom que le nom netbios que vous donnerez à votre machine.
  • Cliquez sur Create.

Votre machine virtuelle est maintenant créée, vous devez maintenant installer un système d’exploitation dessus.

  • Cliquez sur votre machine virtuelle si vous n’y êtes pas encore.
  • Cliquez sur l’onglet Settings
  • Cliquez (optionnel) sur le bouton Enable devant l’option Autostart.
  • Cliquez ensuite sur l’onglet Media
  • Sélectionnez l’iso dans l’option CDROM 1
  • Cliquez sur Connect

Cette action montera virtuellement l’iso comme si vous aviez placé le CD dans le lecteur de la machine. Nous allons maintenant démarrer la machine.

  • Cliquez maintenant sur l’onglet Power et sur le bouton Start

On souhaite maintenant afficher ce qui se passe sur machine.

  • Cliquez sur l’onglet Access
  • Cliquez sur le bouton Console

Ceci vous ouvrira un viewer VNC dans un popup. Vous pouvez maintenant interragir avec la machine comme si vous étiez dessus avec un clavier et une souris.

Installation d’un système Microsoft Windows

L’installation d’un Windows devrait fonctionner sans soucis particulier mis à part pour la détection du disque dur. Pour ce faire, il faudra certainement télécharger les pilotes VirtIO pour Windows.

  • Créez votre machine virtuelle avec la procédure ci-dessus. Décochez l’option VirtIO.
  • Lancer l’installation de votre Windows et suivez les étapes d’installation classiques.
  • De retour dans l’interface de webvirtmgr, retournez dans l’onglet Media et cliquez sur Disconnect.
  • Depuis votre console placez vous dans le dossier en tapant cd /home/iso
  • Télécharger l’ISO officiel contenant les drivers VirtIO avec wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
  • Sélectionnez le fichier ISO virtio-win.iso et cliquez sur Connect.
  • Depuis votre installation de Windows,

Création de votre première machine virtuelle avec LXC

La création d’une machine LXC consiste en gros à récupérer le contenu minimal d’un système GNU/Linux. Cette étape est faite facile grace à la commande suivante :

lxc-create --template download --name un_nom_au_choix

Choisissez un nom au choix représentant par exemple le rôle de votre machine. Le système vous affiche ensuite une liste des systèmes disponibles téléchargeables.

Setting up the GPG keyring
Downloading the image index

---
DIST	RELEASE	ARCH	VARIANT	BUILD
---
centos	6	amd64	default	20160218_02:16
centos	6	i386	default	20160218_02:16
centos	7	amd64	default	20160218_02:16
debian	jessie	amd64	default	20160217_22:42
debian	jessie	armel	default	20160111_22:42
debian	jessie	armhf	default	20160111_22:42
...
---

Distribution:
  • Tapez la distribution de votre choix, par exemple debian.
  • Tapez la version de la distribution, par exemple jessie.
  • Enfin choisissez l’architecture, par exemple amd64.

Ensuite il faudra patienter quelques minutes, en fonction de la vitesse de votre connexion Internet. LXC va récupérer automatiquement le contenu de votre système.

Note : le contenu de cette machine est stocké dans le dossier /var/lib/lxc/, vérifiez donc que cette partition possède suffisamment d’espace.

Je préfère cependant stocker mes machines virtuelles ailleurs, dans ce cas, n’hésitez pas à changer ce chemin en créant de préférence un lien symbolique.

mv /var/lib/lxc /home
ln -s /home/lxc /var/lib/lxc

Pour la suite du tuto, définisser le nom de l’hôte dans une variable afin de pouvoir copier et coller les commandes sans devoir les modifier:

lxchostname=<nom de votre machine>

Afin de gérer notre machine avec libvirtd, nous devons maintenant créer un fichier XML modèle.

cat > ~/template-lxc.xml << EOF
<domain type='lxc'>
  <name>HOSTNAME</name>
  <memory>128000</memory>
  <os>
	<type>exe</type>
	<init>/sbin/init</init>
  </os>
  <vcpu>1</vcpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
	<emulator>/usr/lib/libvirt/libvirt_lxc</emulator>
	<filesystem type='mount'>
	  <source dir='/var/lib/lxc/HOSTNAME/rootfs'/>
	  <target dir='/'/>
	</filesystem>
	<interface type='network'>
	  <source network='default'/>
	</interface>
	<console type='pty'/>
  </devices>
</domain>
EOF

Maintenant, créer un copie de ce fichier adaptée pour notre nouveau serveur. Assurez-vous de changer un_nom_au_choix par le vrai nom de votre machine virtuelle.

sed "s/HOSTNAME/${lxchostname}/g" ~/template-lxc.xml > ~/temp.xml

Importez maintenant votre machine dans votre hyperviseur et supprimer le fichier temporaire.

virsh -c lxc:// define ~/temp.xml
rm ~/temp.xml

Afin de corriger un petit bug bloquant le bon fonctionnement de la commande virsh -c lxc:// console ${lxchostname}, il faut supprimer des fichiers superflux dans le dossier systemd :

rm /var/lib/lxc/${lxchostname}/rootfs/etc/systemd/system/getty.target.wants/getty*

Il va falloir maintenant activer le compte root, créer un compte utilisateur et installer SSH.

mount --bind /dev /var/lib/lxc/${lxchostname}/rootfs/dev
mount --bind /proc /var/lib/lxc/${lxchostname}/rootfs/proc
cp /etc/resolv.conf /var/lib/lxc/${lxchostname}/rootfs/etc/resolv.conf
chroot /var/lib/lxc/${lxchostname}/rootfs/

Toutes les commandes que vous tapez s’effectueront désormais dans le contexte de la machine virtuelle

apt-get install ssh  #(ou yum install sous Centos, ou autre)
passwd root (pour définir le mot de passe root)
adduser *compte_de_votre_choix* (pour ajouter un compte utilisateur utile pour se connecter avec ssh)
exit (pour resortir)

N’oubliez pas de démonter les bind

umount /var/lib/lxc/${lxchostname}/rootfs/dev
umount /var/lib/lxc/${lxchostname}/rootfs/proc

Rendez-vous dans l’interface de Webvirtmgr pour démarrer ou modifier votre machine.

Félicitation, votre machine est désormais prête pour faire tourner des machines virtuelles.


Tags: