RPiLinuxKernelBuild

De Wiki LOGre
Aller à : navigation, rechercher


Il se peut que vous ayez besoin de recompiler un noyau linux sur la RPI, pour le fun, pour porter vos propres modules kernel,... Voici un petit tuto pas trop compliqué (mais un peu long...). En résumé:

  1. Configurer et cross-compiler le noyau linux pour le SoC Broadcom BCM2835 de la RPI
  2. Cross-compiler les modules noyau tiers
  3. Installer le nouveau noyau sur la RPI
  4. Installer les modules noyau sur la RPI
  5. Copier le nouveau firwmare sur la RPI


En cross compilation (Pas sur la RPI !!!)

La compilation sous linux i386 ou amd64

export WORKDIR=directory de travail    # genre /home/pi/kernel_build
cd $WORKDIR
  • Récupérez les compilateurs précompilés (32bits !)
git clone https://github.com/raspberrypi/tools.git

On a 3 compilos différents :

arm-bcm2708-linux-gnueabi
arm-bcm2708hardfp-linux-gnueabi
gcc-linaro-arm-linux-gnueabihf-raspbian

Le 3eme est le plus performant (utilisation du FPU hardware)

NB : si vous êtes en amd64, installez ia32-libs.

PATH=$PATH:$WORKDIR/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
  • Récupérez le code source du noyau (branche 3.2.27 ou 3.6.y)
git clone https://github.com/raspberrypi/linux.git
  • Préparez l'environnemetn de compilation:
mkdir -p $WORKDIR/kernel_output
mkdir -p $WORKDIR/rpi_rootfs
cd $WORKDIR/linux
  • Sélectionnez la configuration du noyau pour raspberry pi (bcmrpi pour le SoC broadcom):
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=$WORKDIR/kernel_output bcmrpi_defconfig

C'est une bonne idée de mettre un "nom" perso à ce noyau (pour éviter que le répertoire des modules soit le mêmes que celui du noyau par défaut de la distrib)

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=$WORKDIR/kernel_output menuconfig

Dans "General Setup", selectionnez "Local version - append to kernel release" et mettez par exemple votre nom.

En même temps cochez "Automatically append version information to the version string". Ca permet d'ajouter le SHA1 git utilisé dans le nom du kernel.

  • Compilez le kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=$WORKDIR/kernel_output
  • Copiez les modules (Attention ! Cela crée des liens symboliques vers build et sources dans rpi_rootfs, ne pas les transferer vers la RPI !)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=$WORKDIR/kernel_output INSTALL_MOD_PATH=$WORKDIR/rpi_rootfs modules_install

la compilation de modules noyau tiers

Exemple: Compilation de Directfb fusion

cd $WORKDIR
git clone git://git.directfb.org/git/directfb/core/linux-fusion.git
cd linux_fusion
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNELDIR=$WORKDIR/kernel_output

Installez les modules dans un repertoire intermediaire $WORKDIR/rpi_rootfs

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNELDIR=$WORKDIR/kernel_output INSTALL_MOD_PATH=$WORKDIR/rpi_rootfs modules_install

Installez les headers (toujours dans le repertoire intermediaire $WORKDIR/rpi_rootfs)

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNELDIR=$WORKDIR/kernel_output INSTALL_MOD_PATH=$WORKDIR/rpi_rootfs headers_install

Installez le nouveau noyau sur la RPI

Préparez une carte SD

  • Récupérez une image de la distribution cible (genre Raspbian)
  • Flashez l'image sur la carte SD

Le noyau

  • Création de l'image noyau attendu par le bootloader
cd $WORKDIR/tools/mkimage
./imagetool-uncompressed.py $WORKDIR/kernel_output/arch/arm/boot/zImage
  • Bootez la RPI avec l'ancien noyau
  • Copier l'image sur la RPI
scp $WORKDIR/tools/mkimage/kernel.img pi@<rpi_ip>:/boot/my_kernel.img
(ou depuis la partition FAT sous windows, ajoutez le fichier my_kernel.img à la racine)
  • Copier les nouveaux fichiers dans le vrai root filesystem de la rpi (ici les modules noyau et des nouveau .h)
cd $WORKDIR/rpi_rootfs
tar cpf - * | ssh pi@<rpi_ip> "sudo tar xpf - -C /"


Le firmware

  • Récupérez le firmware (compatible!)
git clone https://github.com/raspberrypi/firmware
git archive master | bzip2 >firmware.tar.bz2
scp $WORKDIR/firmware.tar.bz2 pi@<rpi_ip>:/tmp/

  • Copiez le firmware dans /opt sur la RPI
cd /tmp
tar xjvf firmware.tar.bz2
sudo cp -R firmware/hardfp/opt/* /opt/
sudo cp -R firmware/boot/* /boot/

La config

  • Sur la raspberry pi dans le /boot/config.txt (ou le fichier config.txt de la partition 1 en fat) dire qu'on veut booter avec le noyau my_kernel.img
kernel=my_kernel.img
  • Rebootez

sources