Esta web utiliza cookies, puedes ver nuestra política de cookies aquí. Si continuas navegando estás aceptándola

Compilación kernel Raspberrypi diferente arquitectura


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

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.

Bajamos las fuentes del kernel

Nota: Estas fuentes no son las vanilla ya que estas no tienen los drivers para el hw de la rasp 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 ;)


Autor: Kr0m -- 03/01/2014 00:22:08