Para compilar Linux personalizado para Raspberry Pi con Yocto, clona Poky y meta-raspberrypi en la rama scarthgap, configura MACHINE = "raspberrypi4-64" en local.conf y ejecuta bitbake core-image-minimal. Flashea el .wic.bz2 resultante a una tarjeta SD y arranca.
Esta guía te lleva paso a paso por el proceso completo 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
# 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 (https://github.com/agherzan/meta-raspberrypi)
git clone -b scarthgap git://git.yoctoproject.org/meta-raspberrypi
# Descargar meta-openembedded (https://github.com/openembedded/meta-openembedded)
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.
# Inicializar el entorno de compilación
cd ~/yocto/poky
source oe-init-build-env build-rpi
Añadir capas
# 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:
# 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
| MACHINE | Placa objetivo | Arquitectura |
|---|---|---|
raspberrypi5 | Raspberry Pi 5 | 64-bit (aarch64) |
raspberrypi4-64 | Raspberry Pi 4 | 64-bit (aarch64) |
raspberrypi4 | Raspberry Pi 4 | 32-bit (armhf) |
raspberrypi3-64 | Raspberry Pi 3 | 64-bit (aarch64) |
raspberrypi3 | Raspberry Pi 3 | 32-bit (armhf) |
raspberrypi2 | Raspberry Pi 2 | 32-bit (armhf) |
raspberrypi0-2w-64 | Raspberry Pi Zero 2 W | 64-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
# 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
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.
# 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)
bzcat core-image-minimal-raspberrypi4-64.wic.bz2 | sudo dd of=/dev/sdX bs=4M status=progress
sync
Arranque en Raspberry Pi
- Inserta la tarjeta SD en tu Raspberry Pi
- Conecta un monitor HDMI y teclado
- Conecta la alimentación y deja que arranque
- Cuando aparezca el prompt de login, inicia sesión como
root(sin contraseña)
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:
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.
# 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
Añade las herramientas libgpiod a tu imagen:
# Añadir herramientas GPIO a local.conf
IMAGE_INSTALL:append = " libgpiod libgpiod-tools"
Después de recompilar y reflashear:
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:
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:
IMAGE_FSTYPES = "wic.bz2 wic.bmap"
Error INCOMPATIBLE_LICENSE
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:
LICENSE_FLAGS_ACCEPTED = "commercial"
FAQ
¿Por qué usar Yocto en vez de Raspberry Pi OS?
Raspberry Pi OS (antes Raspbian) es ideal para uso de escritorio. Pero para productos embebidos necesitas control total sobre cada paquete, sin servicios innecesarios, builds reproducibles y una superficie de ataque mínima. Yocto te da exactamente eso — compila solo lo que necesitas, nada más.
¿Cuánto tarda la primera compilación?
En una máquina de 8 núcleos con 32 GB de RAM, espera 1.5–2 horas para core-image-minimal. Las compilaciones siguientes son mucho más rápidas porque BitBake cachea los resultados intermedios. Consulta nuestra guía de optimización de velocidad de compilación para más consejos.
¿Puedo añadir mi propia aplicación a la imagen?
Sí. Escribe una receta Yocto (archivo .bb) para tu aplicación y añádela a IMAGE_INSTALL. Coloca las recetas personalizadas en tu propia capa, no en meta-raspberrypi ni en Poky.
¿meta-raspberrypi soporta módulos de cámara y pantalla?
Sí. Configura RASPBERRYPI_CAMERA_V2 = "1" o RASPBERRYPI_CAMERA_V3 = "1" en local.conf para soporte de cámara. La pantalla oficial de 7 pulgadas también funciona vía DSI. Consulta el README de meta-raspberrypi para las variables de configuración disponibles.
¿Debería usar U-Boot o arranque directo del kernel?
RPI_USE_U_BOOT = "1" (U-Boot) es recomendable para producción porque habilita esquemas de partición A/B y actualizaciones OTA. El arranque directo del kernel es más simple pero carece de estas funciones. Para prototipos o proyectos hobby, cualquiera funciona.
¿Cómo inicio automáticamente un servicio al arrancar?
Usa systemd. Escribe un archivo de unidad systemd, empaquétalo en una receta con inherit systemd y configura SYSTEMD_AUTO_ENABLE = "enable". Yocto Scarthgap usa systemd por defecto cuando configuras INIT_MANAGER = "systemd" en local.conf.
¿Puedo usar la misma imagen en Raspberry Pi 3 y 4?
No. La configuración MACHINE determina la placa objetivo, y cada modelo tiene diferentes device trees, configuraciones de bootloader y ajustes de kernel. Necesitas builds separados para Pi 3 (raspberrypi3-64) y Pi 4 (raspberrypi4-64), aunque las recetas y capas se comparten.
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.
Artículos relacionados: