Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
linux:xen [2008/01/12 23:09]
ixce
linux:xen [2010/01/12 13:29] (current)
Line 1: Line 1:
 +====== Xen ======
  
 +===== Motivation =====
 +Lorsqu'​on est un peu courts en boxes (et qu'en empiler 4 sur le bureau n'est pas nécessairement l'​idéal en terme tant de bruit que de conso électrique,​ cablage toussa) j'ai écrit une procédure destinée à mettre en place une machine dédiée à la virtualisation.
 +
 +Le but final est de pouvoir mettre à disposition un OS rapidement, avec si possible des sélections de packages prédéfinies.
 +
 +===== Procédure d'​installation =====
 +Installer une sarge tout ce qu'il y a de plus classique puis updater en sid tout de suite le sources.list :
 +
 +<​code>​
 + deb http://​ftp2.fr.debian.org/​debian/​ sid main
 + ​deb-src http://​ftp2.fr.debian.org/​debian/​ sid main
 +</​code>​
 +puis faire :
 +
 +<​code>​
 + ​apt-get install xen-hypervisor-3.0-i386 xen-utils-3.0 iproute bridge-utils libc6-xen kernel-package debootstrap bridge-utils ​
 +</​code>​
 +ajouter :
 +<​code>​
 + title Xen 3.0 / XenLinux 2.6
 + ​kernel /​boot/​xen-3.0-i386.gz
 + ​module /​boot/​xen-linux-2.6.16-xen root=/​dev/​hda1 ro
 +</​code>​
 +après "### END DEBIAN AUTOMAGIC KERNELS LIST" dans /​boot/​grub/​menu.lst
 +
 +ensuite on va se builder un kernel kivabien (tm) à partir des sources vanilla. Prendre le [[http://​www.kernel.org/​pub/​linux/​kernel/​v2.6/​linux-2.6.16.tar.bz2|2.6.16]] et le patch [[https://​alioth.debian.org/​download.php/​1561/​linux-2.6.16-xen3.0.2-hg9629.patch.gz|ici]] puis :
 +<​code>​
 + tar -jxvf linux-2.6.16.tar.bz2
 + ​gunzip linux-2.6.16-xen3.0.2-hg9629.patch.gz
 + cp linux-2.6.16-xen3.0.2-hg9629.patch linux-2.6.16
 + cd linux-2.6.16
 + patch -p1 < linux-2.6.16-xen3.0.2-hg9629.patch
 + make menuconfig
 +</​code>​
 +Ensuite on génère le paquet debian convivial :
 +<​code>​
 + ​make-kpkg --append-to-version -xen kernel_image
 +</​code>​
 +Pendant que ça compile on peut aller matter [[http://​www.bashfr.org/?​sort=latest|les dernières quotes bashfr]]. On installe le noyau :
 +<​code>​
 + dpkg -i linux-xen0-2.6.16-xen_10.00.Custom_i386.deb
 +</​code>​
 +Rebooter sur le nouveau kernel, croiser les doigts :X (j'​oublie toujours une option)
 +
 +Normalement xend est lancé, il reste donc à créer les VMs
 +
 +On va utiliser le backend '​fichier'​ (il est aussi possible d'​utiliser une partition pour faire ça) :
 +<​code>​
 +dd if=/​dev/​zero of=/​srv/​domains/​VM.img bs=1M count=2000
 +mkfs.ext3 /​srv/​domains/​VM.img
 +</​code>​
 +(passer outre les protestations de mkfs parce que c'est un fichier)
 +<​code>​
 +mount -o loop /​srv/​domains/​VM.img /mnt/xen
 +</​code>​
 +Et on bootstrape une sarge :
 +
 +<​code>​
 +debootstrap sarge /mnt/xen ftp://​ftp2.fr.debian.org/​debian
 +</​code>​
 +
 +On lui donne le bon noyau :
 +<​code>​
 +cp linux-xen0-2.6.16-xen_10.00.Custom_i386.deb /​mnt/​xen/​root
 +</​code>​
 +Et hop ! chroot !
 +<​code>​
 +chroot /mnt/xen /bin/bash
 +</​code>​
 +**les commandes suivantes sont tapées _dans_ le chroot** (enfin après si vous voulez br0tcher la machine ça vous regarde hein)
 +On installe le nouveau kernel pour la VM
 +<​code>​
 +cd /root && dpkg -i linux-xen0-2.6.16-xen_10.00.Custom_i386.deb ​
 +</​code>​
 +Le minimum vital :
 +<​code>​
 +apt-setup
 +</​code>​
 +Choisir un mirroir pas trop loin, histoire de pas sentir que le link est roumain.
 +Ensuite :
 +<​code>​
 +apt-get install localeconf
 +</​code>​
 +Choisir les choix par défaut, à priori c'est bon (perso c'est en_US-ISO-8559-15)
 +Si il propose d'​upgrader la glibc, accepter.
 +
 +Ensuite on passe à la conf système basique :
 +
 +/etc/fstab :
 +<​code>​
 +/​dev/​hda1 ​      / ​              ​ext3 ​   defaults,​errors=remount-ro 0       1
 +</​code>​
 +/​etc/​hostname :
 +<​code>​
 +nom_de_la_vm
 +</​code>​
 +/​etc/​resolv.conf :
 +<​code>​
 +search votre domaine
 +nameserver 192.168.100.253
 +</​code>​
 +/​etc/​network/​interfaces :
 +<​code>​
 +auto lo
 +iface lo inet loopback
 +
 +auto eth0
 +iface eth0 inet static
 +        address 192.168.100.98
 +        netmask 255.255.255.0
 +        network 192.168.100.0
 +        broadcast 192.168.100.255
 +        gateway 192.168.100.253
 +</​code>​
 +J'ai recontré un problème avec les getty, voici comment j'ai fait mon /​etc/​inittab :
 +<​code>​
 +1:​2345:​respawn:/​sbin/​getty 38400 console
 +#​2:​23:​respawn:/​sbin/​getty 38400 tty2
 +#​3:​23:​respawn:/​sbin/​getty 38400 tty3
 +#​4:​23:​respawn:/​sbin/​getty 38400 tty4
 +#​5:​23:​respawn:/​sbin/​getty 38400 tty5
 +#​6:​23:​respawn:/​sbin/​getty 38400 tty6
 +</​code>​
 +(avec //console// à la place de //tty1//)
 +
 +Installer l'​indispensable SSH :
 +<​code>​
 +apt-get install ssh module-init-tools ​
 +</​code>​
 +Désactiver le tls
 +<​code>​
 +mv /lib/tls /​lib/​tls.disabled
 +</​code>​
 +Et un truc qui peut être utile :
 +<​code>​
 +passwd root
 +</​code>​
 +Et hop !
 +<​code>​
 +Ctrl-D
 +</​code>​
 +**fin de la partie dans le chroot**
 +
 +Maintenant on configure un peu le dom0 :
 +
 +/etc/xen/VM
 +<​code>​
 +# Kernel to use
 +kernel = "/​boot/​xen0-linux-2.6.16-xen"​
 +# Memory in megabytes
 +memory = 128
 +# Your domain'​s name
 +name = "​nom_de_la_vm"​
 +# Root device
 +root = "/​dev/​hda1 ro"
 +# Don't forget to specify your bridge correctly here
 +vif = [ '​mac=aa:​00:​00:​00:​00:​d2,​ bridge=br-xen'​ ]
 +# Disk
 +disk = [ '​file:/​srv/​domains/​VM.img,​hda1,​w'​ ]
 +</​code>​
 +
 +et le réseau (sur le dom0) : /​etc/​network/​interfaces
 +<​code>​
 +# The loopback network interface
 +auto lo
 +iface lo inet loopback
 +
 +# The primary network interface
 +auto eth0
 +iface eth0 inet static
 +        address 0.0.0.0
 +        netmask 0.0.0.0
 +
 +# the bridge for xen
 +auto br-xen
 +iface br-xen inet static
 +        address 192.168.100.134
 +        netmask 255.255.255.0
 +        gateway 192.168.100.253
 +        bridge_ports eth0
 +        bridge_maxwait 0
 +</​code>​
 +On reloade le réseau :
 +<​code>​
 +/​etc/​init.d/​networking restart
 +</​code>​
 +
 +===== Le moment que vous attendiez tous =====
 +
 +<​code>​
 +xm create -c VM
 +</​code>​
 +enjoy !
 +
 +===== Votre VM pendant la pause café =====
 +
 +Répéter la procédure peut être fastidieux, source d'​erreurs tout ça. Alors j'ai fait un petit script, histoire que ça s'​installe pendant la pause café.
 +<code bash>
 +#!/bin/bash
 +
 +default_place="/​srv/​domains/"​
 +
 +echo "Nom de la nouvelle VM :"
 +read name
 +
 +echo "IP de la nouvelle VM :"
 +read ip
 +
 +echo "​Gateway de la nouvelle VM:"
 +read gateway
 +
 +echo "​Adresse MAC de la nouvelle VM :"
 +read mac
 +
 +echo "​Taille de la nouvelle VM (Mb) :"
 +read size
 +
 +echo "​Mémoire de la nouvelle VM (Mb) :"
 +read ram
 +
 +echo "​Distribution à utiliser ? (sarge/​etch) :"
 +read version
 +
 +
 +echo "​Emplacement du package pour le kernel xen :"
 +read kernel
 +kernel_file=`basename ${kernel}`
 +
 +
 +echo "Point de montage de l'​image :"
 +read mount_point
 +
 +# Creation image
 +echo "​Creation de l'​image disque"​
 +dd if=/​dev/​zero of=${default_place}${name}.img bs=1M count=${size}
 +yes | mkfs.ext3 ${default_place}${name}.img
 +
 +# Montage
 +mount -o loop -t ext3 ${default_place}${name}.img ${mount_point}
 +
 +# Bootstrap
 +debootstrap ${version} ${mount_point} ftp://​ftp.fr.debian.org/​debian
 +
 +# Copie noyau
 +cp ${kernel} ${mount_point}/​root
 +
 +# Installation kernel
 +chroot ${mount_point} /​usr/​bin/​dpkg -i /​root/​${kernel_file}
 +
 +# choix du mirroir
 +chroot ${mount_point} apt-setup
 +
 +# Les locales
 +chroot ${mount_point} /​usr/​bin/​apt-get -y install localeconf
 +
 +## Les fichiers indispensables au système ##
 +# /etc/fstab
 +echo "/​dev/​hda1 ​      / ​              ​ext3 ​   defaults,​errors=remount-ro 0       ​1"​ > ${mount_point}/​etc/​fstab
 +
 +# /​etc/​hostname
 +echo "​${name}"​ > ${mount_point}/​etc/​hostname
 +
 +# /​etc/​resolv.conf
 +cp /​etc/​resolv.conf ${mount_point}/​etc/​resolv.conf
 +
 +# /​etc/​network/​interfaces
 +echo "auto lo" > /​tmp/​${name}.if.tmp
 +echo "iface lo inet loopback" ​ >> /​tmp/​${name}.if.tmp
 +echo "" ​  >>​ /​tmp/​${name}.if.tmp
 +echo "auto eth0" >> /​tmp/​${name}.if.tmp
 +echo "iface eth0 inet static" ​ >> /​tmp/​${name}.if.tmp
 +echo " ​       address ${ip}" ​ >> /​tmp/​${name}.if.tmp
 +echo " ​       netmask 255.255.255.0" ​ >> /​tmp/​${name}.if.tmp
 +echo " ​       #network " ​ >> /​tmp/​${name}.if.tmp
 +echo " ​       #broadcast " ​ >> /​tmp/​${name}.if.tmp
 +echo " ​       gateway ${gateway}" ​ >> /​tmp/​${name}.if.tmp
 +
 +cp /​tmp/​${name}.if.tmp ${mount_point}/​etc/​network/​interfaces
 +rm -f /​tmp/​${name}.if.tmp
 +
 +# /​etc/​inittab (un peu sale [tres] comme méthode)
 +cp /​etc/​inittab /​tmp/​${name}.inittab
 +
 +sed -e '​s/​tty1/​console/​g'​ /​tmp/​${name}.inittab > /​tmp/​${name}.inittab.2
 +sed -e '​s/​2:​23/#​2:​23/​g'​ /​tmp/​${name}.inittab.2 > /​tmp/​${name}.inittab
 +sed -e '​s/​3:​23/#​3:​23/​g'​ /​tmp/​${name}.inittab > /​tmp/​${name}.inittab.2
 +sed -e '​s/​4:​23/#​4:​23/​g'​ /​tmp/​${name}.inittab.2 > /​tmp/​${name}.inittab
 +sed -e '​s/​5:​23/#​5:​23/​g'​ /​tmp/​${name}.inittab > /​tmp/​${name}.inittab.2
 +sed -e '​s/​6:​23/#​6:​23/​g'​ /​tmp/​${name}.inittab.2 > /​tmp/​${name}.inittab
 +
 +cp /​tmp/​${name}.inittab ${mount_point}/​etc/​inittab
 +rm /​tmp/​${name}.inittab /​tmp/​${name}.inittab.2
 +
 +# ssh
 +chroot ${mount_point} /​usr/​bin/​apt-get -y install ssh module-init-tools
 +
 +# desactivation du TLS
 +mv ${mount_point}/​lib/​tls ${mount_point}/​lib/​tls.disabled
 +
 +# mot de passe root
 +echo "​Saisie du mot de passe root pour la VM ${name}:"​
 +chroot ${mount_point} /​usr/​bin/​passwd root
 +
 +# demontage
 +umount ${mount_point}
 +
 +# Creation du fichier de config de la VM
 +echo "​kernel = \"/​boot/​xen0-linux-2.6.16-xen\""​ > /​etc/​xen/​${name}
 +echo "​memory = ${ram}"​ >> /​etc/​xen/​${name}
 +echo "name = \"​${name}\""​ >> /​etc/​xen/​${name}
 +echo "root = \"/​dev/​hda1 ro\""​ >> /​etc/​xen/​${name}
 +echo "vif = [ '​mac=${mac},​ bridge=br-xen'​ ]" >> /​etc/​xen/​${name}
 +tmp_name=${default_place}${name}.img
 +echo "disk = [ '​file:​${tmp_name},​hda1,​w'​ ]" >> /​etc/​xen/​${name}
 +
 +echo "La VM est prête, lancez la avec :"
 +echo "xm create ${name}"​
 +</​code>​
 +
 +Les [[http://​www.steve.org.uk/​Software/​xen-tools/​|xen-tools]] font la même chose, en mieux, alors ne vous cassez pas la tête. Ce script a juste un but didactique
 +
 +
 +
 +===== Les erreurs cons =====
 +  * "​Error:​ Device 0 (vif) could not be connected"​ : il manque probablement le bridge indiqué dans la config de xen.
 +  * "​Error:​ Device 769 (vbd) could not be connected"​ : le module "​loop"​ n'est pas chargé, ou il n'y a plus de loop-devices de disponibles.
 +  * Si le dom0 ne boot pas (ou si l'​affichage console s'​arrête pendant 15/20 secondes jusqu'​au démarrage de X  par exemple) avec des histoires de "(XEN) Xen is relinquishing VGA console.",​ il faut rajouter un petit "​console=vga vga=keep"​ sur la ligne du kernel Xen (e.g kernel /​boot/​xen-3.1-i386.gz noreboot console=vga vga=keep) dans la conf grub, et tout devrait aller mieux.
 +
 +\\
 +
 +===== Sources principales =====
 +    * [[http://​julien.danjou.info/​xen.html]]
 +    * [[http://​www.howtoforge.com/​perfect_xen_setup_debian_ubuntu]]
 +    * [[http://​wiki.debian.org/​Xen]] : mises à jour de la procédure chez Debian
 +
 +===== Changelog =====
 +  * 24/05 : Création par __nico
 +  * 26/05 : Ajout du script de création facilitée
linux/xen.txt · Last modified: 2010/01/12 13:29 (external edit)