Linux peut très bien être installé dans une machine virtuelle (VM) Hyper-V sans aucune modification. Alors quel est l'intêret de modifier le kernel de linux spécialement pour Hyper-V ?
Un système non modifié est dit virtualisé, ce qui veut dire qu'une VM est entièrement emulée pour faire fonctionner le système invité, ce qui coûte cher en ressources processeur. L'avantage de compiler un kernel spécifique pour Hyper-V est que la machine n'est plus virtualisée, mais paravirtualisée, c'est à dire que ses pilotes font directement appel à la couche d'abstraction matérielle du système hôte, et donc le fonctionnement de la VM est bien plus rapide. Il reste toutefois la limitation du nombre de processeurs logiques qui peuvent être utilisés avec un système invité Linux, soit un seul.
Cet article décrira donc comment paravirtualiser notre système CentOS 5.2 (ou RHEL 5.2) sous Hyper-V.
Attention: Cet article à été testé avec la serie des kernels 2.6.18-92.x Cette manipulation ne marche cependant pas le dernier kernel en date 2.6.18-128.1.6 de Redhat Linux 5.3 / CentOS 5.3 qui resulte en un bloquage pendant la phase de démarrage au niveau du message ACPI: Core revision 20060707.
Commençons notre quête chez Microsoft en téléchargeant les Hyper-V Linux Integration Components qui se trouvent à l'adresse suivante:
http://www.microsoft.com/downloads/details.aspx?displaylang=fr&FamilyID=...
Une fois l'archive téléchargée extraite, il faut insérér l'image ISO dans la VM.
Dans la console Hyper-V, double cliquer sur la machine virtuelle souhaitée, puis aller au menu Support → Lecteur DVD → Insérer un disque. Choisir l'image des outils d'intégration linux de Hyper-V nomée LinuxIC.iso
Enfin nous allons copier le contenu de l'image ISO dans un dossier de notre VM.
Ouvrir une console sur la VM:
$ mkdir /mnt/cdrom
$ mount /dev/cdrom /mnt/cdrom
$ cp -rp /mnt/cdrom /root/LinuxIC
$ umount /mnt/cdrom
Il faut ensuite télécharger les sources de votre kernel.
Attention, il convient d'avoir fait ses mises à jours au préalable au travers de la commande yum update. Faites attention tout de même à ce que yum ne mette pas a jour votre kernel en version 2.6.18-128.1.6 qui se revelera incompatible avec les additions Hyper-V.
Souvenez-vous qu'une mise a jour de votre distribution peut également installer un nouveau kernel, auquel cas il faut recompiler notre kernel modifié.
La version actuelle du kernel est connue en entrant la commande suivante:$ uname -r
Les sources de votre Kernel peuvent être trouvées aux adresses suivantes selon qu'il a été mis à jour ou non:
http://mirror.centos.org/centos-5/5.2/os/SRPMS/ (versions de base)
http://mirror.centos.org/centos-5/5.2/updates/SRPMS/ (versions mises à jour)
La nomenclature est la suivante:
kernel-(uname -r).src.rpm
Si vous connaissez exactement le nom de votre kernel, vous pouvez utiliser la commande wgetpour télécharger le source.
Exemple pour notre installation:
$ wget http://mirror.centos.org/centos-5/5.2/os/SRPMS/kernel-2.6.18-92.el5.src.rpm
Si vous n'arrivez pas à télécharger le fichier grâce a cette commande, le navigateur links sera votre ami (commande elinks).
Si votre reseau ne marche pas, pensez que votre carte reseau virtuelle n'est pas reconnue tant que vous n'avez pas fini d'installer les outils d'intégration linux. Aussi, il est conseillé d'installer une carte reseau dite « heritée » à partir de l'interface d'administration Hyper-V qui sera reconnue d'office par quasi toutes les distributions linux actuelles. Après redemarrage votre reseau devrait être opérationnel. Vous pouvez toujours lancer un petit ifconfigafin de verifier et au pire configurer les fichier eth0-cfg et resolv.conf ou tout simplement invoker l'utilitaire de configuration système avec la commande setup.
Afin de pouvoir compiler votre kernel spécial Hyper-V, il va falloir disposer de quelques outils supplémentaires. Si vous n'êtes pas sur d'avoir installé les packages nécéesaires, utilisez la commande suivante:
$ yum install redhat-rpm-config gcc rpm-build make gnupg
Installez les sources de votre kernel avec la commande suivante:
$ rpm -ivh kernel-*.src.rpm
(* étant un wildcard, un joker qui permet de spécifier une chaine de longueur inconnue)
Vous aurez des multiples messages d'erreurs disant que le groupe utilisé pour compiler les kernels est indisponible et que le groupe root sera utilisé. N'en tenez pas compte.
Les sources seront installées dans le dossier /usr/src/redhat/SOURCES et les spécifications dans /usr/etc/redhat/SPECS/kernel-2.6.spec
C'est d'ailleurs le fichier des spécifications qu'il va falloir modifier.Avant toute modification d'un fichier important, il convient d'en faire une copie de sauvegarde:
$ cp /usr/src/redhat/SPECS/kernel-2.6.spec /usr/src/redhat/SPECS/kernel-2.6.spec.original
$ nano /usr/src/redhat/SPECS/kernel-2.6.spec
Commencez par chercher l'occurence de % define buildid(la fonction de recherche CTRL+W sera votre amie), décommentez la ligne (enlever le #), puis enlever l'espace entre % et define. La constante 'buildid' definie un nom unique au kernel, très pratique pour le differencier des kernels officiels et vanilla. Dans notre cas nous rajouterons donc la ligne
%define buildid .badministrateur
Lors de sa compilation sur notre machine de test, notre kernel portera donc le nom suivant:
kernel-xen-2.6.18-92.el5.badministrateur.x86-64.rpm
Cherchez maintenant l'occurence de %buildet inserez les lignes suivantes:
Sur les systèmes x64:
patch -p1 -d ../linux-%{kversion}.%{_target_cpu} < /root/LinuxIC/patch/x2v-x64-rhel.patch
Sur les systèmes x86:
patch -p1 -d ../linux-%{kversion}.%{_target_cpu} < /root/LinuxIC/patch/x2v-x32-rhel.patch
Si vous avez du mal a faire les signes '{' et '}' à travers, sachez que Hyper-V pour une raison obscure n'aime pas les combinaisons de touches avec ALT-GR.
Nous vous conseillons vivement de télécharger PuTTY à l'adresse http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html et d'ouvrir une session SSH avec cet utilitaire afin de pouvoir utiliser les combinaisons de touches de votre choix.
Cherchez également l'occurence de%define with_xen %{?_without_xen: 0} %{?!_without_xen: 1}
et changez la ligne en%define with_xen 1
Si elle existe, faites de même pour la ligne commencant par %define with_xen_only
Cherchez ensuite l'occurence de%define with_headers %{?_without_headers: 0} %{?!_without_headers: 1}
et changez la ligne en%define with_headers 0
Vous devriez être prêts maintenant à lancer la compilation de votre kernel avec les patchs Hyper-V de Microsoft. Nous vous conseillons cependant de faire une petite pause et de préparer quelques litres de café. En effet, la compilation sur une machine virtualisée peut prendre du temps, beaucoup de temps. Sur notre Intel E8400 de test avec 4Go de mémoire, le temps de compilation a été de 5 heures.
Pour compiler, entrez la commande suivante:
Sur les systèmes x64:
$ rpmbuild -ba -with xenonly kernel-2.6.spec
Sur les systèmes x86:
$ rpmbuild -ba --target i686 -with xenonly kernel-2.6.spec
Il se peut que après quelques instants la compilation s'arrête et affiche
« Not enough random bytes available »
Ceci est du au fait que pour des raisons cryptographiques, le compilateur a besoin d'octets aléatoires.
Un simple moyen de lui en fournir est le suivant
1. Appuyez sur CTRL + Z
2. Lancez les commandes suivantes :
$ du /
$ fg
Votre compilation devrait repartir.
Votre kernel est à présent compilé et un fichier RPM à été crée. Nous allons donc procéder a son installation. Rendez-vous dans le dossier contenant nos chers RPM:
Sur les systèmes x64:
$ cd /usr/src/redhat/RPMS/x86_64
Sur les systèmes x86:
$ cd /usr/src/redhat/RPMS/i686
Lancez leur installation:
rpm -ivh kernel-xen-2*rpm
rpm -Uvh kernel-xen-devel-2*rpm
Maintenant que le kernel est installé, il va falloir modifier le fichier de configuration Grub afin de lui spécifier les arguments de démarrage. Un script a été crée par Microsoft à cet effet.
$ perl /root/LinuxIC/setup.pl x2v /boot/grub/grub.conf
Attention: Par défaut ce script suppose que vous n'avez pas de partition boot separée et charge donc le kernel par un chemin absolu. Si vous avez une partition boot separée, il va falloir passer en chemin relatif dans la ligne de chargement du système. Ainsi kernel /boot/x2v-64.gzdevient kernel /x2v-64.gz
Vous pouvez verifier la présence d'une partition boot en entrant la commande suivante qui devrait sortir une ligne décrivant la partition si elle existe:
$ cat /etc/fstab | grep boot
Verifiez maintenant que le fichier grub.conf a bien été traité en executant la commde suivante:
$ cat /boot/grub/grub.conf
Voici la sortie sur notre système x64:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-92.el5.badministrateurxen)
root (hd0,0)
kernel /x2v-64.gz
module /vmlinuz-2.6.18-92.el5.badministrateurxen ro root=/dev/VolGroup00/LogVol00 rhgb quiet runlevel 3
module /initrd-2.6.18-92.el5.badministrateurxen.img
title CentOS (2.6.18-92.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-92.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet runlevel 3
initrd /initrd-2.6.18-92.el5.img
Sur un système 32 bits, verifiez bien que le kernel chargé soit un kernel PAE.
kernel /x2v-pae.gz
et non pas
kernel /x2v-32.gz
Vous remarquerez la presence de l'argument runlevel 3ajouté manuellement au préalable afin de faire démarrer notre système en mode console uniquement. Ce paramètre n'est en aucun cas obligatoire.
Vous pouvez maintenant redémarrer votre VM qui devrait démarrer avec notre nouveau kernel.
Attention: Les mises à jour du système sont susceptibles d'installer de nouveaux kernels qui ne seront plus paravirtualisés. Si vraiment vous devez mettre à jour votre kernel, pensez qu'il vous faudra repeter les étapes de ce tutoriel.
Rendez-vous pour la deuxieme partie, les pilotes.
Ce tutoriel est basé en grande partie sur les travaux de Julian Field disponibles à l'adresse http://www.jules.fm/Logbook/files/win2008_linuxic_rc2_rhel.html

Commentaires
Ca marche... :)
J'attend la suite avec impatience!!!
Par contre j'ai dû modifier un peu le fichier spec, à la ligne
patch -p1 -d ../linux-%{kversion}.%{_target_cpu}
j'ai mis la version de mon kernel "en dur" et j'ai pointé vers /root/LinuxIC/x2v-x64-rhel.patch, là où j'ai effectivement collé le contenu de l'ISO...
A bientot!!!
Merci pour l'info... J'ai
Merci pour l'info... J'ai rectifié le chemin d'accès (j'avais gardé le chemin utilisé pendant les tests, voila ce qui arrive à force de faire des copier-collers :)
J'ai n'ai pas eu beaucoup de temps pour m'occuper du site ces derniers temps... Le deuxieme volet devrait suivre d'ici deux semaines... ainsi que 11 autres articles qui sont en préparation depuis un petit moment.
A Bientôt.
Ajouter un commentaire