Xen sous OpenSolaris

2009

 
 

Qu'est-ce que Xen?

 

Selon wikipedia, Xen est un logiciel libre de virtualisation, plus précisément un hyperviseur de machine virtuelle.

Basiquement, xen est un logiciel qui permet l'execution de plusieurs systèmes d'exploitation en simultané sur une machine...

 

Comme VmWare ou Qemu c'est ça?

Oui et non.

VMWare et Qemu sont des émulateurs de PC. Ils font de la translation binaire de code

 

Petit aparté technique (je remercie Monsieur Ramblewski pour ses explications très complètes sur le principe): 

 

Par défaut, un processeur dispose de 4 niveaux d’exécution appelés « rings ». (cf http://en.wikipedia.org/wiki/Ring_%28computer_security%29 pour plus d'explications)

 

Sur une archi x86 32 bits, le système d’exploitation fonctionne sur le ring 0 et dispose du plus haut niveau de contrôle à l’inverse des applications qui tournent sur le ring 3.

 

Les couches de niveau supérieures ne peuvent pas modifier le comportement des couches inférieures, seul l’inverse est vrai. (Un OS arrête une appli, pas l’inverse)

Le passage en mode privilégié est standard sur des archis x86, ce sont nos chers syscalls.


Exemple :On fait un « open » en userland, une interruption (int 0x80 sous archi x86 pour ne pas la citer) est envoyée au kernel qui passe dans la fonction « trampoline » codée en assembleur (fichier syscalls.S si je ne m’abuse) et qui permet de switcher le processeur en mode privilégié, le fameux ring 0.

A partir de là on est en kernel mode, le processeur est au ring 0 et tout est possible.

 

Revenons à nos moutons :Lorsque l’on virtualise, on utilise un OS privilégié: l’hyperviseur. Il contrôle les hôtes et les ressources physiques et utilise le ring 0.

L’hyperviseur gère les guests qui doivent donc, pour respecter la hiérarchie de contrôle, utiliser les rings 1 ou 2.

Le problème est qu’un OS est conçu pour ne s’exécuter que sur le ring 0, il vérifie qu’il réside au bon endroit mémoire dédié aux OS et certaines instructions ne s’exécutent que si elles viennent du ring 0 ou y vont. (et heureusement…)

 

Pour pallier à ce problème, on utilise donc la virtualisation.

La paravirtualisation (XEN) consiste à modifier les OS invités pour permettre un mode d’exécution autre que le ring 0.Lorsque l’on ne peut pas modifier le code de l’OS (…), on procède à des translations binaires (VMware, QEMU) pour faire croire à l’OS qu’il occupe un emplacement mémoire valide ainsi que le niveau d’exécution processeur ring 0. Evidemment, ce dernier mode est plus gourmand en ressource.

 

Bon, on joue...

 

Ce TP se compose de deux parties... Une partie historique avec une debian qui lance une debian, et une partie funky qui utilise opensolaris en tant que domaine0.

 

 

Partie Solaris:

Nous allons utiliser le système Opensolaris en tant que Domaine0 (hyperviseur), nous allons ensuite installer une machine hôte

 

Le but de ce TP n'est pas d'apprendre Opensolaris...

 

Installation d'Opensolaris.

Installer votre Rack, booter le CD et installez l'OS

 

Initialisation du dom0

 

Installation des packages

pkg install SUNWxvmhvm

pkg install SUNWvirtinst

pkg install SUNWlibvirt

pkg install SUNWurlgrabber

 

Modification du grub

owulvery@opensolaris:~$ pfexec vi /rpool/boot/grub/menu.lst

...

title OpenSolaris xVM

bootfs rpool/ROOT/opensolaris

findroot (pool_rpool,0,a)

kernel$ /boot/$ISADIR/xen.gz

module$ /platform/i86xpv/kernel/$ISADIR/unix /platform/i86xpv/kernel/$ISADIR/unix -B $ZFS-BOOTFS

module$ /platform/i86pc/$ISADIR/boot_archive

 

reboot

 

Activation du domaine 0

 

svcadm enable store

svcadm enable xend

svcadm enable console

svcadm enable domains

svcadm enable virtd

 

Test du domaine0:

 

La commande

xm info

devrait retourner les mode de fonctionnement de Xen.

 

Installation d'un domU

 

L'utilitaire virtinstall permet d'installer facilement un domU http://opensolaris.org/os/community/xen/docs/virtinstall/

 

N'ayant pas exactement connaissance du matériel, je considère pour la suite de ce TP que les machines sont capables de lancer du HVM...

 

L'installation de ubutnu en HVM peut être réalisée via virt-install:

 

 

virt-install -n Ubuntu --hvm -r 1024 --vnc -f /export/home/images/ubuntu.img -s 5 -c /export/home/isos/ubuntu.iso

 

La fin de ce tp, consiste à utiliser la machine virtuelle en mode de paravirtualisation...

Afin de ne pas plagier un article, merci de vous référencer à l'adresse suivante pour continuer ce TP:

 

http://bderzhavets.wordpress.com/2008/12/11/ubuntu-hardy-hvm-vs-pv-domu-at-opensolaris-200811-dom0/

 

Partie Debian Legacy...

 

Paramétrage du dom0 

  

apt-cache -n search xen-linux-system

Installer le package qui correspond 

  

ex: 

apt-get install xen-linux-system-2.6.18-4-xen-686 

  

Vérifier la configuration de grub et redémarrer le système. 

  

Nous avons donc un dom0 disponible, et nous pouvons donc poursuivre avec l'installation d'un OS invité... 

  

Installation d'un domU

 

Une fois notre système prêt, il faut installer le deuxième OS à virtualiser.

 

Il est tout à fait possible de rebooter la machine et d'effectuer l'installation de l'OS de façon classique sur une autre partition du disque dur, mais, dans le cas ou l'on ne dispose pas d'une partition de libre, il est possible d'utiliser une image disque, ce que nous allons faire.

 

Le principe est de créer un gros fichier spécial que l'on va utiliser comme une disque dur. A l'aide de la commande dd, nous allons donc créer une image disque de 1,5Go dans /srv/.

 

dd if=/dev/zero of=/srv/xen1.img bs=1M count=1500

 

Cette image créée, il faut la formater (comme on le ferait avec une partition d'un 

disque dur):

 

mkfs.ext3 /srv/xen1.img

 

Nous disposons maintenant d'un fichier de 1,5Go que l'on peut utiliser comme une 

partition d'un disque dur.

 

Nous allons donc le monter:

 

mount -o loop /srv/xen1.img /mnt

 

Installons notre OS à virtualiser dans ce fichier (donc dans /mnt) grâce à debootstrap.

Debootstrap permet d'installer un système Debian de base en lui passant en paramètre la version à utiliser (man debootstrap est votre ami): 

  

debootstrap etch /mnt http://ftp.fr.debian.org/debian

  

Une fois le système de base installé, il ne reste plus qu'à s'enfermer dedans grâce à 

chroot afin de le configurer:

  

chroot /mnt /bin/bash 

  

Maintenant que nous somme dans notre OS à virtualiser, donnons-lui un noyau. 

Recherchez une image du noyau patchée pour Xen et installez là. Installez également la 

libc6-xen et module-init-tools si ce n'est pas déjà fait.

  

Une fois le noyau installé, il faut configurer le fichier /etc/fstab afin de donner une ou 

plusieurs partition à notre système.  

Dans notre cas, nous n'avons créé qu'un seul fichier 

image, donc nous n'aurons qu'une seule partition.  

Editer /etc/fstab en lui ajoutant la ligne:  

  

/dev/hda1 / ext3 defaults,errors=remount-ro 0 1. 

  

De la même façon, configurer votre réseau en éditant /etc/network/interfaces. Il faut bien avoir en tête que vous configurez l'interface réseau d'un deuxième système

d'exploitation, donc virtuellement d'une deuxième carte réseau. Il ne faut donc pas lui 

attribuer la même ip que le dom0. 

  

Ce système de base configuré, on sort du chroot (exit).

  

On copie le noyau installé dans notre DomU afin qu'il soit booté par xen à la création de 

celui-ci:  

  

cp /mnt/boot/* /boot/, et on démonte notre fichier image (umount /mnt).

  

Nous avons donc un fichier image xen1.img contenant un système Debian bootable. 

  

Afin que le réseau fonctionne correctement, Xen utilise le mécanisme de pont réseau de 

Linux afin de brancher les interfaces virtuelles des DomUs sur l'interface réseau du 

Dom0. Il faut donc modifier la configuration réseau du dom0 afin de mettre en place le 

pont. 

  

Editez le fichier /etc/network/interfaces afin de rajouter les lignes suivantes:

  

auto br-xen 

iface br-xen inet static 

address xxx.xxx.xxx.xxx 

netmask xxx.xxx.xxx.xxx 

gateway xxx.xxx.xxx.xxx 

bridge_ports eth0 

# optional 

bridge_maxwait 0 

  

Assurez-vous également que votre interface eth0 ne soit pas en mode auto: il ne faut 

pas qu'elle soit activée au boot car elle le sera par le bridge. 

  

Reste à configurer le Dom1. Cela se fait dans un fichier de configuration que nous allons 

créer dans /etc/xen/. 

  

Créez donc un fichier xen1 dans /etc/xen et ajoutez-y les lignes suivantes: 

  

# Noyau à booter 

kernel = "/boot/vmlinuz-2.6.18-2-xen-686" 

# Pour un noyau avec initrd 

ramdisk = "/boot/initrd.img-2.6.18-2-xen-686" 

# Memoire en Mo 

memory = 128 

# Nom de notre domaine 

name = "xen1" 

# Périphérique root 

root = "/dev/hda1 ro" 

# Disque dur 

# disk = [ 'phy:/dev/hdX,hda1,w' ] # si on utilise une vraie partition 

disk = [ 'file:/srv/xen1.img,hda1,w' ] # si on utilise un fichier image 

# Bridge réseau 

vif = [ 'mac=aa:00:00:00:00:d2, bridge=br-xen' ] 

  

Reste à rebooter le système sur le noyau Xen. 

  

Une fois le système rebooté, on se place dans /etc/xen et on lance le domaine xen1:  

  

xm create -c xen1. 

  

L'option -c permet de se déplacer dans la console du nouveau domaine. Vous 

voyez normalement le noyau de votre domaine en train de démarrer. 

Une fois le boot achevé, vous obtenez un invite de login classique où vous 

pouvez vous logger en tant que root (sans mot de passe). Vous voici loggé 

dans un OS virtuel. 

vous pouvez retourner dans le domaine0 en utilisant ctrl+alt+FX et en vous 

reloggant. Vous disposez maintenant d'une Etch et d'une Etch « virtuelle » tournant 

toutes les deux simultanément sur la même machine avec des noyaux 

différents. 

 

TP de virtualisation / Xen sur opensolaris