Esta pagina se ve mejor con JavaScript habilitado

Compilación kernel Raspberrypi diferente arquitectura

 ·  🎃 kr0m

En este artículo vamos a explicar los pasos necesarios para compilar un kernel para ARM desde Amd64, el objetivo final es compilar el kernel de nuestra Raspberrypi sin tener que esperar una eternidad. Para llevar a cabo nuestra empresa necesitaremos el siguiente software

  • Fuentes del kernel
  • Cross-toolchain para ARM
  • Compilador ARM

Bajamos las fuentes del kernel

Nota: Estas fuentes NO son las vanilla ya que estas no tienen los drivers para el hw de la Raspberrypi y tendríamos que parchearlas

mkdir /usr/src/rpi_kernel
cd /usr/src/rpi_kernel
git clone https://github.com/raspberrypi/linux.git

Nos bajamos el cross-toolchain para ARM:

emerge -av sys-devel/crossdev
vi /etc/make.conf

PORTDIR_OVERLAY="/usr/local/portage/overlay/"
mkdir -p PORTDIR_OVERLAY=“e --deep --with-bdeps=y @worldusr/local/portage/overlay/
crossdev -S -v -t arm-unknown-linux-gnueabi

Nos bajamos el compilador ARM:

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

NOTA: Está compilado para 32bits, así que debemos tener habilitado el soporte de emulación en el kernel:

Executable file formats / Emulations --->
[*] IA32 Emulation
<*> IA32 a.out support
[*] x32 ABI for 64-bit mode 
emerge emul-linux-x86-baselibs
revdep-rebuild
export CCPREFIX=/usr/src/rpi_kernel/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-
cd linux
make mrproper

Sacamos la config base de la Rasp:

zcat /proc/config.gz > /root/punto_config

Nos llevamos la config al server donde compilaremos:

scp /root/punto_config root@IP:/usr/src/rpi_kernel/linux/.config

Configuramos el kernel:

make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig –> Si hay opciones que no están en nuestra config nos preguntará ;)
make ARCH=arm CROSS_COMPILE=${CCPREFIX} menuconfig

Compilamos:

make -j2 ARCH=arm CROSS_COMPILE=${CCPREFIX}

Compilamos módulos:

make -j2 ARCH=arm CROSS_COMPILE=${CCPREFIX} modules

Instalamos los módulos:

rm -rf ~/modules 2>/dev/null
mkdir /modules
export MODULES_TEMP=
/modules
make ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=${MODULES_TEMP} modules_install
cd ~
tar czvf modules.tar.gz modules

Copiamos la imagen y los módulos a la Rasp:

scp /root/modules.tar.gz IP_RASP:/root/
scp /usr/src/rpi_kernel/linux/arch/arm/boot/Image IP_RASP:/root/

Instalamos la imagen y los módulos:

ssh IP_RASP
rm -rf modules 2>/dev/null
tar xvzf modules.tar.gz
cp -r /root/modules/lib/modules/* /lib/modules/
cp /boot/kernel.img /boot/kernel.img.ori
cp /root/Image /boot/kernel.img

Hay ocasiones en que el cambio de kernel requiere el cambio del firmware ya que hay cambios considerables:

emerge -av dev-vcs/git
git clone git://github.com/raspberrypi/firmware.git
cp firmware/boot/bootcode.bin firmware/boot/fixup.dat firmware/boot/start.elf /boot/

También copiaremos las librerias VC, pero debemos saber si copiar las hard o las soft:

${CCPREFIX}gcc -v 2>&1 | grep har
rm -rf /opt/vc/ 2>/dev/null

Para Hard:

cp -r firmware/hardfp/opt/vc/ /opt/

Para Soft:

cp -r firmware/opt/vc/ /opt/

Para los mas perecesos dejo aquí mi config y una imagen ya compilada.

NOTA: Esta imagen no tiene soporte para módulos por lo tanto la parte de instalación de módulos nos la podemos saltar, además está pensada para actuar como server o FW, se han eliminado los drivers de audio, tarjetas inalámbricas y demás pijerias, en cambio se ha metido todo lo relacionado con cifrado, iptables y protocolos de red ;)

Si te ha gustado el artículo puedes invitarme a un RedBull aquí