Inicio > Linux, Raspberry Pi, Software > Compilar Kernel para Raspberry Pi

Compilar Kernel para Raspberry Pi

Domingo, 19 de Mayo de 2013 Dejar un comentario Ir a comentarios

Hace unos días tuve que compilar el kernel para el Raspberry Pi ya que necesitaba agregar un módulo del kernel para una impresora térmica (usblp.ko), ya que no viene incluido en raspbian.

Para que necesitas compilar el kernel?

  • Soporte dispositivos o tecnologías no incluidas en raspbian (mi caso)
  • Actualizar a nueva versión
  • Personalizar el kernel removiendo módulos o características que no son necesarias para el uso que le das al equipo.

Requerimientos

  • SD con Raspbian instalado y ejecutándose (aquí sólo compilamos el kernel, igual necesitarás el resto de la distribución).
  • Una distribución linux para compilar, aquí usé Ubuntu Server (que era la que tenía a mano xD).
  • Lector de tarjetas para modificar los archivos (reitero la necesidad de linux, ya que debes acceder a la partición ext3).
  • Un buen procesador, mientras mejor sea la compilación será más rápida.
  • 2 GB de espacio mínimo aprox (mi carpeta pesa 1819 MB, en 71418 archivos)

Proceso

  • Primero debes descargar el código fuente de Linux, aquí usaré la versión 3.6 que corresponde a la rama estable. Puedes clonar el repositorio git, pero como son muchos archivos conviene más descargar el archivo comprimido.

mkdir rpi
cd rpi
wget https://github.com/raspberrypi/linux/archive/rpi-3.6.y.tar.gz
tar xfv rpi-3.6.y.tar.gz

  • Luego debes descargar el cross-compiler, ya que estarás compilando para ARM desde x86/x64, al igual que Linux también puedes clonar el repositorio o descargar el archivo comprimido

wget https://github.com/raspberrypi/tools/archive/master.tar.gz
tar xfv master.tar.gz
apt-get install gcc-arm-linux-gnueabi make ncurses-dev

  • Ejecuta este comando para limpiar la carpeta del kernel

cd rpi-3.6.y
make rproper

  • Luego debes copiar la configuración de kernel, para eso necesitas obtener el archivo .config de un raspbian en ejecución

scp root@raspberryip:/proc/config.gz config.gz
zcat config.gz > .config

  • Debes exportar esta variable que define el path del compilador y el prefijo de los comandos.

export CCPREFIX=/home/usuario/rpi/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-

  • Actualizar la configuración

make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig

  • Si deseas agregar o quitar características y módulos al kernel debes entrar al menú de configuración

make ARCH=arm CROSS_COMPILE=${CCPREFIX} menuconfig

  • Compilar el kernel!, esto tardará varios minutos e incluso horas

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

  • Ahora debes pasar el kernel a la tarjeta SD, si está en ejecución apaga el rPi e inserta la tarjeta en el lector de tu computador (aqui supondré que la SD está en /mnt/sdsys la partición ext3 del sistema y /mnt/sdboot la fat32 de booteo)

mv /mnt/sdboot/kernel.img /mnt/sdboot/kernel-original.img
cp arch/arm/boot/Image /mnt/sdboot/kernel.img

  • Ahora debes copiar los módulos, primero se pondrán todos juntos en una carpeta y luego se copiarán

mkdir /home/usuario/rpi/modules
export MODULES_TEMP=/home/usuario/rpi/modules
make ARCH=arm CROSS_COMPILE=${CCPREFIX} \
INSTALL_MOD_PATH=${MODULES_TEMP} modules_install

mv /mnt/sdsys/lib/modules /mnt/sdsys/lib/modules.old
mv /mnt/sdsys/lib/firmware /mnt/sdsys/lib/firmware.old
cp –rv /home/usuario/rpi/modules/lib/* /mnt/sdsys/lib/

  • Luego se debe actualizar el firmware, se debe descargar y copiar a la SD

cd ..   (para volver a /home/usuario/rpi)
wget https://github.com/raspberrypi/firmware/archive/next.tar.gz
tar xfv next.tar.gz
cd firmware-next
mv /mnt/sdsys/opt/vc /mnt/sdsys/opt/vc.original
cp –rv /opt/vc /mnt/sdsys/opt/
mv /mnt/sdboot/bootcode.bin /mnt/sdboot/bootcode.bin.original
mv /mnt/sdboot/fixup.dat /mnt/sdboot/fixup.dat.original
mv /mnt/sdboot/start.elf /mnt/sdboot/start.elf.original
cp boot/bootcode.bin /mnt/sdboot/
cp boot/fixup.date /mnt/sdboot/
cp boot/startr.elf /mnt/sdboot/

  • Llegó el momento de probar el nuevo kernel. Extrae la SD e insértala en el Raspberry Pi y enciéndelo. Si inicia el SO y llegas al login el kernel se compiló exitosamente.
  • Opcionalmente puedes eliminar todos los archivos que se renombraron para liberar espacio una vez que compruebes que el kernel funcionó correctamente.

Fuente: http://elinux.org/RPi_Kernel_Compilation

  • esael

    Hola, gracias por tu tutorial.
    Me he quedado en cp arch/arm/boot/Image /mnt/sdboot/kernel.img
    Por lo visto despues de compilar el kernel no hay ninguna imagen para copiar en arch/arm/boot/Image

    ls arch/arm/boot/
    bootp compressed dts install.sh Makefile

  • ing_acme

    Hola que hay, una pregunta quisiera saber si podrias dar un tutorial de como crear un modulo para controlar un gpio de raspberry ya que necesito, aprender a compilar el kernel para la raspberry y no tengo idea podrias explicarme porfavor. se como programar en python y en c los gpio pero no se hacer modulos y compilar el kernel una explicacion porfavor

  • yeil

    Mi version de kernel es 3.18.5+ sirve este tutorial?

    • debería de poder aplicarse para cualquier versión del kernel