Virt/Xen
Introduction
Ce document décrit le déroulement de l'installation de Xen. Xen est un logiciel libre de virtualisation et plus précisément un hyperviseur de machines virtuelles. Son but est de faire fonctionner plusieurs machines virtuelles (invités) sur une machine hôte. Les systèmes d'exploitation invités partagent ainsi les ressources de la machine hôte. Nous allons donc voir dans cette notice comment installer Xen, comment le configurer, comment installer les différents invités et comment corriger les différents problèmes de fonctionnement qui pourront être rencontrés.
Installation
L'installation est très simple mais nécessite un reboot de la machine pour booter sur le kernel-xen qui sera installé.
yum install xen kernel-xen
Modification du fichier <path>/etc/grub.conf</path> pour booter automatiquement sur le kernel xen.
default=0
Où 0 représente le numéro du kernel sur lequel on veut booter (donc kernel-xen)
On reboot le serveur. Après le reboot, on vérifie que l'on est sur le bon kernel
#uname -r 2.6.18-194.32.1.el5xen
L'installation de Xen est désormais terminée. On va donc procéder à l'installation de la première VM. Pour informations, la machine hôte donc le serveur Xen est appelé dom0 et les machines virtuelles hébergées par celui-ci donc les invités sont appelés domU.
Notons aussi les 2 types de virtualisation essentiellement utilisé: HVM qui est la méthode de virtualisation complète, elle désigne la virtualisation hardware des processeurs (VT pour intel et Pacifica pour AMD). Si le processeur est compatible, nous pouvons virtualiser sans modification du système invité. PV est la méthode dite paravirtuelle, elle nécessite un noyau modifié pour que le système invité puisse fonctionner. Cette deuxième méthode assure de meilleures performances pour le système invité.
Les VM Linux utiliseront la méthode PV et les VM Windows utiliseront la méthode HVM.
Installation de la première machine virtuelle
Pour installer la première machine virtuelle Linux (CentOS), nous allons passer par un mirroir pour comprendre comment se passe ce type d'installation. Pour les suivantes, nous utiliserons l'outil koan qui permet d'automatiser l'installation depuis le serveur Cobbler. Koan permettra d'installer une VM en moins de 5 minutes sans avoir besoin d’interagir avec le processus d'installation.
L'installation traditionnelle d'un VM Centos se fait ainsi:
# mkdir /var/data/xen # virt-install --prompt What is the name of your virtual machine? cent01 How much RAM should be allocated (in megabytes)? 128 What would you like to use as the disk (file path)? /var/data/xen/cent01.img How large would you like the disk (/vm/vm01.img) to be (in gigabytes)? 5 What is the install location? ftp://ftp.free.fr/mirrors/ftp.centos.org/5.5/os/x86_64/
Ensuite il suffit de suivre les étapes de la même façon que lors d'une installation de CentOS netinstall normale.
Commandes XEN Utiles
Nous allons détailler les commandes essentielles pour l'utilisation de Xen :
- Lister les domaines actifs : xm list
- Démarrer un domaine : xm create /etc/xen/cent01
- Éteindre un domaine : xm shutdown cent01
- Éteindre un domaine (méthode brutale) : xm destroy cent01
- Se connecter à la console d'une VM Linux : xm console cent01
Appuyer sur 'Entrée' une seconde fois. - Pour quitter la console : ctrl+5
- Démarrage automatique de la VM au boot du serveur : ln -s /etc/xen/cent01 /etc/xen/auto
- Incrémenter la RAM d'un invité arrêté : modifier le paramètre adéquat dans le fichier de configuration de la VM
- Incrémenter la RAM d'un invité démarré : xm mem-set cent01 2048M
Cloner une machine virtuelle
Nous allons voir comment cloner la VM cent01, la méthode est très simple et va se faire avec une seule commande :
# xm shutdown cent01 # virt-clone --prompt What is the name of the original virtual machine? cent01 What would you like to use as the cloned disk (file path) for '/var/data/xen/cent01.img'? /var/data/xen/cent02.img
KOAN
L'utilisation de cet outil est expliqué en détail dans la notice d’installation de Cobbler. Nous n'allons donc pas nous attarder sur celui mais rappelons simplement qu'il va permettre d'installer rapidement de manière automatique de nouvelles VM Linux sur un serveur Xen. Il est important de considérer également que le kernel 2.6.18-194.32.1.el5 ne fonctionne pas sur les VM installées avec koan, il faut utiliser le kernel 2.6.18-194.el5.
XEN basé sur lvm
Pour créer un domU basé sur LVM plutôt que sur un fichier, il faut d'abord s'assurer que le VolGroup00 dispose de suffisamment d'espace disque disponible. On peut constater ceci avec la commande vgdisplay. On va alors créer le volume logique avec la suite de commandes suivantes :
Partition
# lvcreate -L 5G -n xcent01 VolGroup00 # mkfs -t ext3 /dev/VolGroup00/xcent01
Swap (optionnel)
# lvcreate -L 512M -n xswcent01 VolGroup00 # mkswap /dev/VolGroup00/xswcent01 # swapon /dev/VolGroup00/xswcent01
Test de montage de la partition
# mkdir /xen/xcent01 # mount /dev/VolGroup00/xcent01 /xen/xcent01/ # umount /xen/xcent01
Maintenant que notre volume logique est prêt, on va installer une VM dessus à l'aide de Koan avec les commandes suivantes :
# wget http://download.fedora.redhat.com/pub/epel/5/x86_64/koan-2.0.9-1.el5.noarch.rpm # rpm -i koan-2.0.9-1.el5.noarch.rpm # koan --virt --profile=centxenvm-xen-x86_64 --server=192.168.0.52 --virt-type=auto --nogfx \ --virt-name=cent01 –virt-path=/dev/VolGroup00/xcent01 # xm create centok Error: (2, 'Invalid kernel', 'xc_dom_parse_elf_kernel: ELF image has no shstrtab\n')
Edition du fichier <path>/etc/xen/cent01</path> Commenter la ligne suivante ( ajout d'un # en début de ligne )
bootloader = "/usr/bin/pygrub"
Et ajouter après cette ligne
kernel = "/boot/vmlinuz-2.6.18-194.el5xen" ramdisk = "/boot/initrd-2.6.18-194.el5xen.img"
Problème "Booting has failed".
# xm destroy cent01 # xm console vm01 # VM installée depuis miroir centos # mkinitrd --omit-scsi-modules --with=xennet --with=xenblk --preload=xenblk \ initrd-$(uname -r)-no-scsi.img $(uname -r)
Récuperation de l'image ramdisk depuis la vm qui fonctionne vers le serveur xen
# scp initrd-2.6.18-194.el5xen-no-scsi.img root@192.168.0.21:/home/xen/
[ctrl] + [5] pour quitter
Fichier <path>/etc/xen/cent01</path>
#bootloader = "/usr/bin/pygrub" kernel = "/boot/vmlinuz-2.6.18-194.el5xen" ramdisk = "/home/xen/initrd-2.6.18-194.el5xen-no-scsi.img"
# xm create cent01 -c
Nous voilà sur la VM installé via koan
# yum install kernel-xen-2.6.18-194.el5
Edition du fichier <path>/etc/grub.conf</path> pour configurer le kernel par default sur le kernel non xen Edition du fichier <path>/etc/yum.conf</path> et ajouter
exclude=kernel*
Problème FATAL Module ipv6 not found
Problème "modules.dep no such file or directory"
# mkdir /lib/modules/2.6.18-194.el5xen # depmod -a # reboot
Nous avons donc vu ici comment installer une VM depuis Koan sur une partition LVM.
VM Windows
Nous allons voir maintenant comment virtualiser des machines Windows. L'installation devra se faire de façon traditionnelle car Cobbler ne supporte pas les installations de VM Windows sous Xen. Voici la méthode à suivre :
Premièrement, nous installons et configurons le service VNC sur le serveur Xen :
# yum install vnc-server
vi /etc/sysconfig/vncservers
VNCSERVERS="5:root" # display port and username VNCSERVERARGS[5]="-geometry 800x600 -nolisten tcp -nohttpd -localhost"
# vncpasswd Password: Verify:
# vncserver :5 New 'xen1.b2pweb.com:5 (root)' desktop is xen1.b2pweb.com:5 Starting applications specified in /root/.vnc/xstartup Log file is /root/.vnc/xen1.b2pweb.com:5.log
Nous avons ici lancé une première instance du serveur VNC, on peut essayer de s'y connecter avec un client VNC en précisant l'URL suivante : 192.168.0.21:5 (où l'IP correspond à l'IP du serveur Xen).
Pour tuer cette instance du serveur VNC
vncserver -kill :5
On va maintenant installé notre première VM Windows: (il faut avoir au préalable créé une image ISO d'un CD de boot Windows XP)
# mkdir -p /home/xen/domains/xp # nice dd if=/dev/zero of=/home/xen/domains/xp/disk.img bs=1024k seek=4096 count=0 # virt-install -n winxp_base -r 256 --disk /home/xen/domains/xp/disk.img,size=5 -b xenbr0 \ --vnc -v -c /home/admin/XP_PRO_SP2.iso xm shutdown winxp_base # (si nécessaire)
Fichier <path>/etc/xen/winxp</path>
- 'on_crash' should be changed to 'destroy'
- Change the line on_reboot = 'restart' to on_reboot = 'destroy' to ensure that Windows doesn’t restart during setup without our permission, which will be required for ACPI support in the guest to be set up properly.
- Add file:/home/admin/XP_PRO_SP2.iso,hdc:cdrom,r', to the list in the line disk = [ ... ]
- Add new line boot = 'd' (preferably after the line disk = [ ... ].).
Le fichier de configuration de la VM devrait ressembler à quelque chose comme ceci :
name = "winxp_base"
uuid = "8ff17e33-2c64-e876-3141-a7e341fc896b"
maxmem = 256
memory = 256
vcpus = 1
builder = "hvm"
kernel = "/usr/lib/xen/boot/hvmloader"
pae = 1
acpi = 1
apic = 1
localtime = 0
on_poweroff = "destroy"
on_reboot = "destroy"
on_crash = "destroy"
device_model = "/usr/lib64/xen/bin/qemu-dm"
sdl = 0
vnc = 1
vnclisten = "192.168.0.21"
vncdisplay = 30
vncpasswd = "vncserver"
keymap = "fr"
disk = [ "file:/home/xen/domains/xp/disk.img,hda,w", "file:/home/admin/XP_PRO_SP2.iso,hdc:cdrom,r" ]
boot = "d"
vif = [ "mac=00:16:36:bb:c4:44,bridge=xenbr0,script=vif-bridge" ]
parallel = "none"
serial = "pty"
Il est important de noter à ce stade de l'installation que le client TightVNC est nécessaire, en effet le client UltraVNC ne fonctionne pas pour se connecter aux VM. On peut envoyer l'installation ainsi :
# xm create winxp_base
On se connecter alors avec TightVNC à l'adresse du serveur (Xen) : 192.168.0.21:30 (où 30 est le numéro de port spécifié dans le fichier de configuration de la VM). Le mot de passe est 'vncserver' (également spécifié dans le fichier de conf). On déroule normalement l'installation, à la fin la VM ne redémarre pas, c'est normal, la configuration est définie ainsi on va alors de nouveau éditer le fichier adéquat pour rétablir la bonne configuration :
Edition du fichier <path>/etc/xen/winxp_base</path>
- Change the line boot = 'd' to boot = 'c'
- Change the line on_reboot = 'destroy' to on_reboot = 'restart'
# xm create winxp_base
On se reconnecte avec TightVNC à l'adresse du serveur (Xen) : 192.168.0.21:30 avec le mot de passe 'vncserver' et on termine l'installation et la configuration de la VM Windows.
Dans cet exemple nous avons installé une VM Windows XP, si on veut installer une autre version de Windows la procédure est la même, il suffit juste d'adapter les paramètres vus ci-dessus. Par exemple, voici la ligne de commande utilisée pour installer une VM Windows Seven :
# virt-install -n win7_base -r 2048 --disk /home/xen/domains/seven/disk.img,size=20 -b xenbr0 --vnc -v -c /home/admin/WIN_7_ULTIMATE.iso
Notez que pour installer une VM Vista ou Seven, il faut minimum 2048 Mo de RAM et 20 Go d'espace disque disponible.
Migration d'une VM XEN LVM vers un autre hôte
Il se peut que nous ayons besoin de déplacer une machine virtuelle depuis son hôte actuel vers un autre hôte (dom0).
Les VM Xen peuvent être basées sur 2 types de disque dur : le fichier image (.img) ou le volume LVM.
Pour déplacer une VM image-based, il suffit de déplacer le fichier image et le fichier de configuration sur le nouvel hôte pour pouvoir utiliser la VM sur le nouveau dom0.
Dans le cas d'une VM LVM-based, les manipulations à entreprendre sont les suivantes :
Sur l'ancien dom0 :
- On arrête la VM
- On exporte le snapshot du domU dans un fichier
- On supprime le snapshot du volume LVM
- On copie le fichier correspondant au snapshot sur le nouveau dom0
- On copie le fichier de configuration de la VM sur le nouveau dom0
Sur le nouveau dom0 :
- On crée le volume LVM pour la VM
- On exporte le fichier image récupéré vers ce volume LVM
- On démarre la VM
Sur l'ancien dom0 :
- On supprime le fichier image (export du snapshot)
- On supprime le fichier de configuration
Résumé des commandes :
Sur l'ancien hôte
xm shutdown vm01 dd if=/dev/VolGroup00/vm01 of=/tmp/vm01.img bs=4096 lvremove /dev/VolGroup00/vm01 scp /tmp/vm01.img root@new_host:/tmp/ scp /etc/xen/vm01 root@new_host:/etc/xen/
Sur le nouvel hôte
lvcreate -L 5G -n vm01 VolGroup00 dd if=/tmp/vm01.img of=/dev/VolGroup00/vm01 bs=4096 xm create vm01 -c
Sur l'ancien hôte
rm -rf /tmp/vm01.img rm -rf /etc/xen/vm01