linux linux raspberry gcc cross-compile arm c kernel

Cross compile kernel Raspberry Pi

Mi faceva voglia da molto tempo, alla fine l'ho ordinato: il Raspberry Pi.

Il Raspberry Pi è un innovativo e divertente sistema embedded SBC, ovvero una single-board computer, progettata e realizzata dalla Raspberry Pi Foundation.

Dentro c'ho messo Raspbian, una distro Debian ottimizzata proprio per RPi. C'ho giocato per un po', poi ho voluto provare a riprodurre quello che ho scritto nel post precedente anche lì. Ma mancavano i moduli usbip-core e usbip-host, così ho dovuto ricompilare il kernel. Infatti sono nel kernel ufficiale, ma non sono abilitati di default. La compilazione del kernel con il processorino del Raspberry Pi necessita di circa sei ore di lavoro. Non ho abbastanza pazienza. Così ho compilato direttamente dal mio computer, utilizzando la toolchain cross-gcc per arm.

La toolchain per la compilazione in ambiente x86 è disponibile come repository git nell'account ufficiale in GitHub: https://github.com/raspberrypi/tools. Ho seguito questa guida e alla fine ho ottenuto un kernel funzionante con qualche minuto di compilazione. Qui ho riassunto la procedura che ho seguito.

Premesse

Il Raspberry Pi è accessibile via ssh all'indirizzo rpi. Non c'è bisogno di password perché utilizzo authorized_keys per loggarmi senza scrivere la password ogni volta. Nel nostro computer c'è un sistema operativo Linux, abbiamo git e un processore x86.

Preparare gli strumenti e i sorgenti

Creiamo la cartella in cui lavorare e spostiamoci lì dentro.

mkdir -p /opt/rpi
cd /opt/rpi
mkdir src dst

Facciamo un backup del kernel, dei moduli e del firmware già presenti nel Raspberry Pi.

ssh root@rpi "( cd / && tar cpvf - /boot/kernel.img /lib/modules /lib/firmware )" > backup.tar

Prepariamo la cartella temporanea in verranno installati kernel e moduli dopo la fase di compilazione.

export OUTDIR=/opt/rpi/dst
mkdir $OUTDIR/boot

Scarichiamo la repository con gli strumenti di compilazione.

git clone git://github.com/raspberrypi/tools.git

Impostiamo la toolchain da utilizzare. In questo caso utilizziamo quella ottimizzata per i calcoli in virgola mobile direttamente nel processore: Hard Float.

export CCPREFIX=/opt/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-

Ci spostiamo nella cartella src e scarichiamo i sorgenti del kernel.

cd src
git clone git://github.com/raspberrypi/linux.git

Controlliamo che i sorgenti siano pronti e copiamo le configurazioni del kernel direttamente dal nostro Raspberry Pi.

cd linux
make mrproper
ssh root@rpi "( cat /proc/config.gz )" | zcat > .config
make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig

Compilare il kernel

Lanciamo l'interfaccia per configurare il kernel. Quando abbiamo finito, salviamo ed usciamo.

make ARCH=arm CROSS_COMPILE=${CCPREFIX} menuconfig

Compiliamo il kernel. A seconda del numero di core che ha il nostro processore, cambiamo il numero dopo il paramentro -j (cioè quanti processi vengono eseguiti contemporaneamente).

make ARCH=arm CROSS_COMPILE=${CCPREFIX} -j4 all

Ci vorrà un po' di pazienza, a seconda della velocità del nostro pc. Quando ha finito, copiamo il kernel nella cartella temporanea.

cp arch/arm/boot/Image $OUTDIR/boot/kernel.img

Installiamo i moduli nella cartella temporanea.

make ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH="${OUTDIR}" modules_install

Installazione nel Raspberry Pi

Ci spostiamo nella cartella temporanea, con ssh eliminiamo kernel e moduli nel Raspeberry Pi quindi trasferiamo tutto il contenuto della cartella direttamente dentro al dispositivo.

cd $OUTDIR
ssh root@rpi "( rm -r /boot/kernel.img /lib/modules /lib/firmware )"
tar cf - . | ssh root@rpi "( cd / && tar xvf - --owner=root )"

Ora basta riavviare e se tutto è andato bene, abbiamo il nuovo kernel installato!

Se qualcosa non dovesse funzionare e ci trovassimo con il RPi non avviabile, basta staccare la SD e ripristinare /boot/kernel.img /lib/modules /lib/firmware dal tar di backup.

Ti è piaciuto l'articolo? Condividilo! Commentalo!

comments powered by Disqus