Démarrer une vm xen avec pygrub

 

Cela faisait un bout de temps que je voulais tester le démarrage de vms avec pygrub, mais j'avais jamais trop pris le temps de m'y attarder.

Sauf que la aujourd'hui j'en ai eu besoins. J'avais besoins de monter une machine virtuelle Ubuntu 9.10, et toutes mes tentatives avec mes procédures habituelles de déploiement se soldaient par un échec lors du démarrage, la vm s'arrêtait sur la ligne /scripts/init-bottom. Je penses à une incompatibilité de mon kernel du domU avec les dernières versions d'Ubuntu (jusqu'à la 9.04 pas de problèmes).

PyGrub permet à une VM Xen d'avoir son propre noyau indépendamment du noyau du dom0, et contenu dans son propre FS. On peut ainsi gérer les mises à jour du kernel de la vm sans ce soucier des mises à jour du kernel des autres vms qui elles démarrent avec le kernel fourni par le dom0.

PyGrub devrait déjà être installé, si vous avez suivi cet article : hyperviseur-xen-sur-une-debian-lenny, le path de pygrub est : /usr/lib/xen-3.2-1/bin/pygrub

Le plus simple est de récupérer une vm déjà préparée, je vous conseil de la récupérer à cette adresse : http://stacklet.com/downloads/images/ubuntu/9.10.

Dans le fichier récupéré on aura un fichier de démarrage et une image de la vm.

Toutes mes vms fonctionnent avec des backends lvm et non pas des fichiers, j'adapte donc comme ceci :

# lvcreate -L10G -n ubuntu910-disk xen_disk
# lvcreate -L1G -n ubuntu910-swap xen_disk
# mkfs.ext3 /dev/xen_disk/ubuntu910-disk
# mkswap /dev/xen_disk/ubuntu910-swap
# mount /dev/xen_disk/ubuntu-disk /mnt/tmp1
# mount -o loop /tmp/ubuntu.9-10.x86.img /mnt/tmp2
# rsync -a --progress /mnt/tmp2/ /mnt/tmp1/

Il faut ensuite adapter sur la vm les fichiers /etc/fstab et /boot/grub/menu.lst, voici les miens :

/etc/fstab
proc            /proc         proc     defaults                   0 0
devpts          /dev/pts      devpts   gid=5,mode=620             0 0
/dev/xvda1 none swap sw 0 0
/dev/xvda2 / ext3 noatime,nodiratime,errors=remount-ro 0 1

/boot/grub/menu.lst
default=0
timeout=10
title vmlinuz-2.6.31-302-ec2
root (hd0,0)
kernel /boot/vmlinuz-2.6.31-302-ec2 console=hvc0 root=/dev/xvda2 ro
initrd /boot/initrd.img-2.6.31-302-ec2

Pour finir le fichier de configuration pour démarrer la vm :

bootloader = "/usr/lib/xen-3.2-1/bin/pygrub"
memory      = '1024'
maxmem      = '2048'
root        = '/dev/xvda2 ro'
disk        = [
'phy:/dev/xen_disk/ubuntu-disk,xvda2,w',
'phy:/dev/xen_disk/ubuntu-swap,xvda1,w',
 ]
name        = 'test-ubuntu'
vif         = [ 'ip=xx.xx.xx.xx,mac=00:16:3E:27:38:92' ]
netmask = "255.255.255.0"
gateway = "xx.xx.xx.xx"
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'
extra = "fastboot"