la construction d'un noyau linux

Comme internet regorge d'informations à ce sujet, ça ne sert à rien de réinventer la roue, voici quelques liens :


Le très connu linux from scratch  linux from scratch
La construction d'un noyau pour la distribution Arch Linux building Arch linux kernel
Le dépôt git officiel de la Raspi utile pour avoir les sources et les compiler git raspi linux
Un autre dépôt git qui fournit en outre une procédure précise ainsi que les bons fichiers de configuration git raspi gamaral linux
Il y aussi les excellents articles de C. Blaess sur ce sujet blaess toolchain linux
Un lien vers l'utilitaire buildroot, ensemble de makefile qui facilitent la compilation du noyau buildroot download

Sur la Raspberry Pi, il est possible pour faire un linux "embarqué" :

- soit de partir d'une image existante d'une distribution classique (Raspbian - ArchLinux - ... ) ou plus légère (tinycore - ..)
- soit de compiler soit même le noyau à partir des sources

Dans le domaine de l'embarqué, il est naturel et souvent essentiel de s'orienter vers la deuxième solution,
Il est hors de question de partir d'une distribution complète et de revenir en arrière pour supprimer ce qu'on ne désire pas.
Et c'est d'ailleurs impossible.

Il vaut donc mieux partir de zéro en compilant ce que l'on veut, avec les paquets que l'on veut, et les modules noyau que l'on veut.

Le plus simple pour construire son propre noyau et les composants annexes (bootloader, rootfs, etc..) est d'utiliser un outil tel buildroot.
Après avoir testé et essayé open embedded ainsi que crosstool-ng, les résultats les plus probants ont été obtenus avec buildroot.

Buildroot installe son propre compilateur croisée et recherche les dépendances pour la compilation croisée.

Mais il est tout à fait possible une fois téléchargé les sources des paquets d'utiliser un autre compilateur croisé et de réaliser la procédure classique : 

./configure ...
./make && make install

J'utilise Debian comme utilitaire hôte (host) car il est très facile d'installer une toolchain et qu'il existe une réelle cohérence
dans la recherche des dépendances. 

Le dépôt gamaral fournit une configuration prédéfinie au niveau des fichiers de configs (.config) bien utiles afin d'avoir des options
de noyau cohérentes et dédiées à la cible que l'on veut.

La procédure dans le cas de la RaspberryPi2 (pour une autre cible il faut spécifier un autre fichier de config)

make raspberrypi2_defconfig
make nconfig 
make

Dans nconfig, on peut ajouter les paquets à compiler par le compilateur croisé que l'on veut et vérifier les options pour la cible :

- little endian pour la matisse 
- arm cortex A7 pour le cpu
- pas de swap (sur un projet embarqué utiliser la swap est une mauvaise idée)
- la librairie c pour le noyau (soit glibc soit ulibc )
- le chemin pour les patchs éventuels (linux-rt) ..
- etc ..

Si une autre raspi est opérationnelle et que l'on désire récupérer le fichier de config du noyau (attention pas de buildroot !) :
zcat /proc/config.z > .config et ensuite copier ce fichier dans le répertoire des sources du noyau.
 
J'ai mis en ligne plusieurs noyaux compilés par mes soins de la version Vanilla 4.1.x sur la page téléchargements
sous la forme de composants à installer sur la sdcard de la raspi :

- le bootloader (outil de chargement du noyau)
- le rootfs (système de fichier du système)
- le kernel (noyau compilé) 

Le  partitionnement est typique de la RaspberryPi : 100 Mo ou moins en vfat  le reste en ext* (on peut mettre en ext2 ext3 ou ext4)
Il est simple et classique de partitionner : fdisk /dev/sdx => /dev/sdx1 en vfat /dev/sdx2 en ext4, mkfs.vfat /dev/sdx1, mkfs.ext4 /dev/sdx1

Il n'est pas possible de donner directement l'image iso car elle est trop lourde.
Il est préférable de télécharger ces 3 éléments composants le système et de suivre le procédure d'installation classique.

Le bootloader par défaut intègre busybox, mais il est possible de booter avec d'autres bootloader (uboot - ..)
Le bootloader et le kernel sont donc sur la 1ere partition dédiée, ainsi que les binaires annexes au bootloader (bootcode.bin - start.elf - .. )
Le rootfs occupe  la totalité de la 2eme partition dédiée, partitionné en ext* (ext2, ext3 ou ext4 suivant les besoins).