Compilar Kernel para Raspberry Pi
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.
Comentarios recientes