En cours de rédaction =D
/!\ATTENTION/!\
La compilation de votre kernel reste réservée à des utilisateurs avancés, je vous invite à ne pas recopier les commandes bêtement mais à comprendre ce qu'elles font.
Vous ne devez pas le faire sur une machine en production et vous devez avoir les droits nécessaires pour le faire.
Je ne serais responsable en cas de vautrage de votre machine =D
/!\ATTENTION/!\
Présentation
C'est quoi le Kernel?
C'est quoi la compilation?
Introduction
la machine de test
Dépendance: les paquets nécessaires pour configurer et compiler le kernel
vérification d'usage
Au boulot
configuration
compilation
installation
conclusion
Présentation:
C'est quoi le kernel?
Le kernel est le noyau (kernel en british) d'un système d'exploitation, que se soit Windows, Linux, Bsd, MacOs, etc etc.
Il s'occupe de faire le lien entre la partie logiciel et la partie hardware, gestion de la RAM, du système de fichier, de la swap, c'est lui qui gère !
Son role est donc critique pour la machine, il est au centre de la stabilité du système.
C'est quoi la compilation?
Le développeur derrière son pc utilise un langage de programmation pour codé le kernel, c'est le code source du kernel.
Il est cependant incompréhensible pour la machine qui ne comprend que le langage machine (sans blague!)
La compilation est le travail réalisé par le compilateur permettant de transformer un code source en un fichier binaire exécutable par la machine
introduction:
la machine utilisée pour ce tuto:
- Carte mère Tyan Tempest i5400XT S5396
- Processeurs: 2 * Intel Xeon 5420 (quad core 2.5ghz)
- Ram :12gb FbDimm
- Graphique: ATi 4870 et 3870
Le kernel utilisé a l'installation d'Ubuntu est compilé avec un maximum d'option d'une part, et des options génériques d'autre part afin de fonctionner sur le plus grand nombre de machine.
Ce qui nous intéresse ici est d'optimiser notre kernel afin de l'adapter à votre machine et donc de le rendre plus performant.
Paquets nécessaires:
Installation des paquets nécessaire à la compilation du kernel et les sources du kernel lui même
on peut réduire à une seule commande, mais pour le besoin du tuto, je préfère couper
root@blacklight:~# apt-get install debconf-utils dpkg-dev debhelper build-essential kernel-package libncurses5-dev
root@blacklight:~# apt-get install linux-source
linux-source est un "meta-package" qui pointe vers la dernière version du noyau dispo pour ubuntu. Concrètement, ça va télécharger les source du drnier noyaux dans /usr/src
les sources en question sont dans linux-source-2.6.31.tar.bz2, c'est la dernière version au jours du tuto =D
Vérification d'usage:
Avant d'installer le kernel, il faut veiller à avoir le choix du kernel au boot
la raison: => si vous n'avez pas accès a ce menu et que le noyau ne fonctionne pas.... vous ne pourrez plus booter votre machine pour corriger et ça devient galère de réparer :/
Version inférieure à 9.10 avec Grub premier du nom:
normalement, vous avez accès au menu lors du boot en tapant [Echap] juste avant le chargement du kernel
Version d'Ubuntu 9.10 avec Grub2: le menu n'apparait pas (Ubuntu et Xubuntu 9.10)
j'édite /etc/default/grub avec mon éditeur de texte préféré xedit, gedit, emacs, vi, vim, pico, nano , etc etc etc
root@blacklight:/usr/src/linux-source-2.6.31# xedit /etc/default/grub
ici en gras ce que j'ai modifié
root@blacklight:/usr/src/linux-source-2.6.31# cat /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0 <= j'ai commenté la ligne en ajoutant un # au debut de ligne
GRUB_HIDDEN_TIMEOUT_QUIET=false <= je passe la l'option de True à False
GRUB_TIMEOUT="10"
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entrys
#GRUB_DISABLE_LINUX_RECOVERY="true"
root@blacklight:/usr/src/linux-source-2.6.31#
Une fois que vous avez modifier le fichier, il faut updater le fichier de config de grub - grup.cfg - ça se fait automatiquement avec cette commande
root@blacklight:/usr/src/linux-source-2.6.31# update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.31-16-generic
Found initrd image: /boot/initrd.img-2.6.31-16-generic
Found linux image: /boot/vmlinuz-2.6.31-14-generic
Found initrd image: /boot/initrd.img-2.6.31-14-generic
Found memtest86+ image: /boot/memtest86+.bin
ls: ne peut accéder /media/WD: Aucun fichier ou dossier de ce type
done
root@blacklight:/usr/src/linux-source-2.6.31#
On peut voir que Grub cherche tout les noyaux installer sur le syteme (present dans /boot)
/!\ Vous devez rebooter et tester que vous avez bien accès au menu du choix du noyau, sinon ne passez pas à la suite/!\
Au boulot!
La configuration
On regarde le kernel déjà en place:
root@blacklight:~# uname -a
Linux blacklight 2.6.31-16-generic #53-Ubuntu SMP Tue Dec 8 04:02:15 UTC 2009 x86_64 GNU/Linux
root@blacklight:~#
=> version 2.6.31 revision 16 générique, en clair ça doit tourner sur toute les machines
On regarde le contenu de /usr/src, c'est l'emplacement par défaut des sources des noyaux (src = source).
On peut compiler a partir d'un autre dossier..mais /usr/src est celui par défaut, donc on ne se prend pas la tête
root@blacklight:~# ls /usr/src/
ati linux-headers-2.6.31-14 linux-headers-2.6.31-14-generic linux-headers-2.6.31-16 linux-headers-2.6.31-16-generic linux-source-2.6.31.tar.bz2
root@blacklight:~#
root@blacklight:~# cd /usr/src/
root@blacklight:/usr/src# tar xvjf linux-source-2.6.31.tar.bz2
[ça dezip tout plein de truc =D]
root@blacklight:/usr/src# ls
ati linux-headers-2.6.31-14-generic linux-headers-2.6.31-16-generic linux-source-2.6.31.tar.bz2
linux-headers-2.6.31-14 linux-headers-2.6.31-16 linux-source-2.6.31
root@blacklight:/usr/src#
=> tout est dezipé dans "linux-source-2.6.31"
root@blacklight:/usr/src# cd linux-source-2.6.31
root@blacklight:/usr/src/linux-source-2.6.31#
root@blacklight:/usr/src/linux-source-2.6.31# ls
arch COPYING crypto drivers fs init Kbuild lib Makefile net REPORTING-BUGS scripts sound ubuntu virt
block CREDITS Documentation firmware include ipc kernel MAINTAINERS mm README samples security tools usr
root@blacklight:/usr/src/linux-source-2.6.31#
root@blacklight:/usr/src/linux-source-2.6.31# make menuconfig
ça devrait charger le menu de configuration du kernel et creer le fichier .config où est regroupé toutes les options du kernel
les fleche du haut/bas pour naviguer, [entrer] pour entrer dans les menus (avancer d'un niveau), [echap][echap] pour sortir des menu (remonter d'un niveau)
Les [*] signifie que l'option sera compilée en dur dans le noyau
Les [ ] signifie que l'option NE sera PAS compilée dans le noyau
Les <M> signifie que l'option sera un module et chargé dans le noyaux uniquement lorsqu'il y a besoin
en cas de doute, le bouton <Help> explique assez bien le detail des options
Note : certaines options ou fonctions doivent obligatoirement être compilé dans le kernel.
entre autre le controleur ide ou sata de votre dd systeme, sinon ça ne risque pas de boot
idem pour votre systeme de fichier, pour les même raisons
Les choses que j'ai modifié chez moi:
-General setup -->
() Local version - append to kernel release --> permet de donnée un nom custom a votre kernel
(permet de s'y retrouver si on compile plusieurs fois le même kernel mais avec differentes options par exemple)
par exemple chez moi:
(1000hz-xeon-lowlatency) Local version - append to kernel release
Kernel compression mode (LZMA) ---> je choisi le LZMA car son taux de compression est meilleur que le gzip ou bz2, on aura un kernel plus petit
(mais une compilation plus longue...)
Processor type and features --->
[*] ScaleMP vSMP => c'est mieux pour les machines virtuelles, a voir pour le smp classique
[*] Memtest => je charge le memtest choix des boots (utile pour moi - inutile pour d'autre )
Processor family (Core 2/newer Xeon) ---> je specifie la famille du cpu
Timer frequency (1000 HZ) ---> on passe le taux de rafraichissement a 1000hz, au lieu des 100hz
et pis c'est tout
On pourrait chasser toutes les fonctions inutiles afin d'avoir un kernel léger and co mais:
=> on passerait des heures et des heures pour un gain très / trop faible
=> le kernel sera dépendant d'un hardware specifique.
[TODO] ajout de screen de la config [/TODO]
Au boulot bis:
La compilation:
je ne détaillerais que la compilation à la sauce Debian, c'est à la génération d'un packet .deb:
=> facilité d'installation, tout se fait quasi automatiquement (maj de grub inclut ).
=> portabilité du kernel, on le copie sur une clé usb et le voisin peut l'installé sans soucis par la même méthode
ou si vous réinstaller votre machine apres 50000 essais =D
=> je reprendrais ce que dit le tuto dont je me suis inspiré: c'est la classe de compiler ses propres packets =D
root@blacklight:/usr/src/linux-source-2.6.31# make-kpkg --initrd -us -uc buildpackage
[compilation]
on peut tranquilement aller boire un café, manger, sortir le chien, jouer avec bébé car ça va bourriner votre cpu..du moin un core, je n'ai pas encore trouvé le moyen de compiler sur tout les cores...
chez moi ptete 1h30 2h de compilation
[/fin de la compilation]
root@blacklight:/usr/src/linux-source-2.6.31#
En regardant les fichiers présent dans /usr/src, on voit apparaitre les paquets en .deb générés lors de la compilation
je note aussi que j'aurais du mettre un tiret devant le nom de mon kernel lors de la config du kernel:
"=> (-1000hz-xeon-lowlatency) Local version - append to kernel release"
root@blacklight:/usr/src/linux-source-2.6.31# cd ..
root@blacklight:/usr/src# ls
ati
linux-doc-2.6.31.41000hz-xeon-lowlatency_2.6.31.41000hz-xeon-lowlatency-10.00.Custom_all.deb
linux-headers-2.6.31-14
linux-headers-2.6.31-14-generic
linux-headers-2.6.31-16
linux-headers-2.6.31-16-generic
linux-headers-2.6.31.41000hz-xeon-lowlatency_2.6.31.41000hz-xeon-lowlatency-10.00.Custom_amd64.deb
linux-image-2.6.31.41000hz-xeon-lowlatency_2.6.31.41000hz-xeon-lowlatency-10.00.Custom_amd64.deb
linux-manual-2.6.31.41000hz-xeon-lowlatency_2.6.31.41000hz-xeon-lowlatency-10.00.Custom_all.deb
linux-source-2.6.31
linux-source-2.6.31.41000hz-xeon-lowlatency_2.6.31.41000hz-xeon-lowlatency-10.00.Custom_all.deb
linux-source-2.6.31.41000hz-xeon-lowlatency_2.6.31.41000hz-xeon-lowlatency-10.00.Custom_amd64.changes
linux-source-2.6.31.tar.bz2
root@blacklight:/usr/src#
Au boulot ter:
l'installation:
On installe le paquet linux-image à l'aide de dpkg, l'outil debian de gestion des paquets avec l'option -i pour install
ça va mettre tout à jour, déplacer le kernel dans /boot/ avec l'initrd qui va bien, ça va gérer aussi les dependances
en clair, l'utilisateur laisse faire le système
root@blacklight:/usr/src# dpkg -i linux-image-2.6.31.41000hz-xeon-lowlatency_2.6.31.41000hz-xeon-lowlatency-10.00.Custom_amd64.deb
Sélection du paquet linux-image-2.6.31.41000hz-xeon-lowlatency précédemment désélectionné.
(Lecture de la base de données... 140294 fichiers et répertoires déjà installés.)
Dépaquetage de linux-image-2.6.31.41000hz-xeon-lowlatency (à partir de linux-image-2.6.31.41000hz-xeon-lowlatency_2.6.31.41000hz-xeon-lowlatency-10.00.Custom_amd64.deb) ...
Done.
Paramétrage de linux-image-2.6.31.41000hz-xeon-lowlatency (2.6.31.41000hz-xeon-lowlatency-10.00.Custom) ...
Running depmod.
Finding valid ramdisk creators.
Using mkinitramfs-kpkg to build the ramdisk.
Running postinst hook script update-grub.
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.31.41000hz-xeon-lowlatency
Found initrd image: /boot/initrd.img-2.6.31.41000hz-xeon-lowlatency
Found linux image: /boot/vmlinuz-2.6.31-16-generic
Found initrd image: /boot/initrd.img-2.6.31-16-generic
Found linux image: /boot/vmlinuz-2.6.31-14-generic
Found initrd image: /boot/initrd.img-2.6.31-14-generic
Found memtest86+ image: /boot/memtest86+.bin
ls: ne peut accéder /media/WD: Aucun fichier ou dossier de ce type
done
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/nvidia-common
root@blacklight:/usr/src#
notez que dpkg fait un update-grub pour mettre a jour grub
on reboot, ça doit booter normalement sur le dernier kernel en date, donc le votre
sinon, [Echap] pour avoir le menu de grub et vous choisissez votre kernel
ça a booté! yesssssssssss , on verifie que c'est bien le bon kernel
nico@blacklight:~/Bureau$ uname -a
Linux blacklight 2.6.31.41000hz-xeon-lowlatency #1 SMP PREEMPT Mon Dec 21 22:58:48 CET 2009 x86_64 GNU/Linux
Si ça ne boot pas, merci de poster le message d'erreur, vous pouvez booter sur votre ancien noyau en secours
Source d'information:
voici les liens qui m'ont permis de faire cet article
wikipedia - noyau système d'exploitation
ubuntu-fr.org - compiler un kernel de kernel.org
ubuntu-fr.org - compiler kernel linux tres bon tuto
ubuntu-fr.org - kernel real time