Crear contenedor LXC para aplicación GUI - EALite#

El uso de contenedores en la industria del software se ha extendido ampliamente y no es de extrañar, ofrece a los desarrolladores la posibilidad de mejorar el aislamiento de sus servicios y de ahí hacerlo menos susceptible a errores por colisiones con otros servicios o conflictos de dependencias. Al mismo tiempo, son una alternativa más amigable en recursos respecto a las máquinas virtuales.

Múltiples proveedores de infraestructura para nube ofrecen la opción de desplegar los servicios a partir de un contenedor, y sin duda, facilita la distribución de entornos de desarrollo y aplicaciones.

Con estos beneficios (algo similar a lo discutido en Instalando paquetes en Linux (Mint)), procederemos a crear un contenedor para la ejecución de Enterprise Architect (la versión del visor, pero es aplicable a la versión completa). De manera oficial hay instrucciones para su uso en Linux con Wine pero la receta está incompleta (hay que agregar una instrucción más) y es mejor no ensuciar nuestro sistema de 64 bits con bibliotecas de 32 bits de manera innecesaria. Así que empecemos.

Instalar LXD#

Nuestro primer paso será instalar el paquete LXD, el cual se encuentra disponible a través de múltiples gestores de paquetes de las distribuciones Linux pero también como paquete snap. Por facilidad, usaré el paquete snap.

sudo snap install lxd

Ahora, debemos inicializar (solo es necesario la primera vez tras instalar).

sudo lxd init

En mi caso, todos los valores que son preguntados los he dejado en su valor por defecto. Personalmente, solo debería preocuparnos el tamaño de la unidad usado (en caso de tener limitaciones en espacio de almacenamiento).

Crear perfil GUI#

Por defecto, el comportamiento de los contenedores es para la ejecución de servicios y aplicaciones de consola. Por eso, la ejecución de una aplicación gráfica nos requiere una configuración adicional, que es realizar el paso al sistema gráfico de nuestro sistema hospedador.

El perfil gráfico es definido con el siguiente código (copia y pega en un nuevo archivo, lxdguiprofile.txt).

config:
  environment.DISPLAY: :0
  raw.idmap: both 1000 1000
  user.user-data: |
    #cloud-config
    runcmd:
      - 'sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf'
      - 'echo export PULSE_SERVER=unix:/tmp/.pulse-native | tee --append /home/ubuntu/.profile'
    packages:
      - x11-apps
      - mesa-utils
      - pulseaudio
description: GUI LXD profile
devices:
  PASocket:
    path: /tmp/.pulse-native
    source: /run/user/1000/pulse/native
    type: disk
  X0:
    path: /tmp/.X11-unix/X0
    source: /tmp/.X11-unix/X0
    type: disk
  mygpu:
    type: gpu
name: gui
used_by:

Ahora, crearemos el perfil:

sudo lxc profile create gui
cat lxdguiprofile.txt | sudo lxc profile edit gui

Este procedimiento, solo es necesario hacerlo la primera vez.

Obtener contenedor base#

Una vez creado el perfil, lanzaremos un contenedor usando una imagen base, es decir, sobre la cual desarrollaremos nuestra necesidad. Estas imágenes base se encuentran disponibles en la página del proyecto y son bases de múltiples distribuciones Linux, con versiones y arquitecturas diferentes.

Para nuestro fin, usaremos una base de Ubuntu 18.04 para arquitectura i386, que corresponde a 32 bits. Puedes usar otra distribución siempre y cuando disponga de la forma de instalar los paquetes necesarios y en versiones recientes (entre más reciente sea Wine, mejor).

sudo lxc launch --profile default --profile gui images:ubuntu/18.04/i386 ea

Cuando no requerimos la parte gráfica, podemos omitir --profile default --profile gui. Los dos perfiles son un proceso de herencia, primero se carga el perfil por defecto y luego se añade lo necesario para las aplicaciones gráficas.

Este procedimiento es la primera vez de cada contenedor. Si por error omitimos el perfil gráfico, tendremos que volverlo a crear. Si por un error en la especificación del contenedor lo deseamos eliminar, podemos ejecutar sudo lxc rm ea --force. El forzado es necesario para detener la ejecución del contenedor, o igual podríamos detenerlo primero, sudo lxc stop ea.

Comandos en el contenedor#

Para instalar nuestro programa en el contenedor, necesitamos ejecutar comandos en este. Para ello, tenemos lxc exec {contenedor} -- {comando}. Una forma interactiva, adecuada para pruebas, es ejecutar bash.

sudo lxc exec ea -- /bin/bash

De esta manera podemos ejecutar los comandos de la misma manera que lo hacemos en nuestro sistema, ya que estamos en el contenedor.

Si deseamos automatizar, nos interesará enviar directamente las instrucciones en lugar de bash. Ejemplo, sudo lxc exec ea -- apt update -q. Notemos que se ha usado un comando que requiere privilegios de administrador, y es porque por defecto el ingreso al contenedor es como administrador. Para hacer uso del usuario estándar debemos indicarlo de forma explícita (por defecto, tenemos el usuario ubuntu), sudo lxc exec ea -- su - ubuntu -c 'echo $(uname -a)'.

Gestionar archivos#

La gestión de archivos es realizada con los comandos file pull y file push.

Así, si deseamos enviar un archivo:

sudo lxc file push {archivo local} {contenedor}/{ruta contenedor}

Y si deseamos traer un archivo del contenedor:

sudo lxc file pull {contenedor}/{ruta contenedor} {archivo local}

Instalar EALite#

Ahora que sabemos ejecutar comandos en el contenedor, instalaremos las dependencias y finalmente EALite.

sudo lxc exec ea -- apt update -q
sudo lxc exec ea -- apt install --install-recommends -y wine-stable winetricks
sudo lxc exec ea -- apt install -y fonts-crosextra-carlito
sudo lxc exec ea -- su - ubuntu -c 'winetricks --unattended msxml3'
sudo lxc exec ea -- su - ubuntu -c 'winetricks --unattended msxml4'
sudo lxc exec ea -- su - ubuntu -c 'winetricks --unattended msxml6'
sudo lxc exec ea -- su - ubuntu -c 'winetricks --unattended mdac28'
sudo lxc exec ea -- su - ubuntu -c 'winetricks --unattended jet40'
wget http://www.sparxsystems.com.au/bin/EALite.exe
sudo lxc file push EALite.exe ea/home/ubuntu/EALite.exe
sudo lxc exec ea -- su - ubuntu -c 'wine msiexec /i EALite.exe'

En este punto, procederemos de manera gráfica a la instalación final de EALite.

Ventana de instalación gráfica de EALite.

Ventana de instalación gráfica de EALite.#

Ahora, es necesario crear un mecanismo simple para la ejecución de EA.

sudo lxc exec ea -- su - ubuntu -c 'mkdir $HOME/.local/bin'
sudo lxc exec ea -- su - ubuntu -c 'echo "wine $HOME/.wine/drive_c/Program\ Files/Sparx\ Systems/EA\ LITE/EA.exe" > $HOME/.local/bin/ealite'
sudo lxc exec ea -- su - ubuntu -c 'chmod 755 $HOME/.local/bin/ealite'

Ejecutar EALite#

Ahora, podemos usar el visor de Enterprise Architect.

sudo lxc exec ea -- su - ubuntu -c 'ealite'

Cuando iniciemos el sistema operativo, requerimos de iniciar el contenedores antes de ejecutar la instrucción anterior, sudo lxc start ea.

EA Viewer abierto.

EA Viewer abierto.#

Acceso al sistema de archivos del contenedor y no solo de la unidad de Wine.

Acceso al sistema de archivos del contenedor y no solo de la unidad de Wine.#

Puedes asegurar una forma simple de ejecutar EALite creando una rutina de lanzamiento con las dos líneas anteriores en un archivo que sea reconocido en el path.

mkdir -p $HOME/.local/bin
cat << EOF > $HOME/.local/bin/ealite
sudo lxc start ea
sudo lxc exec ea -- su - ubuntu -c 'ealite'
EOF
chmod 755 $HOME/.local/bin/ealite

La ejecución con sudo puede omitirse si se añade el usuario a un grupo que permita la ejecución de lxc. Más adelante, haré una publicación sobre como hacerlo. Por ahora, diviértete ejecutando ealite e ingresando la contraseña de administrador.

Para abrir un proyecto, recuerda usar file push y explorar dentro del contenedor.

Compartir#

Para compartir el contenedor, puedes publicarlo y exportar la imagen.

sudo lxc publish ea --alias ealite
sudo lxc image export ealite

La imagen exportada es un archivo tar.gz con el nombre asociado al fingerprint (una secuencia alfanumérica). Luego se debe importar la imagen y hacer launch nuevamente con el perfil.

También puedes exportar directamente el contenedor, lo cual es recomendable porque lleva con ello la configuración del perfil GUI y es listo para usar una vez hagas la importación.

sudo lxc export ea ea.tar.gz --optimized-storage

Referencias#