Constructor de imágenes Debian / RaspiOS para Raspberry Pi
Made with Bash CodeFactor License: MIT Raspberry Pi
Genera imágenes .img listas para flashear en tarjeta SD
- Matrices de soporte
- Imágenes precompiladas
- Dependencias
- Configuración rápida
- Variables de entorno
- Opciones avanzadas
- config.txt — configuración persistente
- Proxy y caché APT
- Ejemplos de uso
- Contenedor Docker
- Flashear la imagen
- Debugging
Sistema operativo ×ばつ Release
×ばつ Release" href="#sistema-operativo--release">| OS | Release | Familia | Estado | Notas |
|---|---|---|---|---|
debian |
buster |
Debian 10 | Usa archive.debian.org + backports |
|
debian |
bullseye |
Debian 11 | Usa archive.debian.org |
|
debian |
bookworm |
Debian 12 | ✅ Stable | non-free-firmware separado |
debian |
trixie |
Debian 13 | 🧪 Testing | ftp.debian.org |
raspios |
buster |
RaspiOS 10 | Kernel raspberrypi-kernel |
|
raspios |
bullseye |
RaspiOS 11 | Kernel raspberrypi-kernel |
|
raspios |
bookworm |
RaspiOS 12 | ✅ Stable | Kernel raspberrypi-kernel |
raspios |
trixie |
RaspiOS 13 | 🧪 Testing | Kernel upstream linux-image-rpi-* |
Arquitectura ×ばつ Hardware
×ばつ Hardware" href="#arquitectura--hardware">| Arquitectura | Pi 3B/3B+ | Pi 4B | Pi 5 | Notas |
|---|---|---|---|---|
arm64 |
✅ | ✅ | ✅ | Recomendado para Pi 4 y Pi 5 |
armhf |
✅ | ✅ | ✅ | Necesario para compatibilidad 32-bit |
| Variante | Descripción | Tamaño aprox. |
|---|---|---|
slim |
Sistema mínimo sin docs ni man pages | ~350 MB |
lite |
Sistema base con SSH, WiFi, Bluetooth | ~550 MB |
full |
Entorno de escritorio ligero (LightDM + Xorg) | ~900 MB |
| OS | Release | Variante | Arch | Imagen | Hash |
|---|---|---|---|---|---|
| Debian | Bullseye | Lite | 64-bit | ⬇ .img.xz | sha256 |
| Debian | Bullseye | Lite | 32-bit | ⬇ .img.xz | sha256 |
| RaspiOS | Bullseye | Lite | 64-bit | ⬇ .img.xz | sha256 |
| RaspiOS | Bullseye | Lite | 32-bit | ⬇ .img.xz | sha256 |
El script instala automáticamente todo lo necesario en el host. Requiere un host basado en Debian o Ubuntu.
binfmt-support dosfstools rsync wget
lsof git parted dirmngr
e2fsprogs systemd-container debootstrap xz-utils
kmod udev dbus gnupg
gnupg-utils debian-archive-keyring
qemu-user-static (o qemu-user-binfmt en Debian 13+ / Ubuntu 26.04+)
Versión mínima de debootstrap:
1.0.105(añade soporte para trixie/sid).
Si tu sistema tiene una versión anterior, instala desde backports:sudo apt-get install -t $(lsb_release -cs)-backports debootstrap
# Imagen por defecto: debian bookworm lite arm64 sudo ./rpi-img-builder.sh # RaspiOS bookworm arm64 comprimido en xz sudo OS="raspios" RELEASE="bookworm" COMPRESS="xz" ./rpi-img-builder.sh # Debian trixie arm64 con paquetes extra sudo RELEASE="trixie" ADDPKG="nano htop tmux" ./rpi-img-builder.sh
| Variable | Default | Valores | Descripción |
|---|---|---|---|
OS |
debian |
debian raspios |
Sistema operativo base |
RELEASE |
bookworm |
buster bullseye bookworm trixie |
Release de Debian/RaspiOS |
VARIANT |
lite |
slim lite full |
Variante del sistema |
ARCHITECTURE |
arm64 |
arm64 armhf |
Arquitectura de la imagen |
sudo OS="raspios" RELEASE="bookworm" VARIANT="lite" ARCHITECTURE="arm64" ./rpi-img-builder.sh
| Variable | Default | Descripción |
|---|---|---|
FSTYPE |
ext4 |
Sistema de archivos de la partición root (ext4 o f2fs) |
BOOT_MB |
136 (old/mid) / 256 (bookworm+) |
Tamaño de la partición boot en MiB |
FREE_SPACE |
256 |
Espacio libre adicional en la partición root (MiB) |
# Imagen con sistema de archivos f2fs y 512 MiB libres en root sudo FSTYPE="f2fs" FREE_SPACE="512" ./rpi-img-builder.sh
⚠️ f2fses experimental. No usar con Pi 3 en combinación con kernels muy antiguos.
| Variable | Default | Descripción |
|---|---|---|
HOST_NAME |
rpi |
Nombre del host |
DNS |
8.8.8.8 |
Servidor DNS (usado cuando no hay DHCP definido) |
IPV4 |
— | IP estática (requiere también NETMASK, ROUTER, DNS) |
NETMASK |
— | Máscara de red |
ROUTER |
— | Puerta de enlace |
# Configuración de red estática sudo IPV4="192.168.1.50" NETMASK="255.255.255.0" ROUTER="192.168.1.1" DNS="1.1.1.1" ./rpi-img-builder.sh
| Variable | Default | Descripción |
|---|---|---|
WPA_ESSID |
— | Nombre de la red WiFi |
WPA_PASSWORD |
— | Contraseña WiFi (mínimo 8 caracteres para WPA2) |
WPA_COUNTRY |
00 |
Código de país para regulación de frecuencias (ISO 3166-1 alpha-2) |
sudo WPA_ESSID="MiRed" WPA_PASSWORD="mipassword" WPA_COUNTRY="ES" ./rpi-img-builder.sh
Para redes abiertas (sin contraseña), define solo
WPA_ESSID. Se configurarákey_mgmt=NONEautomáticamente.
| Variable | Default | Descripción |
|---|---|---|
ROOT_PASSWORD |
raspberry |
Contraseña de root y del usuario pi |
TIMEZONE |
Europe/Madrid |
Zona horaria (timedatectl list-timezones) |
LOCALES |
es_ES.UTF-8 |
Locale del sistema |
sudo ROOT_PASSWORD="s3cur3!" TIMEZONE="Europe/London" LOCALES="en_GB.UTF-8" ./rpi-img-builder.sh
| Variable | Default | Valores | Descripción |
|---|---|---|---|
COMPRESS |
none |
none gzip xz |
Comprimir imagen al finalizar |
ADDPKG |
— | Lista de paquetes | Paquetes adicionales a instalar |
sudo COMPRESS="xz" ADDPKG="nano htop curl jq" ./rpi-img-builder.sh
Genera un fichero .manifest con todos los paquetes y versiones instalados en la imagen. Útil para auditorías, reproducibilidad y comparar builds.
sudo MANIFEST="true" ./rpi-img-builder.sh # Genera: debian-bookworm-lite-arm64.img.manifest
El script detecta automáticamente apt-cacher-ng en el puerto 3142. También se puede configurar manualmente:
# Deshabilitar proxy aunque apt-cacher-ng esté activo sudo PROXY_URL="" ./rpi-img-builder.sh # Usar proxy externo sudo PROXY_URL="http://proxy.lan:3142" ./rpi-img-builder.sh
El proxy también se activa dentro del chroot durante el build (en etc/apt/apt.conf.d/66proxy) y se elimina automáticamente al finalizar.
Las claves de Raspberry Pi se descargan directamente desde las URLs oficiales. Si necesitas forzar una URL diferente (entorno air-gapped con mirror interno):
# Sobreescribir las URLs de descarga de claves export PIOS_KEY_URL="http://mirror.interno/raspberrypi.gpg.key" export RASP_KEY_URL="http://mirror.interno/raspbian.public.key" sudo ./rpi-img-builder.sh
Activa set -x y guarda un log completo de la ejecución:
sudo ./rpi-img-builder.sh --debug
# Genera: rpi-img-builder.log en el directorio actualSi el host ya es arm64 (por ejemplo, una Raspberry Pi 4/5 con Debian), no se necesita QEMU para arm64 — el script lo detecta automáticamente.
Para compilar armhf desde un host arm64, QEMU binfmt_misc debe tener el handler qemu-arm activo:
update-binfmts --enable qemu-arm
sudo ARCHITECTURE="armhf" ./rpi-img-builder.shEn lugar de pasar todas las variables por entorno, puedes crear un fichero config.txt en el mismo directorio del script. Se carga automáticamente antes de ejecutar nada.
# config.txt — ejemplo sysadmin completo OS="raspios" RELEASE="bookworm" ARCHITECTURE="arm64" VARIANT="lite" FSTYPE="ext4" BOOT_MB="256" FREE_SPACE="512" HOST_NAME="rpi-prod-01" ROOT_PASSWORD="c4mb14m3!" COMPRESS="xz" TIMEZONE="Europe/Madrid" LOCALES="es_ES.UTF-8" ADDPKG="nano htop tmux rsync curl jq sudo" WPA_ESSID="LabNet" WPA_PASSWORD="labpassword" WPA_COUNTRY="ES" IPV4="10.0.0.50" NETMASK="255.255.255.0" ROUTER="10.0.0.1" DNS="10.0.0.1" MANIFEST="true"
Las variables de
config.txttienen precedencia sobre los defaults del script pero son sobreescritas por variables de entorno explícitas en la llamada.
Para builds repetidos, apt-cacher-ng puede reducir el tiempo de compilación significativamente al cachear los paquetes descargados:
# Instalar apt-cacher-ng en el host sudo apt-get install apt-cacher-ng sudo systemctl enable --now apt-cacher-ng # El script lo detecta automáticamente en el puerto 3142 sudo ./rpi-img-builder.sh
sudo ./rpi-img-builder.sh
sudo OS="raspios" RELEASE="bookworm" COMPRESS="xz" ./rpi-img-builder.sh
sudo RELEASE="trixie" \ ARCHITECTURE="armhf" \ HOST_NAME="rpi-trixie" \ IPV4="192.168.10.200" \ NETMASK="255.255.255.0" \ ROUTER="192.168.10.1" \ DNS="1.1.1.1" \ ADDPKG="nano htop tmux" \ COMPRESS="xz" \ ./rpi-img-builder.sh
wget https://github.com/FrangaL/rpi-img-builder/raw/master/rpi-img-builder.sh chmod +x rpi-img-builder.sh cat > config.txt << 'EOF' OS="debian" RELEASE="bookworm" ARCHITECTURE="arm64" VARIANT="lite" HOST_NAME="rpi4-server" ROOT_PASSWORD="s3cur3p4ss" COMPRESS="xz" TIMEZONE="Europe/Madrid" LOCALES="es_ES.UTF-8" ADDPKG="nano htop tmux curl jq" MANIFEST="true" EOF sudo ./rpi-img-builder.sh
Para builds en entornos CI/CD o sistemas donde no quieres modificar el host:
wget https://git.io/rpi-images-builder.yml docker-compose -f rpi-images-builder.yml --compatibility up -d docker exec -it rpi-images git pull # Build con variables de entorno docker exec -it rpi-images bash -c \ "OS=raspios RELEASE=bookworm COMPRESS=xz ./rpi-img-builder.sh" # Copiar imagen generada al host docker cp rpi-images:/images/raspios-bookworm-lite-arm64.img.xz .
Conecta la tarjeta SD al lector. Verifica el dispositivo correcto con lsblk antes de continuar — una selección incorrecta sobreescribe datos del sistema.
# Verificar el dispositivo correcto lsblk -o NAME,SIZE,MODEL,TRAN | grep -E "sd|mmcblk"
# Imagen comprimida en xz (más rápido con tuberías) xzcat raspios-bookworm-lite-arm64.img.xz | \ sudo dd of=/dev/sdX bs=64k oflag=dsync status=progress # Imagen comprimida en gz gzip -dc debian-bookworm-lite-arm64.img.gz | \ sudo dd of=/dev/sdX bs=64k oflag=dsync status=progress # Imagen sin comprimir sudo dd if=debian-bookworm-lite-arm64.img \ of=/dev/sdX bs=64k oflag=dsync status=progress # Alternativa con pv para barra de progreso más legible xzcat raspios-bookworm-lite-arm64.img.xz | pv | sudo dd of=/dev/sdX bs=64k oflag=dsync
# Ejecución con log completo sudo ./rpi-img-builder.sh --debug # El log se guarda en rpi-img-builder.log tail -f rpi-img-builder.log
Si el build falla a mitad, el directorio de trabajo queda en:
./{OS}_{RELEASE}_{VARIANT}_{ARCHITECTURE}/
Para forzar una nueva compilación bórralo manualmente:
sudo rm -rf ./debian_bookworm_lite_arm64/