Flatpaks y Snaps en el centro
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:
- Aplicaciones de escritorio como Firefox: https://snapcraft.io/firefox
- Aplicaciones para el shell como BPytop: https://snapcraft.io/bpytop
- Servicios como LXD https://snapcraft.io/lxd o Nextcloud https://snapcraft.io/nextcloud
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:
- Snap speed improvements with new compression algorithm!
- Why LZO was chosen as the new compression method
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
Los 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:
- El SO y todo el software base se instala en formato
.deb
desde los repositorios oficiales. - 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 osnap
.
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ónsnap
y otraflatpak
. 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ónflatpak
que he declarado como preferible? Pues de momento no porque como se puede ver en la página de descargas de Blender el paquetesnap
es oficial y en cambio el paqueteflatpak
está construido por terceros. Así que utilizamos el paquetesnap
. - 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
aflatpak
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.