L'hyperviseur Xen sous Debian Wheezy
Prérequis
Ce tutoriel se base sur l'utilisation de debootstrap pour installer une base de système d'exploitation debian. La plupart des hébergeurs proposent un système de "rescue" permettant l'installation de debian par ce moyen.
Si vous ne disposez pas de mode rescue, vous pouvez toujours utiliser l'installeur proposé par votre hébergeur, ou encore passer par un kvm pour installer vous même le système avec l'iso de debian.
Pour les débutants
Si vous êtes débutant en administration linux, je vous conseil de sauvegarder quelque part les fichier suivant issu d'une précédente installation de debian:
- /etc/networks
- /etc/network/interfaces
- /etc/resolv.conf
- /etc/hosts
- /etc/fstab
- tout fichier de personnalisation de grub (/etc/grub.d/06_OVHkernel par exemple)
Partitionnement
Utilisez cfdisk ou fdisk à votre convenance.
Voici mon partitionnement :
- /dev/sda1 de 15Go (/)
- /dev/sda2 de 2Go (swap)
- /dev/sda3 pour le reste du disque en lvm
mkfs.ext4 /dev/sda1 mkswap /dev/sda2
Création du LVM
Nous allons maintenant créer notre architecture LVM puis le système de fichier de la dernière partition. Oui, mais pourquoi LVM ? Son principal atout pour moi est sa grande flexibilité vis a vis de redimensionnement. La ou le redimensionnement d'une partition peut être dangereux, sous LVM, le risque est très faible. De plus, si vous utilisez plusieurs disques, LVM peut vous permettre d'étaler vos volumes logiques sur plusieurs disques (attention, ça n'aura rien à voir avec un raid ... naméoh).
Pour commencer, créez le volume physique :
$ pvcreate /dev/sda3 Physical volume "/dev/sda3" successfully created
Créez ensuite le groupe data :
$ vgcreate main /dev/sda3 Volume group "main" successfully created
Si vous possédez plusieurs partitions/disques, ajoutez les à la suite de /dev/sda3 en les séparant par des espaces.
Vous pouvez vérifier les informations du groupe avec la commande vgdisplay:
$ vgdisplay -v main Using volume group(s) on command line Finding volume group "main" --- Volume group --- VG Name main System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 5 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size 915.63 GB PE Size 4.00 MB Total PE 234401 Alloc PE / Size 0 / 0 Free PE / Size 234401 / 915.63 GB VG UUID 1rA2sx-9Kf5-ji5Z-pEj1-o4vu-R080-JoP4Ys --- Physical volumes --- PV Name /dev/sda3 PV UUID 6PAMey-nGiG-1qqS-nrEZ-Bpey-qzJF-L1Ct1l PV Status allocatable Total PE / Free PE 234401 / 234401
Nous pouvons maintenant créer le volume logique data (utilisant tout l'espace disque) dans le groupe pve. Notez que la commande vgdisplay nous a permit d'identifier la dimension du volume (Total PE) que nous préciseront via l'argument -l :
$ lvcreate -l51200 -n data main Logical volume "data" created
Si vous le préférez vous pouvez aussi spécifier une taille en Gio. Par exemple :
$ lvcreate -L 200g -n data main
Vous pouvez vérifier les informations du volume avec la commande lvdisplay:
$ lvdisplay -v /dev/main/data Using logical volume(s) on command line --- Logical volume --- LV Name /dev/main/data VG Name main LV UUID BQ1JVv-k71y-L4YX-tMpA-klDk-7S4Y-nHB3Uj LV Write Access read/write LV Status available # open 0 LV Size 200.00 GB Current LE 51200 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
Vous noterez que je n'ai pas utilisé tout l'espace disque pour ce volume lvm. En effet, Xen permet de créer automatiquement des volumes logiques pour chaque VM que vous créerez.
Enfin, créez le système de fichier dans votre volume logique :
mkfs.ext4 /dev/main/data
Augmenter la taille du groupe
Si vous avez par exemple une partition /dev/sda4 que vous souhaitez ajouter à votre groupe lvm, rien de plus simple. On commence par créer le lvm sur la partition sda4 :
pvcreate /dev/sda4
Puis ajoutez ce nouveau lvm à votre groupe main :
vgextend main /dev/sda4
Augmenter la taille du volume logique
On commence par démonter le système de fichier (je n'aime pas manipuler à chaud)
umount /data
On vérifie le fs :
e2fsck -f /dev/main/data
On redimensionne le volume logique :
lvresize -L 80g /dev/main/data
Pensez quand même à spécifier une taille supérieure à la taille précédente du volume ... sinon vous allez perdre des données =)
Puis on redimensionne le système de fichier contenu dans le volume :
resize2fs /dev/main/data
On peut enfin remonter
mount /dev/main/data /data
Diminuer la taille du volume logique
Soon (tm)
Snapshot
Pour cérer un snapshot nommé "test" du volume /dev/main/data :
lvcreate -L 10g -s -n test /dev/main/data
Pour merger un snapshot "test" modifié vers son volume d'origine :
lvconvert --merge /dev/main/test
Installation du système de base
$ mount /dev/sda1 /mnt $ debootstrap --arch=amd64 squeeze /mnt ... I: Base system installed successfully
Configuration debian de base
Afin d'avoir accès au réseau et au matériel, montez /proc, /dev et /sys dans votre nouveau système puis chrootez y:
mount -o bind /proc /mnt/proc mount -o bind /dev /mnt/dev mount -o bind /sys /mnt/sys chroot /mnt
Editez le fichier /etc/apt/sources.list
:
deb http://ftp.fr.debian.org/debian squeeze main contrib non-free deb-src http://ftp.fr.debian.org/debian squeeze main contrib non-free #Sec deb http://security.debian.org/ squeeze/updates main contrib non-free deb-src http://security.debian.org/ squeeze/updates main contrib non-free #anciennement debian-volatile deb http://ftp.fr.debian.org/debian squeeze-updates main contrib non-free deb-src http://ftp.fr.debian.org/debian squeeze-updates main contrib non-free
Mettez les paquets à jour, puis installez les locales :
aptitude update aptitude safe-upgrade aptitude install locales dpkg-reconfigure locales aptitude install console-data dpkg-reconfigure console-data # from arch > french > latin9) tzselect dpkg-reconfigure tzdata mkdir /srv/vm
Configurez votre /etc/fstab
:
/dev/sda1 / ext4 errors=remount-ro 0 1 /dev/sda2 swap swap defaults 0 0 /dev/main/data /srv/vm ext4 defaults 1 2
Configurez /etc/network/interfaces
:
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 91.121.117.116 netmask 255.255.255.0 network 91.121.117.0 broadcast 91.121.117.255 gateway 91.121.117.254
Configurez votre fichier /etc/hosts
:
# Do not remove the following line, or various programs # that require network functionality will fail. 127.0.0.1 localhost.localdomain localhost 91.121.117.116 ks355113.kimsufi.com # The following lines are desirable for IPv6 capable hosts #(added automatically by netbase upgrade) ::1 ip6-localhost ip6-loopback feo0::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts
Configurez l'hostname de votre serveur :
echo xen > /etc/hostname echo xen > /etc/mailname
N'oubliez pas de configurer les dns (ceux de votre hébergeur dédié) :
nameserver 213.186.33.99
Nous allons commencer par installer un kernel debian classique afin de vérifier notre configuration
aptitude install linux-image-2.6-amd64 linux-headers-2.6-amd64
Puis installez le chargeur de démarrage grub
aptitude install grub-pc update-grub
Installez le serveur ssh ainsi que lvm2 puis changez le mot-de-passe root :
aptitude install lvm2 openssh-server passwd
Vous pouvez maintenant sortir de votre chroot et démonter le système de fichier
exit umount /mnt/sys umount /mnt/dev umount /mnt/proc umount /mnt
puis rebootez sur le disque dur.
Installation de Xen
aptitude install xen-hypervisor-amd64 linux-image-2.6-xen-amd64 linux-headers-2.6-xen-amd64 xen-utils-4.0 xen-tools bridge-utils
Désactivez les autres kernels ainsi que la recherche d'OS de grub :
mkdir /etc/grub.d.disabled mv /etc/grub.d/10_linux /etc/grub.d.disabled/ echo GRUB_DISABLE_OS_PROBER=true >> /etc/default/grub echo GRUB_CMDLINE_XEN_DEFAULT="" >> /etc/default/grub echo GRUB_CMDLINE_XEN="" >> /etc/default/grub update-grub
Vous pouvez redémarrer sur le kernel xen :
reboot
Configuration globale de Xen
Le fichier /etc/xen/xend-config.sxp
permet de configurer le démon xend.
Si vous possédez plusieurs processeurs ou coeurs, vous pouvez forcer le nombre de cpu utilisé par le dom0 avec la directive (dom0-cpus X) où X est un nombre. Pour que le dom0 utilise tous les processeurs disponibles, définissez X à 0.
C'est aussi dans ce fichier que vous pouvez configurer le serveur vnc de xen pour les installations HVM.
Vérifier la présence du fichier /etc/xen/scripts/hotplugpath.sh
. S'il n'existe pas, créez le :
touch /etc/xen/scripts/hotplugpath.sh
Configuration réseau
Bridge
Dans cette configuration, il est nécessaire d'avoir des IPFailOver disponibles ainsi que générer des adresses MAC pour vos VMs. Vos VMs seront ensuite directement accessible à partir du réseau internet.
Vérifier la présence des lignes suivantes dans /etc/xen/xend-config.sxp :
(vif-script vif-bridge) (network-script network-bridge)
Par défaut, xen utilisera l'interface eth0. Si vous souhaitez utiliser une autre interface réseau (eth1 par exemple) utilisez :
(vif-script vif-bridge) (network-script 'network-bridge netdev=eth1')
Par défaut depuis Xen 3.3, le bridge sera nommé eth0 et non plus xenbr0 (en fait, l'interface réseau physique devient peth0 tandis que eth0 devient un bridge). Vous pouvez vérifier cela avec brctl show
après vos modifications, redémarrez le démon xend :
/etc/init.d/xend restart
Note: il semble que OVH refuse le mode bridge, il faut donc passer par le mode route :
(network-script 'network-route netdev=eth0') (vif-script vif-route)
NAT
Dans cette configuration, il est nécessaire de créer un réseau local "interne" à xen. Les VMs auront une adresse ip à l'intérieur de ce réseau local, et ne deviendront accessibles depuis l'extérieur qu'après avoir ajouté une règle NAT sur le dom0
Il faut configurer les directives suivantes dans /etc/xen/xend-config.sxp
:
(network-script network-nat) (vif-script vif-nat)
Assurez vous bien sur que les autres directives (network-script
et (vif-script
sont commentées !
Puis redémarrez xend
/etc/init.d/xend restart
Configuration d'un serveur dns bind9 pour le dom0
http://wiki.csnu.org/index.php?title=Installation_et_configuration_de_bind9
Configuration d'un serveur smtp pour le dom0
Configuration de Xen-Tools pour créer automatiquement des machines virtuelles debian
Par défaut sous debian squeeze, le fichier /etc/xen-tools/xen-tools.conf
est adapté à la création de VMs debian squeeze.
Xen utilisera debootstrap pour créer des VMs vierges.
Si vous utilisez un LVM comme présenté ici, ajoutez la ligne suivante dans /etc/xen-tools/xen-tools.conf :
lvm = main
main étant le nom du groupe de votre lvm.
Configurez les informations réseaux de vos futurs VMs. Si vous êtes en bridge ou en route :
gateway = IP-du.dom0.254 netmask = 255.255.255.0 broadcast = IP-du.dom0.255
Si vous êtes en NAT :
gateway = 192.168.0.254 netmask = 255.255.255.0 broadcast = 192.168.0.255
Voici les options de configuration intéressante de xen-tools :
dist
: défini la distribution à installer par défaut.size
: défini la taille de l'image disque par défaut d'une VM.memory
: défini la quantité de mémoire vive alloué par défaut à une VMswap
: défini la taille du swap par défaut pour les VMsfs
: défini le système de fichier à utiliser pour les VMs. Généralement ext3 ou ext4.image
: défini s'il faut utiliser des images complètes (full
) ou a taille variable (sparse
) pour les VMs.install-method
: défini la méthode d'installation par défaut pour les VMs. Les choix possibles sont :debootstrap
rinse
rpmstrap
copy
: un dossier d'une installation précédente sera utilisé. Il est obligatoire de configurer la directiveinstall-source
et d'y préciser le chemin du dossier à utiliser.tar
: une archive tar d'une installation sera utilisé. Il est obligatoire de configurer la directiveinstall-source
et d'y préciser le chemin de l'archive tar à utiliser.
kernel
etinitrd
: spécifie le kernel que les VMs utiliseront. Par défaut, celui du dom0arch
: l'architecture à utiliser lors de la création des VMs (amd64 ou i386)mirror
: le miroir à utiliser pour debootstrap (par défaut, utilisation de celui configuré dans /etc/apt/sources.list)nameserver
: les serveurs de nom a configurer sur la VM. Vous pouvez en ajouter plusieurs en les séparant par un espace. Si la directive n'est pas spécifié, Xen réutilisera les serveurs du dom0.
Configuration des squelettes de VMs
Le dossier /etc/xen-tools/skel/
permet d'appliquer des modifications automatiquement après l'installation de la VM avec debootstrap.
Cela permet par exemple d'appliquer automatiquement des configurations à vos VMs.
Nous prendrons l'exemple du timezone et de la clé ssh root :
mkdir /etc/xen-tools/skel/etc/ chmod 655 /etc/xen-tools/skel/etc/ cp /etc/timezone /etc/xen-tools/skel/etc/ cp /etc/localtime /etc/xen-tools/skel/etc/ chmod 644 /etc/xen-tools/skel/etc/* mkdir -p /etc/xen-tools/skel/root/.ssh chmod -R 700 /etc/xen-tools/skel/root cp /root/.ssh/authorized_keys* /etc/xen-tools/skel/root/.ssh/ chmod 600 /etc/xen-tools/skel/root/.ssh/authorized_keys*
Ainsi, vos futurs VMs seront automatiquement configurées sous la même timezone que votre dom0
Création d'un système d'upgrade et de backup automatique des VMs
Pour commencer, créez :
- une clé ssh pour les upgrade
- une clé ssh pour les backups
- une clé ssh pour le login de l'utisateur root de votre dom0 vers les domU
mkdir /etc/xen-tools/ssh-keys ssh-keygen -t rsa -C "domU upgrade account key" -N "" -f /etc/xen-tools/ssh-keys/domU-upgrade-rsa ssh-keygen -t rsa -C "domU backup account key" -N "" -f /etc/xen-tools/ssh-keys/domU-backup-rsa ssh-keygen -t rsa -C "root@dom0" -N "" -f /root/.ssh/id_rsa
Créer le fichier /usr/bin/xen-aptitude
contenant :
#! /bin/bash case $1 in update|safe-upgrade) if [ $2 == "all" ]; then domU=`xm list | grep -v -e "Name" -e "Domain-0" | sed -e 's/^\([^ ]*\) .*$/\1/'` for dom in $domU; do echo "Running $1 for $dom" ssh -i /etc/xen-tools/ssh-keys/domU-upgrade-rsa root@$dom "sudo aptitude $1" done else if [ -z "$(xm list | grep $2)" ]; then echo "Error: $2 is not a valid domU" else echo "Running $1 for $2" ssh -i /etc/xen-tools/ssh-keys/domU-upgrade-rsa root@$2 "sudo aptitude $1" fi fi ;; *) echo "Error: $0 update|safe-upgrade all|domU" ;; esac
Si vous exécutez xen-aptitude update all
puis xen-aptitude safe-upgrade all
tous vos domU seront mis à jour.
Création d'un rôle personnalisé pour les VMs
Les rôles permettent d'exécuter des actions automatiquement lors de la création d'une VM.
Nous allons créer un rôle réalisant les actions suivantes :
- installation des paquets
locales
,ntp
,console-data
etdnsutils
- configuration des même locales que le dom0
- désactiver le login root par password
- transférer les différentes clés ssh public que nous avons créés précédemment
- ajout des routes dans le cas d'une installation en mode bridge
voici le script à ajouter dans /etc/xen-tools/role.d/main
:
#!/bin/sh # # This role installs sudo with host sudoers file. # prefix=$1 # # Source our common functions - this will let us install a Debian package. # if [ -e /usr/lib/xen-tools/common.sh ]; then . /usr/lib/xen-tools/common.sh else echo "Installation problem" fi # # Log our start # logMessage Script $0 starting # # Install some usefull packages # logMessage Script $0 setting up packages # # #installDebianPackage ${prefix} locales #already installed in debian-squeeze xen installDebianPackage ${prefix} ntp installDebianPackage ${prefix} console-data installDebianPackage ${prefix} console-common installDebianPackage ${prefix} dnsutils # # Copy dom0's file to domU. # logMessage Script $0 copying files from domU # # cp /etc/locale.gen ${prefix}/etc/ chmod 644 ${prefix}/etc/locale.gen chroot ${prefix} /usr/sbin/locale-gen cp /etc/default/locale ${prefix}/etc/default/ chmod 644 ${prefix}/etc/default/locale echo "AllowUsers root" >> /etc/ssh/sshd_config if [ ! -d ${prefix}/root/.ssh/ ]; then mkdir -p ${prefix}/root/.ssh chmod -R 700 ${prefix}/root fi #dom0=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | sed -e 's/^\([^ ]*\) .*$/\1/'` dom0=`cat /etc/hostname` if [ -f /etc/xen-tools/ssh-keys/domU-backup-rsa.pub ]; then echo from=\"$dom0\" `cat /etc/xen-tools/ssh-keys/domU-backup-rsa.pub` >> ${prefix}/root/.ssh/authorized_keys fi if [ -f /etc/xen-tools/ssh-keys/domU-upgrade-rsa.pub ]; then echo from=\"$dom0\" `cat /etc/xen-tools/ssh-keys/domU-upgrade-rsa.pub` >> ${prefix}/root/.ssh/authorized_keys fi if [ -f /root/.ssh/id_rsa.pub ]; then echo from=\"$dom0\" `cat /root/.ssh/id_rsa.pub` >> ${prefix}/root/.ssh/authorized_keys fi sed -i -e 's/PermitRootLogin yes/PermitRootLogin without-password/g' ${prefix}/etc/ssh/sshd_config # # network routes # LogMessage Script $0 Adding network routes # # gw=`cat /etc/xen-tools/xen-tools.conf | grep gateway | cut -f 2 -d "="` echo up route add -host $gw dev eth0 >> ${prefix}/etc/network/interfaces echo up route add default gw $gw >> ${prefix}/etc/network/interfaces # # Log our finish # logMessage Script $0 finished
N'oubliez pas de rendre ce fichier exécutable :
chmod +x /etc/xen-tools/main
Création de votre première VM
Maintenant que tout est configuré, il ne reste plus qu'à créer votre première VM.
Si vous êtes en mode nat, rien de plus simple :
xen-create-image --hostname vm1.domain.tld --ip <IP> --passwd --role main
Pour le mode bridge, il va falloir préciser l'adresse mac de la carte réseau (générée dans l'interface de votre hébergeur) :
xen-create-image --hostname vm1.domain.tld --ip <IP> --mac=AA:BB:CC:DD:EE:FF --passwd --role main
Voici un autre exemple plus complet détaillant la création d'une VM ubuntu
xen-create-image --debootstrap --dir=/home/xen --size=10Gb --memory=512Mb --fs=ext3 \ --dist=natty --hostname=vm1.domain.tld --ip=<IP> --netmask=255.255.255.0 --swap=1024Mb \ --arch=amd64 --kernel=/boot/vmlinuz-2.6.32.5-xen-amd64 --mirror=http://archive.ubuntu.com/ubuntu/ --passwd --role main
Si vous êtes en NAT, <IP> sera par exemple 192.168.0.X Si vous êtes en bridge, <IP> sera une ipfailover.
démarrage
Pour lancer la VM :
xm create /etc/xen/vm1.domain.tld.cfg
Vous pouvez obtenir la liste des VM lancés avec :
xm list
Pour vous connecter à votre VM : deux options :
- SSH
- la console xen avec
xm console vm1.domain.tld
Pour quitter la console xen tapez , ctrl altgr ]
Démarrage automatique des VMs
Créez en premier lieu le dossier /etc/xen/auto
:
mkdir /etc/xen/auto
Placez ensuite les fichiers de configuration des VMs que vous souhaitez voir démarrer automatiquement dans ce dossier.
Ajout d'un réseau interne
Nous allons voir comment créer un réseau interne sous Xen, c'est à dire, attaché à aucune interface réseau physique. L'intérêt est d'offrir un débit bien supérieur pour les communications entre les VMs.
Commencez par éditer le fichier /etc/network/interfaces
auto dummy0 iface dummy0 inet static address 172.16.16.1 broadcast 172.16.16.255 netmask 255.255.255.0
Puis activez l'interface :
ifup dummy0
Créez ensuite le fichier /etc/xen/scripts/my-network-bridge
contenant :
#!/bin/sh /etc/xen/scripts/network-bridge "$@" netdev=eth0 /etc/xen/scripts/network-bridge "$@" netdev=dummy0
Et rendez le exécutable :
chmod +x /etc/xen/scripts/my-network-bridge
Enfin, il va falloir modifier la configuration de xend dans /etc/xen/xend-config.sxp
. Remplacez la ligne (network-script
précédente par :
(network-script my-network-bridge)
Ce script aura comme conséquence :
- créer le bridge classique de xen (celui qui était lancé par
(network-script network-bridge)
- créer le bridge dummy0 pour notre interface interne
Il faut ensuite relancer xend :
/etc/init.d/xend restart
Il ne reste plus qu'a modifier le fichier de configuration des VMs.
Par exemple pour la vm vm1.domain.tld
éditez le fichier /etc/xen/vm1.domain.tld.cfg
. Modifiez la ligne vif
de cette manière :
vif = [ 'ip=192.168.0.1,bridge=eth0,mac=00:16:3E:A3:F1:5A','ip=172.16.16.2,bridge=dummy0,mac=00:16:3E:A3:F1:07' ]
Après redémarrage, la VM aura désormais deux interfaces réseaux :
- eth0 bridgé sur l'interface eth0 du dom0 (le réseau public)
- eth1 bridge sur l'interface dummy0 du dom0 (le réseau interne)
Si votre VM est sous debian, il faudra ajouter la configuration de eth1 dans /etc/network/interfaces
(sur la vm!) :
auto eth1 iface eth1 inet static address 172.16.16.2 netmask 255.255.255.0
issue
Erreurs du type IPv6 addrconf: prefix with wrong length 56
Désactivez l'autoconfiguration ipv6 : créez un fichier /etc/sysctl.d/ip6.conf :
net.ipv6.conf.all.autoconf = 0 net.ipv6.conf.default.autoconf = 0 net.ipv6.conf.lo.autoconf = 0 net.ipv6.conf.peth0.autoconf = 0 net.ipv6.conf.eth0.autoconf = 0