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
# 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.
# 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ñ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"
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.
- Guía dedicada de Raspberry Pi 5 — correcciones de U-Boot y soluciones para Wi-Fi
- Escribir recetas — empaqueta tus propias aplicaciones en imágenes
- Guía de inicio — revisita los fundamentos
También se recomiendan estos libros.