sdm es un gestor de imágenes de tarjetas SD para Raspberry Pi que te permite automatizar y repetir todo lo que normalmente harías a mano: usuarios, claves SSH, paquetes, cifrado y más. En lugar de configurar cada tarjeta manualmente, personalizas una imagen base una sola vez y luego grabas tantas tarjetas idénticas como necesites.
En esta publicación muestro cómo instalar y usar sdm para crear una imagen de RaspiOS cifrada que puedes desbloquear por SSH, y luego grabarla en una tarjeta SD.
Requisitos
Para ejecutar sdm necesitas:
- La última versión de
systemd-nspawn - La imagen de RaspiOS que deseas personalizar, por ejemplo:
2025-12-04-raspios-trixie-arm64-lite.img.
Instalación
Una instalación típica se ve así:
| |
Personalizar la imagen
Después de leer la documentación sobre Cifrado de Disco y plugins, realizo la siguiente personalización:
| |
Este comando sdm --customize personaliza una imagen de RasPiOS Trixie ARM64 lite de la siguiente forma:
- Expande el sistema de archivos raíz y regenera las claves host de SSH
- Configura el swap, crea un usuario, instala una clave SSH y ajusta los parámetros del demonio SSH
- Configura el cifrado completo del sistema de archivos raíz con desbloqueo SSH en initramfs y red estática
- Desactiva piwiz y reinicia después de la personalización
Desglose detallado
Parámetros globales:
customize: Personaliza el archivo de imagen especificado.host rpi-1: Establece el nombre de host como rpi-1.plugin-debug: Habilita la salida de depuración de los plugins.expand-root: Expande el sistema de archivos raíz al primer arranque.regen-ssh-host-keys: Regenera las claves host SSH en el primer arranque para que cada dispositivo tenga claves únicas.restart: Reinicia la imagen después de finalizar la personalización.- Imagen objetivo:
2025-12-04-raspios-trixie-arm64-lite.img.
Plugins
swap:"filesize=2048|zramsize=1024": Configura un archivo swap de 2 GB y un dispositivo zram de 1 GB mediante el plugin de swap.user:"deluser=pi|adduser=user|uid=4321|password=12345|addgroup=sudo": Elimina el usuario por defectopi, crea un nuevo usuariousercon UID 4321, establece su contraseña y lo agrega al gruposudo.copyfile:"from=...|to=...|chown=user:user|chmod=600|mkdirif": Copia una clave pública SSH dentro de la imagen comoauthorized_keyspara la cuenta del usuario, creando el directorio.sshsi es necesario, y ajustando los permisos.sshd:"password-authentication=yes|port=62626": Configura el daemon SSH para permitir autenticación por contraseña y escuchar en el puerto 62626.cryptroot:"ssh|authkeys=...|crypto=xchacha|ipaddr=...|gateway=...|netmask=...|dns=...": Configura el cifrado completo del sistema de archivos raíz con LUKS, habilita el desbloqueo SSH en initramfs, usa cifrado xchacha y define red estática para el initramfs.network:"ifname=eth0|ipv4-static-ip=...|ipv4-static-gateway=...": Establece una IP estática paraeth0en el sistema en ejecución.disables:piwiz: Desactiva el asistente de primer iniciopiwizpara que no solicite teclado ni usuario al arrancar.
Cifrar la tarjeta SD (rootfs)
Durante la personalización invocamos el plugin
cryptroot, por lo tanto, ahora solo es necesario grabar la imagen en la tarjeta SD situada en/dev/sdb:1sudo sdm --burn /dev/sdb 2025-12-04-raspios-trixie-arm64-lite.imgPrimer arranque: se ejecuta
sdm-auto-encrypty el sistema se reinicia.- El servicio ejecuta
sdm-cryptconfig --sdm ... --reboot, que actualizainitramfs,cmdline.txt,fstabycrypttab.
- El servicio ejecuta
Segundo arranque: se abre el prompt de initramfs; ejecuta
sdmcryptfs.- El sistema cae a (initramfs). Conecta un disco auxiliar mayor al espacio usado y ejecuta:
1(initramfs) sdmcryptfs /dev/mmcblk0 /dev/sdY- Sustituye
/dev/mmcblk0por el disco del sistema y/dev/sdYpor el disco auxiliar. - Sigue las instrucciones para cifrar y desbloquear el rootfs. Luego escribe
exitpara continuar el arranque.
Arranque final: rootfs cifrado activo.
El sistema ahora pedirá la contraseña en cada inicio.
Si SSH está habilitado, puedes desbloquear remotamente iniciando sesión comorootal IP del initramfs durante el arranque.