TP Administration Système : Compilation d'un noyau Linux 2.6.x.y 29 septembre 2005 Mickaël Marchand <mmarcha@ujf-grenoble.fr> Sébastien Varrette <Sebastien.Varrette@imag.fr> Bernard Parisse <Bernard.Parisse@ujf-grenoble.fr> 1 Introduction Compiler un noyau linux (aussi appelé kernel) n'est pas chose facile pour le débutant. Cela requiert de bien connaître le matériel qui constitue votre ordinateur et d'avoir une expérience avec les options que le noyau vous propose. Nous allons voir dans ce TP, deux manières de créer un noyau et de l'installer : la méthode standard compatible avec toutes les distributions Linux et la méthode debian, plus simple et plus rapide. Généralement les distributions Linux modient le noyau qu'ils fournissent, soit pour corriger des bugs de sécurité, soit pour améliorer ou ajouter des fonctionnalités. Debian modie généralement très peu le noyau (uniquement pour la sécurité), ici nous utiliserons un noyau Linux vanilla, c'est-à-dire sans modications. D'autres personnes fournissent des versions modiées du noyau, par exemple pour tester des nouvelles fonctionnalités, corriger des bugs, améliorer les performances sous certaines conditions... On trouve la plupart de ces modications sur le site http://www.kernel.org, n'hésitez pas à explorer ce site pour découvrir tout ce qui s'y cache (c'est une mine d'or pour le noyau). Nous verrons aussi comment éviter de recompiler un noyau entier lorsque l'ajout d'un pilote est nécessaire, en utilisant les modules (chargeables dynamiquement). Les noyaux Linux ont vu récemment un changement dans leur numérotation, ainsi les versions ocielles sont numérotées 2.6.13 et des versions de correction sont rajoutées au fur et à mesure : 2.6.13.1 puis 2.6.13.2... Ces sous-versions ne contiennent que des correctifs de bugs et de sécurité. Dans la mesure du possible, il faudra toujours utiliser le noyau le plus récent. L'objectif de ce TP est donc de mettre à jour votre machine avec un noyau 2.6 plus récent que le noyau par défaut. Le passage d'un noyau 2.4 à un noyau 2.6 apporte plusieurs avantages dont pour ne citer qu'eux : de meilleurs performances, plus de pilotes pour le matériel, des corrections de bugs,... 1
Vous serez sans doute fréquemment amené à compiler des modules et/ou recompiler un noyau Linux pour supporter diérents matériels. Généralement, on a besoin de mettre à jour son noyau pour qu'un PC récent puisse fonctionner (ou fonctionner mieux) ou pour rajouter une fonctionnalité spécique. Les compilations pouvant être assez longues, ne perdez pas de temps! 2 Vérications préalables Avant de se pencher sur le noyau lui-même, il va falloir préparer le système à compiler et utiliser un noyau de la série 2.6.x. Les Debian que vous avez installé utilisent par défaut des noyaux 2.4.x. Quelques mises à jour peuvent être nécessaires. Commencez par télécharger le dernier noyau Linux stable de la série 2.6 depuis le site http://www.kernel.org. Le chier doit s'appeler linux-2.6.13.2.tar.bz2 ou linux-2.6.13.2.tar.gz. Sur ce site, vous pourrez trouver tout l'historique du noyau Linux depuis sa création. Vous pourrez également trouver l'historique des changements (aka ChangeLog) qui indique quelles modications ont été apportées à chaque évolution du noyau. Chaque changement, si inme soit-il, est soigneusement noté, cela permet une totale transparence entre les équipes qui développent le noyau. Décompressez ce chier : tar zxf linux-2.6.13.2.tar.gz ou tar jxf linux-2.6.13.2.tar.bz2 selon le chier que vous avez téléchargé. Cela doit créer un répertoire linux-2.6.13.2. A l'intérieur de ce répertoire se trouve tout le code source du noyau Linux. Consultez le chier Documentation/Changes, vous y trouverez une liste de logiciels et de versions. Vériez bien que votre système à ces outils avec les bonnes versions (ou des versions supérieures). Par exemple, il est indiqué que gcc 2.95.3 est nécessaire, la commande gcc --version nous indiquera si nous avons la bonne version. Certains de ces logiciels ne nous seront pas utiles (comme pcmcia qui est spécique aux portables, xfsutils, isdn4k-utils,jfsutils,ppp,oprole), vous n'avez donc pas à les installer ou à les mettre à jour. Les deux logiciels importants à installer lorsqu'on migre en noyau 2.6 sont les paquets : udev et module-init-tools. Si vous les oubliez, votre nouveau noyau ne saura pas lancer correctement le système. Un package hotplug est également très utile, il se chargera de détecter et de charger une bonne partie des modules du noyau nécessaires au matériel de la machine pendant le démarrage. Son installation est donc recommandée (mais pas indispensable). Enn pour pouvoir congurer le noyau, il nous faudra une interface en mode console ou graphique, nous utiliserons ici l'interface console (plus claire que l'interface graphique) : apt-get install libncurses5-dev 3 Conguration du noyau 3.1 Présentation du système d'options Avant de lancer la compilation du noyau, il va falloir le congurer et ca n'est pas chose facile. Le noyau ore des dizaines d'options et si on ne choisit pas la 2
bonne ou si on en oublie, le noyau résultant peut ne pas démarrer du tout. Nous n'allons pas détailler toutes les options (il y en a bien trop;) il vous faudra donc faire des choix judicieux. Généralement, le plus simple consiste à reprendre la conguration du noyau existant et à la modier pour rajouter les options que l'on veut. C'est simple et plutôt ecace. Dans le cas d'une migration d'un noyau 2.4 à un noyau 2.6, c'est plus complexe, il vaut mieux tout refaire à la main en choisissant les options une à une. C'est long et fastidieux. Pour vous simplier le travail, un chier de conguration type est à votre disposition, il vous donnera une conguration de base que vous n'aurez plus qu'à adapter. Vous pouvez le télécharger depuis http://www-fourier.ujf-grenoble.fr/~mmarcha/config-base-2.6. Enregistrez ce chier sous le nom.config dans le répertoire. En règle générale, on essaye d'intégrer en dur (c'est-à-dire compiler dans le noyau lui-même) les composants qui sont indispensables au démarrage de la machine (pilote du disque dur, pilote du système de chiers racine,...) et de compiler en modules tout le reste (carte son, USB,...). Exécutez maintenant la commande : make menuconfig Cette commande lance un menu en mode texte, vous permettant de modi- er les options de conguration du noyau (utiliser la touche tabulation et les èches pour vous déplacer dans les menus, et la touche espace pour sélectionner, valider). Généralement, 3 choix vous sont oerts pour chaque option : compiler dans le noyau l'option (*), compiler en module (M) ou ne pas intégrer la fonctionnalité du tout. Certaines options peuvent se présenter sous forme de listes également (choix du processeur par exemple). Ce menu classe les options du noyau en plusieurs catégories : Code maturity level options, General setup, Loadable module support, Processor type and features, Power management options (ACPI, APM), Bus options (PCI, PCMCIA, EISA, MCA, ISA), Executable file formats, Device Drivers, File systems, Profiling support, Kernel hacking, Security options, Cryptographic options, Library routines. Nous n'en modierons que quelques unes. 3.2 Sélection des composants du noyau L'objectif sera maintenant de rajouter les bons composants en dur dans la conguration pour obtenir un noyau capable de démarrer le système. An de vous aider dans ces choix, quelques commandes vous seront utiles pour déterminer les composants matériels de votre ordinateur : lspci vous achera une liste du matériel détecté. La commande cat /proc/cpuinfo vous donnera des informations sur le type de processeur. Comme point de départ, essayez de choisir le bon processeur, d'activer le support des disques durs (IDE/ATA-2 dans notre cas) et de rajouter le support pour les systèmes de chiers ext3. Toutes ces options doivent être compilées en dur dans le noyau. Vous trouverez ces options dans les menus : Processor type and features, Device Drivers->ATA/ATAPI/MFM/RLL et File systems 3
Il y a plusieurs options à activer pour les disques durs, n'en oubliez pas ou le noyau ne pourra pas initialiser le système. Il faut également activer le support générique du chipset IDE. Vériez également que la carte réseau est bien sélectionnée soit en dur soit en module ( dans le menu Device Drivers->Networking Support->Ethernet (10 or 100Mbit) ). N'hésitez pas à demander de l'aide en cas de doute sur une option. 4 Compilation du noyau Une fois la conguration terminée, il ne restera plus qu'à compiler le noyau. Il existe deux manières de procéder : - la méthode standard qui fonctionne sur toutes les distributions Linux - la méthode Debian qui permet d'installer un noyau simplement sur de nombreuses machines similaires, cette méthode est la méthode recommandée sur une machine sous Debian. 4.1 Méthode de compilation standard Cette fois, c'est l'ordinateur qui va travailler, lancez la commande : make all Les scripts du noyau vont tout prendre en charge pour compiler correctement vos choix. Plusieurs chiers seront générés : le noyau, les modules, un chier de description des symboles du noyau... Lorsque la compilation sera nie, vous n'aurez plus qu'à passer en mode administrateur (si vous ne l'êtes pas déjà) et installer le noyau : su (entrez le mot de passe root) make install modules_install update-grub Cette dernière commande va mettre à jour le bootloader grub pour qu'il vous permette de démarrer votre nouveau noyau. Il ne vous reste plus qu'à redémarrer votre machine pour tester votre noyau personnalisé. Si votre noyau ne démarre pas correctement, regardez bien les messages indiqués par celui-ci, ils peuvent vous indiquer pourquoi le démarrage à échouer, puis redémarrez la machine et utilisez le noyau 2.4.27 pour démarrer avec un système stable. Vous pouvez alors réssayer de congurer votre noyau en réparant les erreurs. Les compilations successives seront plus rapides, seules les parties modiées par vos choix seront recompilées. 4.2 Méthode Debian Commencez par nettoyer les sources du noyau (pour enlever les chiers compilés précédemment) : make clean Nous garderons le même chier de conguration que précédemment. 4
L'objectif ici est de construire un noyau et de le transformer en paquet Debian (chier.deb) que l'on pourra copier sur plusieurs machines pour l'installer. Pour ce faire, Debian met à disposition des outils : apt-get install kernel-package fakeroot Le paquet kernel-package fournit plusieurs scripts permettant d'automatiser la création du paquet. Il sut maintenant d'exécuter une seule commande pour créer un paquet Debian d'un noyau : make-kpkg --rootcmd fakeroot -rev csci.1 kernel-image L'option -rev permet de rajouter un numéro de version personnalisé au paquet qui va être généré. Si nous devions mettre à jour ce noyau, nous pourrions recompiler avec un -rev csci.2 par exemple. Cela vous permet de garder une trace et un suivi des évolutions de votre noyau. L'option --rootcmd fakeroot permet de ne pas être en root pour compiler (elle simule le compte root avec la commande fakeroot). Lorsque la création du paquet sera terminée vous trouverez un chier kernelimage-2.6.13.2_csci.1_i386.deb dans le répertoire parent. Il sut maintenant d'installer ce chier avec la commande pour installer le noyau sur votre machine : dpkg -i kernel-image-2.6.13.2_csci.1_i386.deb 5 Compilation d'un module externe Dans certains cas, vous pourrez être amené à compiler un module supplémentaire pour faire fonctionner un matériel particulier. Un exemple typique est les cartes graphiques Nvidia. Nvidia fournit son propre pilote et il faut le compiler soit-même pour pouvoir l'utiliser. Debian dispose d'outils simpliant la compilation de ce genre de modules. Pour l'exemple, nous installerons ici le module nvidia même s'il ne sera pas utilisé sur ces machines. Commencez par récupérer l'outil Debian permettant de compiler automatiquement le module : apt-get install module-assistant Lancer maintenant la commande : m-a a-i nvidia-kernel La commande m-a (module-assistant) va lancer automatiquement la compilation du module nvidia. Cela va créer et installer un chier.deb contenant le module nvidia adapté pour le noyau qui est actuellement utilisé. Vous n'aurez plus qu'à charger le module avec la commande : modprobe nvidia (ici la commande renvoit l'erreur No such device ce qui est normal car les ordinateurs n'ont pas ce périphérique). Si vous exécutez la commande m-a seule, vous obtiendrez un système de menus vous permettant de choisir et de compiler divers modules supplémentaires disponibles dans Debian. Il est également possible de rajouter un paramètre à la commande m-a pour lui spécier de construire un module pour un noyau diérent que le noyau actuel. Pour cela, il faut rajouter l'option -k /chemin/jusqu'aux/sources/du/noyau/à/utiliser ce qui peut donner quelque chose comme : m-a a-i nvidia-kernel -k /usr/src/linux-2.6.10 5
si on souhaitait préparer le module nvidia pour un noyau 2.6.10. 6 Plus d'informations sur la compilation du noyau Linux... Il vous faudra sans doute un certain temps pour vous familiariser avec les options du noyau. Il est rare de réussir à obtenir un noyau qui fonctionne dès le premier essai car il est très facile de faire une erreur au niveau des choix des options. Pour vous aider à comprendre comment tout cela fonctionne vous pouvez commencer par la documentation écrite par Kwan Lowe http: //www.digitalhermit.com/linux/kernel-build-howto.html qui détaille les diverses options et manières de compiler un noyau. La documentation spécique à Debian est également une bonne source d'informations http://www.debian.org/doc/manuals/reference/ch-kernel.fr. html. Un site personnel qui contient beaucoup d'informations sur Linux : http: //people.via.ecp.fr/~alexis/formation-linux/config-noyau.html. Le noyau lui-même contient beaucoup de documentation dans le répertoire Documentation. C'est une mine d'informations en cas de problèmes avec certains pilotes et options possibles pour vous assister. 6