32blogby Studio Mitsu

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.

by omitsu9 min read

This article contains affiliate links.

Contenido

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

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 (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.

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

Añade las herramientas libgpiod a tu imagen:

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"

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: