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 :
1
2
3
4
5
6
7
8
9
$ 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.
1
2
3
4
5
6
7
8
9
10
11
$ 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
.
Ok tout est bon, vous pouvez maintenant lancer la compilation :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ 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ù :)
1
2
$ 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
.
1
2
3
4
5
6
7
8
9
$ 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.
1
2
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