Habilitar la instalación de aplicaciones en un sistema embebido
Si en un sistema Linux se activa la instalación de aplicaciones con Ubuntu Core, el sistema podrá beneficiarse de actualizaciones transaccionales, mayor seguridad y acceso a un ecosistema de aplicaciones snap.
En este artículo echamos un vistazo a las aplicaciones snap y a Ubuntu Core, antes de cargar este último en el diminuto pero formidable Intel Joule (123-9801), explorar el sistema e instalar Node-RED desde la app store y, finalmente, crear una aplicación de ejemplo para usar con una placa LimeSDR conectada.
Ten en cuenta que Ubuntu Core también puede instalarse en Raspberry Pi e Intel NUC, entre otras plataformas de hardware.
Snaps y Snappy Ubuntu Core
El software para dispositivos continúa ganando en complejidad a medida que pasa de simples aplicaciones que corren directamente sobre el hardware o, todo lo más, sobre un SO mínimo embebido con procesos de servidor, a aplicaciones que pueden integrar capacidades avanzadas a través de varios marcos de trabajo, cada uno de ellos con muchas dependencias propias.
Los paquetes Snap resuelven esta complejidad empaquetando el software de aplicaciones junto con todas sus dependencias. Esto puede parecer a primera vista un a derroche de recursos, ya que si tenemos dos aplicaciones instaladas que utilizan la misma biblioteca, habrá dos copias de esa biblioteca en el sistema. Sin embargo, esto significa que no habrá problemas si dichas aplicaciones requieren diferentes versiones de una dependencia. Además, los paquetes snap están contenidos de forma segura en su propio sistema de archivos de solo lectura, con almacenes de datos aislados.
El alto grado de separación no solo entre snaps, sino también entre estos y el sistema operativo Linux subyacente, establece una base sólida para la seguridad y estabilidad del dispositivo, además de proporcionar interfaces de tipo plug y slot para permitir la integración entre snaps donde sea necesario.
Fragmento del archivo de configuración del snap limesdr-server
En el ejemplo anterior, podemos ver repositorios de GitHub para la aplicación y las dependencias especificadas, junto con los detalles del mecanismo de creación, las opciones de configuración y la orden de creación.
Los snaps se describen como "paquetes de Linux universales", y aunque son compatibles con las versiones de escritorio "clásicas" de Ubuntu, Debian, Yocto Project, Fedora y otras distribuciones de Linux, utilizaremos el minimalista Ubuntu Core, que se ha diseñado pensando en los dispositivos embebidos, IoT y similares.
Ubuntu Core amplía la filosofía snap al sistema operativo, integrando compatibilidad con actualizaciones transaccionales y separación estricta entre el núcleo, los controladores de dispositivo, el sistema operativo en su acepción más amplia y las aplicaciones.
Actualización de firmware
En la Guía de inicio a Ubuntu en Intel Joule se indica que la BIOS debe estar actualizada a la versión #174. Es posible descargar en Intel esta versión o una posterior y las instrucciones para el flasheo.
Instalación del sistema operativo
El dispositivo tendrá que estar vinculado a una cuenta Ubuntu Single Sign-On (SSO), por lo que si no dispones de una, necesitarás registrarte.
Ubuntu Core Snappy no está disponible como instalador autónomo para Intel Joule, así que para cargarlo, procederemos a grabar una imagen normal de Ubuntu, tanto live o de instalación, arrancaremos desde ella y, a continuación, utilizaremos la línea de comandos para extraer un sistema de archivos Ubuntu Core al almacenamiento interno MMC.
Ten en cuenta que si utilizas Ubuntu para grabar a USB la imagen live/de instalación, es imprescindible que uses Startup Disk Creator y no unetbootin, ya que si utilizas este último, el dispositivo no arrancará. Están disponibles las instrucciones de uso completas para Ubuntu, Windows y Mac OS X.
Inicialmente perdimos algo de tiempo al no reconocer el Intel Joule las unidades USB Flash durante el arranque, posiblemente debido a que el concentrador USB estaba siendo utilizado o por alguna otra incompatibilidad. Así pues, vale la pena mencionar que también es posible arrancar la imagen live/de instalación desde una tarjeta Micro SD en la placa de expansión.
Arrancamos desde la tarjeta Micro SD y, a continuación, teníamos la imagen de Snappy Ubuntu Core en una unidad USB. Llegados a este punto, debemos tener en cuenta que la tarjeta SD apareció enumerada como /dev/mmcblk0, por lo que el almacenamiento interno en Joule pasó a ser /dev/mmcblk1, por lo que es preciso modificar en consecuencia el comando para extraer el sistema de archivos Core.
Reiniciamos, y pudimos comprobar que Ubuntu Core arrancaba sin problemas desde el almacenamiento interno del Joule.
A continuación se nos pidió configurar la red e introducir la dirección de correo electrónico de la cuenta de Ubuntu SSO con la que debe estar asociado este dispositivo.
Inicio de sesión SSH
Con el dispositivo en la red, ahora podíamos iniciar sesión utilizando el ID de Ubuntu SSO y ver la dirección IP a través del monitor adjunto, una vez proporcionada.
Después de iniciar sesión a través de SSH, para ver qué paquetes snap están instaladas de manera predeterminada podemos introducir:
$ snap list
Llegados a este punto, podemos instalar más paquetes snap a través de la línea de comandos, o crear un token de acceso que nos permitirá utilizar una interfaz web algo más intuitiva.
Snapweb
Si dirigimos un navegador web a la dirección IP del dispositivo, con el prefijo https y un sufijo de puerto 4201, veremos aparecer la página de control de acceso de la aplicación Snapweb.
Para generar un token para iniciar sesión en la interfaz web es necesario introducir en la línea de comandos:
$ sudo snapweb.generate-token
Una vez iniciada la sesión, podemos enumerar de nuevo la lista de los paquetes snap instalados. También podemos buscar e instalar los paquetes snap, como uno que nos proporcionará la excelente herramienta Node-RED y que nos abrirá las puertas al IoT.
Solo un clic más, y podemos volver a la terminal y usar el comando ps para confirmar que Node-RED se está ejecutando.
Si a continuación dirigimos un navegador al dispositivo y al puerto 1880, nos dará la bienvenida el editor con el que ya estamos familiarizados.
En este punto podemos empezar a crear nuevos flujos de Node-RED (aplicaciones).
Ubuntu clásico como snap
Es posible instalar el sistema operativo Ubuntu clásico como una aplicación snap y utilizar esto, entre otras cosas, para permitir el desarrollo en el dispositivo de destino. Todo lo que necesitamos es introducir:
$ snap install classic --edge --devmode
$ sudo classic
Con ello entramos en un entorno chroot y al examinar el contenido de /etc/os-release veremos que la versión es Ubuntu 16.04.02.
Sin embargo, a la hora de escribir este artículo detectamos algún que otro posible problema con la versión actual del paquete snap clásico, ya que al ejecutar comandos para instalar paquetes se produjeron errores de comprobación de firmas. Debido a ello, creamos una aplicación snap de ejemplo con la versión clásica de Ubuntu.
Creación de snaps
Crear aplicaciones snap es sumamente sencillo y se lleva a cabo mediante el software snapcraft, que se puede instalar, junto con snapd (un software que también se necesita para ejecutar snaps en Ubuntu clásico) mediante:
$ sudo apt-get install snapcraft snapd
Al incluir snapd, es posible probar primero el snap en un sistema de escritorio, y seguidamente copiarlo en el dispositivo de destino que ejecuta Snappy Ubuntu Core e instalarlo en este.
Hay una selección de paquetes snaps de ejemplo para la plataforma de SDR (radio definida por software) LimeSDR USB 3.0 disponible en GitHub. Se clonó el repositorio y se creó el snap limesdr-server. Esto permite acceder de manera transparente a una placa LimeSDR a través de la red.
$ git clone https://github.com/myriadrf/snapcraft-sandbox.git
$ cd snapcraft-sandbox/limesdr-server
$ snapcraft
Con esto, el software de la aplicación principal y todas sus dependencias se clonan desde GitHub, se crean y, a continuación, se empaquetan como una aplicación totalmente independiente.
Después, esta se puede instalar con:
$ sudo snap install --force-dangerous --devmode soapysdr-server_0.5.3.0_amd64.snap
La opción --force-dangerous es necesaria debido a que, en lugar de suministrarse a través de una tienda de aplicaciones, el snap se instala desde una fuente que no es de confianza: el sistema de archivos. la opción --devmode es una solución temporal que permite al snap obtener acceso a los periféricos de hardware (está pendiente de añadirse soporte para conectar periféricos en caliente y gestionar el acceso a ellos).
Para obtener más información de cómo empezar a crear tus propias aplicaciones snap, consulta la documentación de Snapcraft.
Almacenes personalizados, imágenes de dispositivo y mucho más
Modelo de producción Ubuntu Core Advanced
Acabamos de rascar únicamente la superficie de lo que es posible con aplicaciones snap y Ubuntu Core, con características inexploradas hasta el momento como la creación de imágenes personalizadas de Ubuntu Core que integran compatibilidad del proveedor para hardware concreto, junto con tiendas de apps de "marcas" personalizadas a las que están vinculadas las imágenes del dispositivo.
Para obtener más información sobre la habilitación de compatibilidad de Ubuntu Core para nuevos dispositivos, integración de pilas personalizadas, configuración de almacenes de marcas, modelos de producción y mucho más, consulta la documentación de Ubuntu Core.
Consulte el tutorial original escrito por Andrew Back en DesignSpark (en inglés).