Aller au contenu
PcPerf.fr
pat1ent00

[Linux] Compiler son kernel maison - Ubuntu only

Messages recommandés

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 :salut:

 

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

Modifié par foo_fight

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon j'ai commencé à suivre le tuto sur mon Linux en machine virtuelle et je bloque rapidement...

 

Dès ici quoi :

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

Je peux ouvrir l'éditeur de texte mais il ne trouve pas le fichier de grub.

Partager ce message


Lien à poster
Partager sur d’autres sites

Car tu es sur une ubuntu < 9.10

C'est ce que j'ai essayé d'expliqué (pas assez bien) juste avant cette étape.

 

sur les < 9.10 tu as un grub 1 et sur les >= c'est grub 2

 

d'apres la doc sur ubuntu-fr.org

 

[....]

Paramétrage

Délai au démarrage

 

Pour entrer dans le menu de Grub, vous devez très rapidement appuyer sur « Echap » juste après le démarrage « par défaut ». Pour augmenter ce temps, éditez « /boot/grub/menu.lst », puis augmentez le nombre de secondes dans la section timeout. Pour supprimer ce délai de démarrage ajoutez un # au début de cette ligne.

 

Vous pouvez également faire apparaître systématiquement le menu de GRUB pendant le boot en commentant hiddenmenu dans le même fichier (rajouter un symbole # devant). Une fois que vous avez changé menu.lst vous pouvez redémarrer votre ordinateur, les changements seront pris en compte.

 

Notez que si l’installateur d’Ubuntu détecte d’autres systèmes d’exploitation sur le disque pendant l’installation, alors le menu de Grub sera visible par défaut au boot et le timeout sera augmenté, ainsi les étapes ci-dessus seront inutiles.

 

[....]

 

il faut editer /boot/grub/menu.lst

on va deja faire un backup du fichier..des fois que.. =D

 

cd /boot/grub/

cp menu.lst menu.lst.bak

 

xedit /boot/grub/menu.lst

 

pour afficher le menu a chaque demarrage, il faut Commenter avec # l'option HiddenMenu

 

ça devrait donner ça:

 

# hiddenmenu

 

 

on sauvegarde, on reboot et on test =D

Partager ce message


Lien à poster
Partager sur d’autres sites

copie moi ce qu'il y a dans ton terminak :)

 

car /etc/default/grub doit exister!

 

 

 

si tu as une ip public, tu peux me donner un acces?

on verra le truc dnas un screen avec msn interposé =D

Partager ce message


Lien à poster
Partager sur d’autres sites

Voilà ce que ça me donne :

 

foofight@ubuntu:~$ cat /etc/default/grub

cat: /etc/default/grub: Aucun fichier ou dossier de ce type

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon j'ai repris le tuto sur une installe native de Linux.

 

Tout ce passe bien jusqu'au moment de compiler.

 

Lancement de la commande make-kpkg --initrd -us -uc buildpackage

 

Là j'ai très rapidement une erreur 255.

 

dpkg-buildpackage: erreur: impossible de déterminer paquet source

make: *** [debian/stamp/build/buildpackage] Erreur 255

 

 

;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement

×
×
  • Créer...