32blogby StudioMitsu

Compila Linux personalizado para Raspberry Pi con Yocto

Compila Linux personalizado para Raspberry Pi con Yocto Scarthgap. Cubre meta-raspberrypi, flasheo de tarjeta SD, Wi-Fi y GPIO.

7 min read

This article contains affiliate links.

Contenido

Quieres ejecutar tu propio Linux personalizado en una Raspberry Pi. No Raspbian — un SO completamente personalizado compilado enteramente desde el código fuente, adaptado a tus necesidades.

Esta guía te lleva paso a paso por la compilación de una imagen Linux personalizada para Raspberry Pi 3/4 usando Yocto Scarthgap 5.0 LTS — desde la descarga de las capas fuente hasta el arranque en hardware real, incluyendo configuración de Wi-Fi, SSH y GPIO.

Lo que necesitarás

  • Máquina de compilación: Ubuntu 22.04/24.04, 16+ GB RAM, 200+ GB disco
  • Raspberry Pi 3 o 4
  • Tarjeta microSD: 16 GB+ (Clase 10 recomendada)
  • Lector de tarjetas SD
  • Monitor HDMI + teclado (para verificación del arranque inicial)

Descarga de capas e inicialización del entorno de compilación

bash
# Crear un directorio de trabajo
mkdir -p ~/yocto && cd ~/yocto

# Descargar Poky (scarthgap = rama LTS)
git clone -b scarthgap git://git.yoctoproject.org/poky

# Descargar meta-raspberrypi
git clone -b scarthgap git://git.yoctoproject.org/meta-raspberrypi

# Descargar meta-openembedded (requerido por meta-raspberrypi)
git clone -b scarthgap git://git.openembedded.org/meta-openembedded

Usa la misma rama (scarthgap) para los tres repositorios. Mezclar ramas es una fuente común de errores misteriosos de compatibilidad.

bash
# Inicializar el entorno de compilación
cd ~/yocto/poky
source oe-init-build-env build-rpi

Añadir capas

bash
# Añadir meta-oe (dependencia requerida por meta-raspberrypi)
bitbake-layers add-layer ../../meta-openembedded/meta-oe

# Añadir meta-python (opcional — necesario si usas paquetes Python)
bitbake-layers add-layer ../../meta-openembedded/meta-python

# Añadir meta-networking (opcional — necesario para herramientas de red)
bitbake-layers add-layer ../../meta-openembedded/meta-networking

# Añadir meta-raspberrypi
bitbake-layers add-layer ../../meta-raspberrypi

# Verificar que todas las capas estén activas
bitbake-layers show-layers

Configuración de local.conf

Edita conf/local.conf con la configuración específica de Raspberry Pi:

text
# Placa objetivo
MACHINE = "raspberrypi4-64"

# Configuración de compilación paralela (ajusta según los núcleos de tu CPU)
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"

# Generar imagen de tarjeta SD en formato wic
IMAGE_FSTYPES = "wic.bz2 wic.bmap"

# Asignación de memoria GPU (MB)
GPU_MEM = "64"

# Habilitar UART para depuración por consola serial
ENABLE_UART = "1"

# Habilitar servidor SSH (Dropbear)
IMAGE_FEATURES += "ssh-server-dropbear"

# Permitir login de root sin contraseña (solo desarrollo — deshabilitar para producción)
EXTRA_IMAGE_FEATURES += "debug-tweaks"

# Usar bootloader U-Boot
RPI_USE_U_BOOT = "1"

Valores de MACHINE soportados

MACHINEPlaca objetivoArquitectura
raspberrypi5Raspberry Pi 564-bit (aarch64)
raspberrypi4-64Raspberry Pi 464-bit (aarch64)
raspberrypi4Raspberry Pi 432-bit (armhf)
raspberrypi3-64Raspberry Pi 364-bit (aarch64)
raspberrypi3Raspberry Pi 332-bit (armhf)
raspberrypi2Raspberry Pi 232-bit (armhf)
raspberrypi0-2w-64Raspberry Pi Zero 2 W64-bit (aarch64)

Recomiendo objetivos de 64 bits para Pi 3 y más nuevas. Si apuntas a Raspberry Pi 5, hay problemas con U-Boot que resolver — consulta la guía dedicada de RPi5.

Compilación de la imagen

bash
# Compilar una imagen mínima (la huella más pequeña)
bitbake core-image-minimal

# O compilar una imagen base con más herramientas
bitbake core-image-base

# Tiempos de compilación esperados (primera ejecución):
# - 8 núcleos / 32 GB RAM:  ~1.5–2 horas
# - 4 núcleos / 16 GB RAM:  ~3–4 horas

Verificación de la salida de compilación

bash
ls tmp/deploy/images/raspberrypi4-64/

core-image-minimal-raspberrypi4-64.wic.bz2     # Imagen de tarjeta SD comprimida
core-image-minimal-raspberrypi4-64.wic.bmap    # Mapa de bloques para flasheo rápido
Image                                           # Imagen del kernel
bcm2711-rpi-4-b.dtb                            # Device tree blob

Flasheo de la tarjeta SD

bmaptool (Recomendado — Mucho más rápido)

bmaptool usa el archivo .bmap para saltarse bloques vacíos durante la escritura. Es significativamente más rápido que dd para imágenes dispersas.

bash
# Instalar bmaptool
sudo apt install bmap-tools

# Verificar qué dispositivo es tu tarjeta SD
lsblk

# Flashear la imagen (reemplaza /dev/sdX con tu dispositivo real)
cd tmp/deploy/images/raspberrypi4-64/
sudo bmaptool copy core-image-minimal-raspberrypi4-64.wic.bz2 /dev/sdX

sync

dd (Tradicional)

bash
bzcat core-image-minimal-raspberrypi4-64.wic.bz2 | sudo dd of=/dev/sdX bs=4M status=progress
sync

Arranque en Raspberry Pi

  1. Inserta la tarjeta SD en tu Raspberry Pi
  2. Conecta un monitor HDMI y teclado
  3. Conecta la alimentación y deja que arranque
  4. Cuando aparezca el prompt de login, inicia sesión como root (sin contraseña)
text
Poky (Yocto Project Reference Distro) 5.0 raspberrypi4-64 ttyAMA0

raspberrypi4-64 login: root

root@raspberrypi4-64:~# uname -a
Linux raspberrypi4-64 6.6.x-yocto-standard #1 SMP ... aarch64 GNU/Linux

root@raspberrypi4-64:~# cat /etc/os-release
NAME="Poky (Yocto Project Reference Distro)"
VERSION="5.0 (scarthgap)"

Configuración de Wi-Fi, SSH y GPIO

Habilitar Wi-Fi

Añade a conf/local.conf:

text
IMAGE_INSTALL:append = " linux-firmware-rpidistro-bcm43455 wpa-supplicant"

linux-firmware-rpidistro-bcm43455 es el firmware Wi-Fi para el chip BCM43455 de Raspberry Pi 4. Raspberry Pi 5 usa un chip Wi-Fi diferente — consulta la guía dedicada de RPi5 para eso.

Puedes preconfigurar las credenciales Wi-Fi con un archivo wpa_supplicant.conf incluido vía un .bbappend en la receta de wpa-supplicant.

Login remoto SSH

Como ya añadiste ssh-server-dropbear a IMAGE_FEATURES, SSH está listo para usar.

bash
# Verificar la dirección IP (con conexión por cable)
root@raspberrypi4-64:~# ip addr show eth0

# Conectar desde tu máquina de desarrollo
ssh root@192.168.1.xxx

En la práctica, usa SSH para todo el trabajo diario después del primer arranque. El monitor HDMI es solo para verificar el arranque inicial.

Control de GPIO

text
# Añadir herramientas GPIO a local.conf
IMAGE_INSTALL:append = " libgpiod libgpiod-tools"

Después de recompilar y reflashear:

bash
root@raspberrypi4-64:~# gpioinfo
root@raspberrypi4-64:~# gpioset -c gpiochip0 17=1    # Establecer GPIO17 en HIGH
root@raspberrypi4-64:~# gpioget -c gpiochip0 27       # Leer GPIO27

Solución de problemas

Pantalla negra — Nada en HDMI

Causa: La configuración de salida HDMI no coincide con tu monitor.

Solución: Añade a conf/local.conf:

text
HDMI_FORCE_HOTPLUG = "1"
HDMI_GROUP = "2"
HDMI_MODE = "82"

Kernel panic — not syncing

Causa: Discrepancia entre el kernel y el sistema de archivos raíz.

Solución: Recompila la imagen limpiamente y reflashea la tarjeta SD.

Imagen wic.bz2 no encontrada

Causa: IMAGE_FSTYPES no incluye wic.

Solución: Añade esto a conf/local.conf:

text
IMAGE_FSTYPES = "wic.bz2 wic.bmap"

Error INCOMPATIBLE_LICENSE

text
ERROR: xxx has incompatible license

Causa: Se incluyó un paquete con requisitos de licencia comercial.

Solución: Acepta explícitamente la licencia en local.conf:

text
LICENSE_FLAGS_ACCEPTED = "commercial"

Conclusión

Esto es lo que cubrimos:

  • meta-raspberrypi proporciona todo el soporte de placa para Raspberry Pi
  • La configuración MACHINE selecciona la placa objetivo exacta
  • El formato wic crea una imagen de tarjeta SD lista para flashear
  • bmaptool es la forma más rápida de escribir imágenes a tarjetas SD

Ahora tienes un Linux completamente personalizado ejecutándose en Raspberry Pi — sin Raspbian, sin bloatware preinstalado, solo exactamente lo que pusiste en la imagen. El mismo flujo de trabajo de Yocto escala desde prototipo hasta producción.

También se recomiendan estos libros.