Flatpaks y Snaps en el centro

per Victor Carceler darrera modificació 2021-02-24T17:50:16+01:00

Este curso la distribución utilizada en los ordenadores del centro es Ubuntu 20.04 LTS la última versión con soporte a largo plazo por lo tanto la mayoría del software está instalado a partir de los repositorios oficiales mediante paquetes .deb.

Aunque para atender las necesidades de los diferentes grupos se instala mucho software, se intenta no añadir repositorios externos para mantener la integridad del software instalado. El único respositorio externo de paquetes .deb que se utiliza en todos los equipos es el que corresponde a GNS3. Y, de manera experimental en un aula, el repositorio de Podman.

Todos los equipos están gestionados por Ansible —los playbooks utilizados están en: https://github.com/vcarceler/playbooks-ubuntu2004— y la mayoría del software instalado está definido en: https://github.com/vcarceler/playbooks-ubuntu2004/blob/master/roles/software-2004/tasks/main.yml.

En general los respositorios oficiales de Ubuntu 20.04 incluyen cualquier aplicación que necesitamos y se encargan de publicar actualizaciones que el paquete unattended-upgrades aplica automáticamente.

La lista de paquetes exacta se va adaptando a las necesidades pero en estos momentos el software base de los ordenadores del centro tiene instalados 2752 paquetes .deb.

Es posible consultar la lista de paquetes instalados con la sentencia:

$ apt list --installed

Formatos de paquetes universales

Los paquetes .deb —o los paquetes .rpm o en general los que se utilizan en cualquier distribución— solo sirven para una versión concreta de una distribución.

Tomemos como ejemplo la versión 86 de Firefox que se publicó ayer. De momento en los ordenadores del centro todavía está instalada la versión 85.0.1 pero es de suponer que próximamente se actualizará a la versión 86. Para que esto ocurra deberá publicarse un nuevo paquete de esta aplicación para Ubuntu 20.04 y para cada una de las otras versiones en las que Ubuntu quiera ofrecer Firefox 86.

Evidentemente lo mismo deberá ocurrir en Fedora y en cualquier otra distribución que ofrezca la nueva versión del navegador.

Cada uno de esos paquetes estará hecho pensando en una versión concreta de una distribución de GNU/Linux porque en cada una de ellas habrá diferentes versiones de las bibliotecas que la aplicación necesita.

Las distribuciones de GNU/Linux se construyen a partir de un gran repositorio de software en cierto formato que el usuario puede utilizar con gran facilidad. Es un modelo que funciona y está muy extendido pero requiere un gran trabajo para construir todos esos paquetes que debe repetirse para cada versión de cada distribución.

Un formato de paquetes universal que se pueda instalar en cualquier distribución de software libre es una idea interesante para complementar el software base o incluso —en el caso de las distribuciones inmutables como Fedora Silverblue— instalar todas las aplicaciones del usuario.

Curiosamente al mencionar los formatos de paquetes universales todo el mundo se olvida de Zero Install que es el precursor de las opciones más modernas y no solo es universal en cuanto a las distribuciones sino también multiplataforma.

Más conocido es AppImage, un formato de paquete universal en el que cada aplicación es un fichero que el usuario puede descargar y ejecutar. Es el formato en el que se distribuye la versión para GNU/Linux de Subsurface —el mismo Linus Torvalds ha dicho sobre AppImage: "This is just very cool."— u otras aplicaciones como Krita.

Pero la verdadera competencia entre los paquetes universales en GNU/Linux está entre el formato snap y flatpak.

Paquetes snap y flatpak

Desde el punto de vista del usuario ambos ofrecen una funcionalidad similar: paquetes que se pueden instalar en cualquier distribución y actualizar de manera transaccional sin riesgo para el software base. Además en ambos casos las aplicaciones se ejecutan en el interior de una sandbox para evitar accesos inadecuados.

Pero estas herramientas se basan en tecnologías diferentes.

Los paquetes snap

Los paquetes snap son un desarrollo de Canonical —que es la empresa matriz de Ubuntu— y permiten empaquetar cualquier tipo de aplicación:

Cada paquete snap es un fichero que contiene una imagen SquashFS —un sistema de ficheros comprimido de solo lectura—. Cuando se instala el paquete acaba en el directorio /var/lib/snapd/snaps y se monta utilizando un dispositivo de bucle en su propio directorio bajo /snap.

Las actualizaciones son automáticas y transaccionales pudiendo revertir a la versión anterior si hay algún problema.

Como ejemplo la instalación de Firefox se puede realizar con el comando:

root@dpt-inf-27:~# time snap install firefox
firefox 85.0.2-1 from Mozilla✓ installed

real	0m29,312s
user	0m0,268s
sys	0m0,090s
root@dpt-inf-27:~#

Técnicamente funcionan de manera impecable. Es cierto que hay un pequeño retraso la primera vez que se abre la aplicación debido a la descompresión de la imagen SquashFS pero no resulta demasiado molesto. Aún así, para mejorar esta pequeña espera, se cambió el algoritmo de compresión de XZ a LZO.

Más información sobre el cambio de algoritmo de compresión:

Después de utilizar este formato durante varios años la única objeción que tengo no es técnica, es filosófica. Para mí el problema con este formato de paquetes es que el único repositorio que se puede utilizar para las aplicaciones es el repositorio controlado por Canonical y no resulta posible montar ningún repositorio alternativo.

Los paquetes flatpak

https://upload.wikimedia.org/wikipedia/commons/1/1a/Flatpak_logo.pngLos paquetes flatpak son un desarrollo de Alexander Larsson. También se pueden instalar en cualquier distribución de GNU/Linux, realizan actualizaciones transaccionales que no alteran el software base del sistema y ejecutan las aplicaciones en su propio sandbox utilizando un sistema de permisos para que el usuario pueda especificar qué operaciones se aceptan. Este formato está centrado en aplicaciones de escritorio y no soporta servicios o herramientas para el terminal.

En este caso la distribución del software se hace utilizando OSTree. Esta herramienta, que se autodefine como un git para ficheros binarios, guarda todos los ficheros en un repositorio —que es /var/lib/flatpak/repo para el sistema aunque cada usuario puede tener su repositorio local— indexados por contenido. El repositorio deduplica automáticamente los ficheros que se agregan.

A partir del repositorio se utilizan enlaces duros para recrear el software instalado en /var/lib/flatpak/app.

Como ejemplo la instalación de Firefox se puede realizar con el comando:

root@dpt-inf-27:~# time flatpak install https://dl.flathub.org/repo/appstream/org.mozilla.firefox.flatpakref

org.mozilla.firefox permissions:
    ipc                    network                  pcsc                          pulseaudio        x11        devices        file access [1]
    dbus access [2]        bus ownership [3]        system dbus access [4]

    [1] xdg-download
    [2] org.a11y.Bus, org.freedesktop.FileManager1, org.freedesktop.Notifications, org.freedesktop.ScreenSaver, org.gnome.SessionManager, org.gtk.vfs.*
    [3] org.mpris.MediaPlayer2.firefox.*
    [4] org.freedesktop.NetworkManager


        ID                                   Branch          Op          Remote           Download
 1. [✓] org.mozilla.firefox.Locale           stable          i           flathub           1,4 MB / 45,4 MB
 2. [✓] org.mozilla.firefox                  stable          i           flathub          81,1 MB / 82,2 MB

Installation complete.

real	0m7,407s
user	0m3,439s
sys	0m1,145s
root@dpt-inf-27:~#

En este caso al abrir la aplicación desde el escritorio no hay ningún retraso y si se quiere abrir la aplicación desde el terminal es necesario hacerlo así:

$ flatpak run org.mozilla.firefox

Con flatpak se puede utilizar el repositorio de aplicaciones Flathub https://flathub.org/home— o cualquier otro.

¿Qué formato de paquete utilizar?

En el momento de escribir el playbook de Ansible que controla el software en nuestras máquinas hay que decidir qué formato de paquete se utilizará para cada herramienta.

Los nuevos formatos de paquete abren la puerta a instalar herramientas que no están en los repositorios oficiales sin tener que añadir un repositorio PPA que es algo que no me gusta nada. Así por ejemplo instalar los editores atom o vscode se convierte en una tarea trivial e inofensiva y estas herramientas se irán actualizando automáticamente aunque haya pasado cualquier barbaridad con el gestor de paquetes apt, como puede suceder cuando el usuario apaga o reinicia la máquina en mitad de una actualización. Estos apagados o reinicios durante actualizaciones snap o flatpak no causan ningún problema.

En 2018 escribí el módulo de Ansible para paquetes snap. Eso quiere decir que en aquel entonces ya utilizábamos estos paquetes y en todo este tiempo no puedo recordar ningún problema asociado a su uso. De hecho, desde que comenzamos a utilizar snaps han ido ganando aceptación y pasaron a utilizarse también para aplicaciones que sí están en los respositorios .deb pero para las que no se publican las nuevas versiones (salvo corrección de bugs y fallos de seguridad). Me estoy refieriendo a aplicaciones como Gimp, Inkscape o VLC.

Y finalmente al probar de manera intensiva durante este curso los paquetes flatpak y comprobar que también funcionan de manera impecable he pasado a considerarlos una mejor opción por la simple cuestión de que los snap obligan a utilizar el repositorio de Canonical y no permiten alternativa. Además el formato flatpak ha ido ganando mucha aceptación entre los desarrolladores y cada vez son más aplicaciones las que publican su propio paquete en este formato.

Así el criterio para elegir el formato en el que se instala una aplicación puede ser:

  1. El SO y todo el software base se instala en formato .deb desde los repositorios oficiales.
  2. Para aquellas aplicaciones que se quiera tener la última versión (o que no estén en los repos oficiales) se instalará la versión flatpak preferentemente o snap.

Aún así hay que tener en cuenta que pueden darse muchas circunstancias diferentes, por ejemplo:

  • Blender está en los repositorios .deb y tiene una versión snap y otra flatpak. La versión .deb es la 2.82 y en estos momentos la aplicación va por la versión 2.92 así que es preferible utilizar uno de los nuevos paquetes. ¿Tal vez la versión flatpak que he declarado como preferible? Pues de momento no porque como se puede ver en la página de descargas de Blender el paquete snap es oficial y en cambio el paquete flatpak está construido por terceros. Así que utilizamos el paquete snap.
  • Firefox es el navegador recomendado y ayer se publicó la versión 86 que ya está disponible en formato flatpak. Bueno, si fuera más lanzado pasaría la aplicación de .deb a flatpak pero algo me dice que no va a pasar nada por esperar unos días a que se publique la nueva versión del navegador en formato .deb.

Paquetes snap y flatpak instalados en el centro

Después de repasar el software instalado y cambiar varias aplicaciones de formato snap a flatpak para expresar mi nuevo gusto por este último formato la cosa ha quedado así:

vcarceler@dpt-inf-27:~$ snap list
Name                             Version                     Rev    Tracking         Publisher           Notes
beekeeper-studio                 1.9.4                       74     latest/stable    matthew-rathbone    -
blender                          2.91.2                      65     latest/stable    blenderfoundation✓  classic
brave                            1.20.103                    98     latest/stable    brave               -
chromium                         88.0.4324.182               1497   latest/stable    canonical✓          -
code                             622cb03f                    55     latest/stable    vscode✓             classic
core                             16-2.48.2.1                 10823  latest/stable    canonical✓          core
core18                           20210128                    1988   latest/stable    canonical✓          base
core20                           20201210                    904    latest/stable    canonical✓          base
dotnet-sdk                       5.0.103                     112    latest/stable    dotnetcore✓         classic
eclipse                          2019-12                     48     latest/stable    snapcrafters        classic
gnome-3-28-1804                  3.28.0-19-g98f9e67.98f9e67  145    latest/stable    canonical✓          -
gnome-3-34-1804                  0+git.3556cb3               66     latest/stable/…  canonical✓          -
godot-bare                       1.0                         6      latest/stable    godot-developers✓   base
godot-runtime                    1.0                         11     latest/stable    godot-developers✓   -
gtk-common-themes                0.1-50-gf7627e4             1514   latest/stable/…  canonical✓          -
intellij-idea-educational        2020.3.2                    30     latest/stable    jetbrains✓          classic
jupyter                          1.0.0                       6      latest/stable    projectjupyter✓     -
kalgebra                         18.12.3                     23     latest/stable    kde✓                -
kde-frameworks-5-core18          5.61.0                      32     latest/stable    kde✓                -
kde-frameworks-5-qt-5-14-core18  5.68.0                      4      latest/stable    kde✓                -
kmplot                           20.04.0                     62     latest/stable    kde✓                -
kotlin                           1.4.30                      56     latest/stable    jetbrains✓          classic
lxd                              4.11                        19389  latest/stable    canonical✓          -
netbeans                         12.2                        41     latest/stable    apache-netbeans✓    classic
node                             12.19.0                     3292   12/edge          iojs✓               classic
node-red                         1.2.9                       675    latest/stable    noderedteam✓        -
pdftk                            2.02-4                      9      latest/stable    smoser              -
snap-store                       3.38.0-59-g494f078          518    latest/stable/…  canonical✓          -
snapd                            2.48.2.1                    11036  latest/stable    canonical✓          snapd
umbrello                         19.12.3                     41     latest/stable    kde✓                -
vcarceler@dpt-inf-27:~$

30 paquetes snap que están instalados en /var/lib/snapd/snaps (algunos tienen varias versiones) y sobre OpenZFS con la compresión lz4 activada consumen 6.6GiB.

Las aplicaciones instaladas como flatpak son:

vcarceler@dpt-inf-27:~$ flatpak list
Name                                               Application ID                                    Version             Branch            Installation
OpenBoard                                          ch.openboard.OpenBoard                            1.5.4               stable            system
calibre                                            com.calibre_ebook.calibre                         5.11.0              stable            system
Sequeler                                           com.github.alecaddd.sequeler                      0.8.0               stable            system
PDF Arranger                                       com.github.jeromerobert.pdfarranger               1.7.0               stable            system
OBS Studio                                         com.obsproject.Studio                             26.1.1              stable            system
Sweet Home 3D                                      com.sweethome3d.Sweethome3d                       6.4                 stable            system
Peek                                               com.uploadedlobster.peek                          1.5.1               stable            system
PDF Mix Tool                                       eu.scarpetta.PDFMixTool                           0.6                 stable            system
Natron                                             fr.natron.Natron                                  2.3.15              stable            system
Atom                                               io.atom.Atom                                      1.54.0              stable            system
Brackets                                           io.brackets.Brackets                              1.14.1              stable            system
DBeaver Community                                  io.dbeaver.DBeaverCommunity                       7.3.5               stable            system
Qalculate! (GTK+ UI)                               io.github.Qalculate                               3.17.0              stable            system
BlueJ                                              org.bluej.BlueJ                                   4.2.2               stable            system
darktable                                          org.darktable.Darktable                           3.4.1               stable            system
Flameshot                                          org.flameshot.Flameshot                           0.8.5               stable            system
SWH                                                org.freedesktop.LinuxAudio.Plugins.swh            0.4.17              20.08             system
Freedesktop Platform                               org.freedesktop.Platform                          19.08.13            19.08             system
Freedesktop Platform                               org.freedesktop.Platform                          20.08.5             20.08             system
default                                            org.freedesktop.Platform.GL.default                                   19.08             system
default                                            org.freedesktop.Platform.GL.default                                   20.08             system
Intel                                              org.freedesktop.Platform.VAAPI.Intel                                  19.08             system
Intel                                              org.freedesktop.Platform.VAAPI.Intel                                  20.08             system
openh264                                           org.freedesktop.Platform.openh264                 2.1.0               2.0               system
Freedesktop SDK                                    org.freedesktop.Sdk                               19.08.13            19.08             system
Freedesktop SDK                                    org.freedesktop.Sdk                               20.08.5             20.08             system
Programa de retoc d'imatges de GNU                 org.gimp.GIMP                                     2.10.22             stable            system
Manual                                             org.gimp.GIMP.Manual                                                  2.10              system
GNOME Application Platform version 3.36            org.gnome.Platform                                                    3.36              system
GNOME Application Platform version 3.38            org.gnome.Platform                                                    3.38              system
Godot                                              org.godotengine.Godot                             3.2.3               stable            system
Inkscape                                           org.inkscape.Inkscape                             1.0.2               stable            system
jamovi                                             org.jamovi.jamovi                                 1.6.10              stable            system
Adwaita theme                                      org.kde.KStyle.Adwaita                                                5.15              system
KDE Application Platform                           org.kde.Platform                                                      5.15              system
KDE Software Development Kit                       org.kde.Sdk                                                           5.15              system
KBruch                                             org.kde.kbruch                                    20.12.2             stable            system
KCalc                                              org.kde.kcalc                                     20.12.2             stable            system
Kdenlive                                           org.kde.kdenlive                                  20.12.2             stable            system
Kig                                                org.kde.kig                                       20.12.2             stable            system
Krita                                              org.kde.krita                                     4.4.2               stable            system
KTouch                                             org.kde.ktouch                                    20.12.2             stable            system
LibreOffice                                        org.libreoffice.LibreOffice                       7.1.0.3             stable            system
LibrePCB                                           org.librepcb.LibrePCB                             0.1.5               stable            system
MuseScore                                          org.musescore.MuseScore                           3.6.2               stable            system
GNU Octave                                         org.octave.Octave                                 6.2.0               stable            system
Shotcut                                            org.shotcut.Shotcut                               21.01.29            stable            system
VLC                                                org.videolan.VLC                                  3.0.12              stable            system
vcarceler@dpt-inf-27:~$

47 paquetes que están instalados en el repositorio /var/lib/flatpak/repo y sobre OpenZFS con la compresión lz4 activada consumen 6.2GiB de disco.