Utilisation de Xen

Installation de l’hyperviser Xen

Pour installer Xen, il faut lancer la commande suivante : apt install xen-hypervisor-4.4-amd64 xen-linux-system-amd64 xen-utils-4.4 xen-tools xenstore-utils

Ensuite, il faut modifier l’ordre des noyaux, afin que Linux boot sur le kernel Xen :

mv /etc/grub.d/10_linux /etc/grub.d/20_linux
mv /etc/grub.d/20_linux_xen /etc/grub.d/10_linux_xen

Lorsque c’est fait, il ne faut pas oublier de mettre à jour Grub2 : update-grub

Et, il faut redémarrer le serveur pour avoir le bon noyau de chargé : shutdown -r now

On modifie, ensuite, le fichier /etc/xen-tools/xen-tools.conf qui contient les options par défaut de création des machines virtuelles :

dir = /home/xen
install-method = debootstrap
size   = 20Gb      # Disk image size.
memory = 512Mb    # Memory size
swap   = 512Mb    # Swap size
fs     = ext3     # use the EXT3 filesystem for the disk image.
dist   = jessie     # Default distribution to install.
arch   = i386
image  = sparse   # Specify sparse vs. full disk images.
passwd = 1
kernel      = /boot/vmlinuz-`uname -r`
initrd      = /boot/initrd.img-`uname -r`
ext3_options   = noatime,nodiratime,errors=remount-ro
ext2_options   = noatime,nodiratime,errors=remount-ro
xfs_options    = defaults
reiser_options = defaults

Afin que l’hyperviseur Xen soit en mode route au lieu du mode bridge présent par défaut, il faut éditer le fichier /etc/xen/xl.conf pour ajouter les lignes suivantes :

vif.default.gatewaydev="eth0"
vif.default.script="/etc/xen/scripts/vif-route"

Il faut également configurer l’hyperviseur afin qu’il accepte le port forwarding : echo "1" > /proc/sys/net/ipv4/ip_forward.

Si on souhaite que cette modification soit conservée lors des redémarrages du serveur, il faut modifier le fichier /etc/sysctl.conf :

net.ipv4.ip_forward=1

Enfin, il faut ajouter la règle iptables qui permettra aux paquets sortant de l’hyperviseur via la machine virtuelle d’être marqués avec l’IP publique de l’hyperviseur (au lieu de l’IP de la VM) : iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE.

Si on ne souhaite pas modifier tous les paquets sortant de l’hyperviseur pour qu’ils aient cette IP publique (cas d’un IP alias, par exemple), il faut préciser quels sont les paquets qui seront consernés par ce MASQUERADING : iptables -t nat -A POSTROUTING -o eth0 -s IP_de_la_VM -j MASQUERADE.

Si le firewall bloque, par défaut, le traffic en forward avec la policy à DROP (pour la table filter), il faudra ajouter ces deux autres règles :

iptables -t filter -A FORWARD -s IP_de_la_VM -j ACCEPT
iptables -t filter -A FORWARD -d IP_de_la_VM -j ACCEPT

Utilisation de Xen

Pour créer une machine virtuelle, il faut lancer la commande xen-create-image --hostname=xen0.djeeks.com --ip=192.168.150.10.

Une fois la machine crée, il faut monter l’image de son disque afin d’y apporter quelques modifications avant de pouvoir démarrer. Pour cela, on crée le dossier où sera monté l’image disque via mkdir /mnt/xen, puis on lance la commande mount -o loop /home/xen/domains/xen0.djeeks.com/disk.img /mnt/xen.

On vérifie que l’on pourra bien se connecter en root via ssh dans /etc/ssh/sshd_config et que la carte ethernet est bien paramétrée dans /etc/network/interfaces.

Lorsque tout est ok, on peut démarrer la machine. Pour le premier lancement, on utilisera l’option -c qui affichera toute la séquence d’initialisation, afin de détecter les éventuelles erreurs : xl create -c /etc/xen/xen0.djeeks.com.cfg.

Lorsque le serveur est démarré, on peut également s’y connecter via SSH.

Utilisation de Xen et Qemu (HVM)

Qemu est utilisé pour la virtualisation des environnement qui ne sont pas présent nativement sous Xen et notamment de Windows. Pour mettre en place une VM Windows, il faut d’abord créer un bridge. Pour cela, il faut éditer le fichier /etc/network/interfaces et y ajouter les lignes suivantes :

auto bridge0
iface bridge0 inet static
		bridge-stp 0
		address 192.168.0.1
		network 192.168.0.0
		netmask 255.255.255.0
		broadcast 192.168.0.255

pre-up brctl addbr bridge0

Ensuite, on génère le fichier de configuration de la VM /etc/xen/vm_windows.cfg. Le ficghier doit contenir les lignes suivantes :

firmware_override = '/usr/lib/xen-4.4/boot/hvmloader'

builder = 'hvm'
vcpus = '4'
memory = '4096'

device_model_override = "/usr/bin/qemu-system-x86_64"

disk = [ 'phy:/dev/vg0/vm_windows,hda,w', 'file:/root/windows7_Ultimate_x64.iso,hdc:cdrom,r']

name = 'vm_windows'

vif = [ 'bridge=bridge0' ]

on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'

boot = 'dc'
acpi = '1'
apic = '1'
sdl = '0'

vnc = '1'
vnclisten = '127.0.0.1'
vncpasswd = 'mot_de_passe_vncviewer'

usbdevice = 'tablet'

viridian = 1
pae=1
xen_platform_pci=1

Le fichier de configuration étant déjà généré, il nous suffit de lancer la VM via la commande xl create /etc/xen/vm_windows.cfg

La ligne disk représente les disques virtuels. On notera que le premier est une partition LVM qu’il faut créer avant de générer la VM (contrairement aux VM Linux). Le second est l’image ISO qui nous servira à installer Windows (il s’agit d’un lecteur optique virtuel). La ligne boot définit l’ordre d’amorçage, ici d’abord le disque D:\ (le DVD d’installation) puis le C:. Lorsque l’installation est terminée, il faut exécuter les deux commandes ci-dessous :

ifconfig vif5.0-emu up
brctl addif bridge0 vif5.0-emu

Attention : Sous Debian Jessie, il est nécessaire d’exécuter ces deux commandes à chaque redémarrage de la VM Windows puisque l’interface vifX.0-emu change à chaque fois de numéro.

Afin de pouvoir utiliser les VM Windows, il est indispensable d’installer les outils suivants sur l’hyperviseur : apt install vncviewer xauth

Note : Bien penser à se connecter en SSH sur l’hyperviseur avec la redirection X11 et la compression (ssh -X -C) afin que vncviewer puisse être utilisé.

Autres commandes utiles

  • xl info : Affiche des infossur l’hyperviseur Xen (et permet de vérifier qu’on a bien booté sur le bon kernel avant de créer les machines)
  • xl list : Liste les machines virtuelles
  • xl shutdown xen0.djeeks.com : Arrêter proprement une machine virtuelle
  • xl destroy xen0.djeeks.com : Arrêter brutalement une machine virtuelle qui ne répond plus

Spécificités LVM

Si on souhaite installer ses machines virtuelles sur une partition LVM, il faut ajouter une option dans le fichier /etc/xen-tools/xen-tools.conf :

lvm = vg0

Si on souhaite ajouter d’autres partitions dans la VM, il faut modifier le fichier /etc/xen/xen0.djeeks.com.cfg pour ajouter une ligne dans la section :

disk        = [
				  'phy:/dev/vg0/xen0.djeeks.com-disk,xvda2,w',
				  'phy:/dev/vg0/xen0.djeeks.com-swap,xvda1,w',
			  ]