Dans ce post je partirai du principe que vous utiliser un système d’exploitation GNU/Linux avec une distribution basée sur Debian. Pour mon cas j’utiliserai Ubuntu car la toolchain de compilation pour les architectures ARM est présente sur les repositories officiels.

Introduction

Pourquoi installer un nouveau noyau

Tout d’abord, parce qu’on peut le faire.

De plus, lorsque vous travaillez sur du materiel embarqué (Raspberry Pi par exemple) il est préférable de compiler votre noyau sur une machine plus puissante. C’est la qu’intervient la cross compilation.

C’est aussi très utile aussi lorsque votre hardware n’est pas pris en charge mais que la dernière version le prend en charge.

La compilation du noyau Linux est aussi un bon début pour comprendre comment celui-ci fonctionne.

Pré-requis :

  • Une distribution Linux (Ubuntu pour la simplicité)
  • Un Raspberry Pi
  • GCC, make, git, libncurses5-dev, bc, gcc-arm-linux-gnueabihf
  • Savoir dompter la ligne de commande

Un petit bonus c’est d’avoir un cable USB vers TTL pour avoir une sortie série. C’est très utile pour le debugging du kernel avec kGDB.

Compilation

Tout d’abord il vous faudra les sources du noyau Linux, pour cela nous allons les chercher sur Github, sur le repository offciel de la Raspberry Pi foundation.

Avec git nous clonons le repo :

$ git clone https://github.com/raspberrypi/linux
Clonage dans 'linux'...
remote: Counting objects: 5048679, done.
remote: Compressing objects: 100% (550/550), done.
remote: Total 5048679 (delta 460), reused 191 (delta 191), pack-reused 5047938
Réception d objets: 100% (5048679/5048679), 1.62 GiB | 13.03 MiB/s, fait.
Résolution des deltas: 100% (4173612/4173612), fait.
Vérification de la connectivité... fait.
Extraction des fichiers: 100% (56233/56233), fait.

Rendez-vous dans le directory linux que nous venons de cloner : cd linux.

Vous initialisez la variable KERNEL : KERNEL=kernel7

Puis vous configurez le Makefile de façon à ce qu’il comprenne qu’on va compiler un noyau pour l’architecture ARM plus précisement pour Raspberry Pi 2/3.

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#

Si vous souhaitez rajouter quelques fonctionnalités à votre noyau avant la compilation tapez la commande suivante : make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig. N’oubliez pas d’installer libncurses5-dev.

menuconf

Ok tout est bon, vous pouvez maintenant lancer la compilation :

$ make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
scripts/kconfig/conf  --silentoldconfig Kconfig
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  UPD     include/generated/uapi/linux/version.h
  WRAP    arch/arm/include/generated/asm/bitsperlong.h
  WRAP    arch/arm/include/generated/asm/cputime.h
  HOSTCC  scripts/basic/bin2c
  WRAP    arch/arm/include/generated/asm/current.h
  WRAP    arch/arm/include/generated/asm/emergency-restart.h
  WRAP    arch/arm/include/generated/asm/errno.h
  WRAP    arch/arm/include/generated/asm/exec.h
  WRAP    arch/arm/include/generated/asm/ioctl.h
  [...]

La compilation peut durer un certain temps mais ça sera plus rapide que si vous compilez directement sur votre carte. Si c’est pas le cas, il est temps de changer de machine.

Je vous conseille aussi de vérifier si c’est bien un fichier exécutable ARM juste au cas où :)

$ file vmlinux
vmlinux: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, BuildID[sha1]=359927894c7b68a663a4c0da8b8f8519b93a329a, not stripped

Installation

Pour l’installation, voici ma méthode, qui n’est pas très conventionnelle. Tout d’abord on va archiver le dossier Linux avec tar : tar zcvf linux.tar.gz linux puis vous envoyez l’archive sur votre Raspberry Pi via SSH : scp -P [port] user@raspberrypi:/home/pi

Ok maintenant tout ce passe sur votre Raspberry Pi. Vous désarchivez le tout avec la commande suivante : tar zxvf linux.tar.gz

Vous vous rendez dans le dossier que vous venez de désarchiver, puis vous installez les nouveaux modules avec la commande make modules_install .

 $ sudo make modules_install
  INSTALL arch/arm/crypto/aes-arm-bs.ko
  INSTALL arch/arm/crypto/aes-arm.ko
  INSTALL arch/arm/crypto/sha1-arm-neon.ko
  INSTALL arch/arm/crypto/sha1-arm.ko
  INSTALL arch/arm/lib/xor-neon.ko
  INSTALL arch/arm/oprofile/oprofile.ko
  INSTALL crypto/ablk_helper.ko
  [...]

L’installation des modules peut prendre un peu de temps aussi, mais beaucoup moins que la compilation de Linux.

Après l’install’ des modules nous allons copier le noyau dans le repertoire /boot. Il est aussi préférable de copier kernel.img et kernel7.img dans un autre dossier ou en le renommant. Dès que c’est fait vous copiez le nouveau noyau dans /boot:

$ sudo cp arch/arm/boot/zImage /boot/kernel.img

$ sudo cp arch/arm/boot/zImage /boot/kernel7.img

Dès que c’est fait vous redemarrez votre Raspberry Pi pour appliquer les changements.

Si votre Pi redemarre sans soucis c’est bon signe ! Ensuite pour savoir si le nouveau noyau est bien installé tapez la commande uname -a puis regardez la date de compilation du noyau.

pi@raspberrypi:~$ uname -a
Linux raspberrypi 4.4.39 #1 Sun Dec 18 23:38:06 CET 2016 armv6l GNU/Linux

Vous pouvez aussi lancer la commande date pour comparer

pi@raspberrypi:~$ date pi@raspberrypi:~$ date Mon 19 Dec 10:04:33 UTC 2016

Et voilà si la sortie de uname correspond à peu près à la date c’est que vous avez installé avec succès un noyau Linux pour votre Raspberry Pi.

En esperant que ce post ai été utile. Si vous avez besoin d’infos contactez-moi sur Twitter: @matteyeux
Github : https://github.com/matteyeux