Por qué Ubuntu Core (y cuándo no usarlo)

Imagina que armaste un sensor de temperatura con tu Raspberry Pi y un BME280. Funciona perfecto en tu escritorio, en Raspberry Pi OS, con todo el ecosistema de apt y pip a mano. Ahora viene la parte difícil: ese mismo Pi tiene que vivir en una bodega industrial, sin teclado, sin pantalla, sin alguien que recuerde correr apt upgrade cada dos semanas. Si la SD falla, si alguien tropieza con el cable, si el firmware se corrompe a medio update, el equipo queda fuera de línea y nadie se entera.

Ese es exactamente el problema que Ubuntu Core resuelve. No es una distro pensada para hobbistas: es una versión inmutable de Ubuntu, basada en transacciones, con updates atómicos y rollback automatico cuando algo falla. Todo lo que corre dentro vive empaquetado en snaps sandboxeados, con permisos declarativos para acceder al hardware. La contracara es que ya no puedes instalar paquetes con apt ni librerías con pip directo en el sistema: para que tu código toque el bus I2C o el GPIO, tienes que construir un snap y declarar qué hardware necesita.

En este tutorial vas a recorrer ese flujo completo en una Raspberry Pi: flashear Ubuntu Core, configurar acceso SSH con Ubuntu One, instalar un dashboard pre construido que lee un sensor BME280 vía Blinka (la capa de compatibilidad de CircuitPython para Linux), y entender cómo se conectan los plugs y slots que sandboxean el hardware. Al final vas a saber decidir si Ubuntu Core te sirve para tu próximo despliegue, o si te conviene quedarte en Pi OS Lite con un cron que haga apt update y rece.

Dashboard ambiental con BME280 mostrando temperatura y humedad en Raspberry Pi

Hardware que vas a necesitar

Ubuntu Core 24 soporta Raspberry Pi 3, 4 y 5. La Pi 5 tiene la ventaja de GPIO más ágil y un controlador I2C más limpio, pero cualquiera de las tres anda. Lo importante es no usar microSD truchas: el sistema de archivos inmutable + las transacciones de snap escriben más que Pi OS normal, y una SD mala se nota rápido.

Raspberry Pi 5 con 4GB de RAM, plataforma principal para Ubuntu Core IoT

Para el sensor vas a usar un BME280 (temperatura + humedad + presión) conectado por I2C. Si tu BME280 no tiene conector Qwiic/Stemma QT, puedes cablearlo con 4 jumpers (VCC, GND, SDA al GPIO 2, SCL al GPIO 3). Si tienes un breakout con conector JST SH (Stemma QT), conéctalo a un breakout Pi Stemma para no soldar.

Sensor BME280 I2C/SPI Bosch para temperatura, humedad y presión

Importante: vas a necesitar una segunda computadora corriendo Ubuntu (no Windows ni macOS) para compilar los snaps que se instalan en el Pi. Puede ser una segunda Raspberry Pi con Ubuntu Server 24.04, o una notebook con Ubuntu instalado. Esa máquina la vas a usar solo para snapcraft pack y para flashear la SD.

Setup paso a paso

1. Crear cuenta Ubuntu One y subir clave SSH

Ubuntu Core no te deja crear usuarios locales con contraseña: el modelo de acceso es 100% por SSH con clave pública, vinculada a una cuenta Ubuntu One. Antes de tocar el Pi, ve a login.ubuntu.com desde tu computadora secundaria y crea una cuenta.

En la misma computadora, genera un par de claves SSH dedicado para este Pi (no reuses la clave que usas para GitHub):

Bash
mkdir -p ~/.ssh
chmod 700 ~/.ssh
cd ~/.ssh/
ssh-keygen -t rsa

Cuando el wizard pregunte el nombre del archivo, escribe id_ubuntucore (o el nombre que quieras). Te recomiendo poner una passphrase: es un segundo factor por si la clave privada se filtra. Vas a obtener dos archivos: id_ubuntucore (privado, nunca compartir) e id_ubuntucore.pub (público, listo para subir).

Ahora sube la clave pública. Ve a https://login.ubuntu.com/ssh-keys, abre id_ubuntucore.pub con cat o un editor, copia todo el contenido, pégalo en el formulario de import y haz clic en Import SSH Key. Este paso es crítico: el primer boot del Pi descarga las claves desde tu cuenta Ubuntu One, así que si no están arriba, no puedes entrar.

2. Flashear Ubuntu Core 24 en la microSD

Usa Raspberry Pi Imager (la app oficial). En el menú de OS no busques Ubuntu Core directo: ve a Other general purpose OSUbuntu → scrollea hasta abajo y elige Ubuntu Core24. El selector de hardware tiene que coincidir con tu modelo (3, 4 o 5).

Deja que termine el flasheo y la verificación, eyecta la SD, métela en el Pi, conecta monitor HDMI, teclado USB, y enchufa la fuente. El primer boot tarda varios minutos y se reinicia solo a la mitad. Al final aparece Press enter to configure.

3. Configurar red y cuenta

En el menú de red, elige wlan0 para WiFi o eth0 para cable. Para WiFi: Edit Wifi en el submenú de wlan0, Choose a visible network, elige tu SSID e ingresa la contraseña. Cuando se conecte, la opción Done se activa.

La pantalla final te pide el email de tu cuenta Ubuntu One. Es el momento en que Ubuntu Core descarga la clave pública SSH que subiste antes. Si te equivocas de email o no subiste la clave, la única salida es re flashear.

Cuando termina, te muestra algo como:

Código
This device is registered to [ubuntu-sso-email-address]

Remote access was authenticated with SSO user [username].
Public SSH keys were added to the device for remote access.

[ubuntu-sso-email-address] can connect remotely to this device via SSH:

ssh [username]@[ip-address]

Anota el username y la IP. Desde tu computadora secundaria, prueba:

Bash
# Activate the key in your terminal session
ssh-add ~/.ssh/id_ubuntucore
ssh [username]@[ip-address]

# OR specify the keyfile with argument
ssh -i ~/.ssh/id_ubuntucore [username]@[ip-address]

Si entra, puedes desconectar el teclado y la pantalla del Pi: de acá en adelante todo es por SSH.

Demo: dashboard del BME280 en kiosco

La idea de la demo es simple: un snap corre un mini servidor web en localhost:8080 que sirve un HTML con las lecturas del BME280, y otro snap llamado wpe-webkit-mir-kiosk muestra esa página a pantalla completa en el HDMI. El sandbox de Ubuntu Core hace que ninguno de los dos tenga acceso al I2C por defecto: hay que conectar los plugs del snap a los slots del sistema.

Instalar el kiosco

Desde la sesión SSH al Pi:

Bash
snap install ubuntu-frame wpe-webkit-mir-kiosk

Apenas termina, el monitor HDMI muestra una página web por defecto. Eso confirma que el compositor de pantalla y el navegador headless arrancaron correctamente.

Bajar el snap del dashboard

El snap bme280-dashboard_0.1_arm64.snap no está en la Snap Store: es un build local que vas a copiar desde tu computadora secundaria. Descárgalo del link de Adafruit y copialo por scp:

Bash
# Run on your main computer to copy the snap file to the Ubuntu Core device
scp -i [keyfile] bme280-dashboard_0.1_arm64.snap [username]@[hostname-or-ip]:/home/[username]/

# example:
scp -i ~/.ssh/id_ubuntucore bme280-dashboard_0.1_arm64.snap foamyguy@bluepi:/home/foamyguy/

Instalar el snap fuera de la store

Snap no deja instalar archivos arbitrarios por defecto. Necesitas dos banderas: --dangerous (saltea la verificación de firma de la store) y --devmode (afloja restricciones del sandbox para poder tocar GPIO sin un gadget snap custom).

Bash
sudo snap install ./bme280-dashboard_0.1_arm64.snap --dangerous --devmode

Conectar los plugs al slot del I2C

Acá viene el concepto central de Ubuntu Core. Tu snap declara que necesita el bus I2C y el plug hardware-observe, pero por defecto no los recibe. Hay que conectarlos a mano (o automatizar la conexión con un gadget snap, que es lo que harías en producción).

Bash
sudo snap connect bme280-dashboard:i2c pi:i2c-1
sudo snap connect bme280-dashboard:hardware-observe

Una vez conectados, puedes probar que el sensor responde con el comando de test del snap:

Bash
sudo bme280-dashboard.blinka-test

Vas a ver lecturas de temperatura, humedad y presión actualizándose. Ctrl+C para salir.

Apuntar el kiosco al dashboard

Finalmente, dile al navegador headless que cambie la URL por defecto por el servidor del dashboard:

Bash
snap set wpe-webkit-mir-kiosk url=http://localhost:8080/

En segundos, la pantalla HDMI cambia del Ubuntu Core por defecto al dashboard con las lecturas en vivo del BME280.

Cómo construir tu propio snap (mapa conceptual)

La guía original de Adafruit dedica una página completa al proceso de empaquetado con snapcraft. Sin entrar en el YAML completo, los puntos clave son:

  • El proyecto se define en snap/snapcraft.yaml: nombre, versión, base (core24), confinement (devmode para desarrollo, strict para producción), apps que expone, y la lista de plugs que necesita (i2c, hardware-observe, network-bind, etc).
  • Las dependencias de Python (Blinka, Flask, adafruit circuitpython-bme280) se declaran en un requirements.txt que snapcraft instala dentro del snap en el momento del pack.
  • snapcraft pack compila todo en un archivo .snap que es básicamente un squashfs con un manifest.
  • Para producción, quieres mover de --devmode a strict confinement, y armar un gadget snap custom que conecte los plugs al slot del I2C automaticamente en el primer boot. Eso te ahorra los snap connect manuales en cada despliegue.

El repositorio de ejemplo de la guía tiene todo el snapcraft.yaml, el servidor Flask y el código que consulta el BME280 con Blinka. Si nunca trabajaste con snapcraft, considera pasar primero por un snap hello world antes de meterte con I2C.

Variantes y mejoras

  1. Reemplazar el BME280 por un DS18B20 o DHT22: si solo te interesa temperatura, un DS18B20 es más barato y usa 1-Wire en vez de I2C. Vas a tener que cambiar el plug i2c por gpio y la librería Blinka por adafruit-circuitpython-dht. El resto del snap (Flask + kiosco) queda igual.

  2. Enviar datos a un broker MQTT en vez de mostrarlos en pantalla: si tu Pi vive en una bodega sin monitor, el dashboard en kiosco no sirve de mucho. Reemplaza el servidor Flask por un cliente MQTT que publique las lecturas cada 30 segundos a un broker (Mosquitto en otra Pi, o un servicio cloud). Solo tienes que cambiar el plug network-bind por network.

  3. Estación meteorológica multi sensor: combina el BME280 con un anemómetro analógico (vía MCP3008 por SPI) y un sensor de luz BH1750 (también I2C). Vas a necesitar agregar el plug spi y modificar el HTML del dashboard para mostrar los 4 valores.

  4. Comparar contra Pi OS Lite + systemd: si nunca vas a tener una flota de más de 5 dispositivos, la complejidad de Ubuntu Core + snapcraft probablemente no te paga. Pi OS Lite + un servicio systemd con Restart=always + unattended-upgrades te da el 80% del valor sin ningún snap. Haz el ejercicio antes de comprometerte.

Personalización para Chile

Todo este proyecto se arma con piezas que MechatronicStore mantiene en stock. Si la guía original de Adafruit lista breakouts y fuentes específicas de su catálogo, usa estos equivalentes locales (los SKU exactos hay que confirmarlos con la búsqueda del catálogo MS, porque la corrida automatica de detección de productos no estuvo disponible en este turno):

  • Raspberry Pi 5 (4 GB) o, si presupuesto aprieta, Raspberry Pi 4 Model B (4 GB). La Pi 3 también funciona pero el dashboard en kiosco se siente lento.
  • Tarjeta microSD 32 GB clase 10 (mínimo). Para producción, mira tarjetas industriales A1/A2.
  • Sensor BME280 I2C (módulo genérico chino o el Adafruit oficial. el código es el mismo).
  • Fuente USB-C 5V 3A para Pi 4 y 5, o cargador micro USB 5V 2.5A para Pi 3.
  • Cable micro HDMI a HDMI 2 m para Pi 4 y 5 (la salida de pantalla cambió a micro HDMI), o cable HDMI estándar para Pi 3.
  • Jumpers hembra hembra 20 cm (4 unidades) si tu BME280 no es Qwiic.

Equivalencias frente a la guía original: si Adafruit menciona el Pi Stemma QT Breakout, en Chile puedes salvarlo con jumpers F-F directos al header. El Pi Stemma facilita la vida pero no es indispensable. Las fuentes oficiales Raspberry Pi tienen reemplazos genéricos de la misma corriente que cumplen para uso de hobby; para producción 24/7 conviene una fuente de calidad con UL/CE.

Recursos

Versión chilena con componentes en stock local en MechatronicStore.