Recientemente he tenido algunas conversaciones sobre Flatpak, y me gustaría hacer un post para anotar mi (escaso) conocimiento sobre Flatpak y que, quizás, pueda servir de ayuda para alguna persona que quiera tener una idea inicial sobre esta interesante tecnología.
En primer lugar, Flatpak es una tecnología para construir, distribuir e instalar aplicaciones de usuario, normalmente de escritorio. Los dos grandes objetivos perseguidos por Flatpak son:
- Distribución de aplicaciones cross-distro y cross-desktop.
- Ejecución segura de aplicaciones (sandboxing)
El primer objetivo es muy importante y su consecución puede ser considerado como un paso hacia adelante para que la industria pueda considerar GNU/Linux como una plataforma, de la misma forma que Windows o MacOS lo son actualmente. El modelo de las distribuciones de GNU/Linux tiene sus ventajas [1], como pueden ser:
- Facilidades de instalación y actualización
- Actualizaciones de seguridad
- Testeo de aplicaciones
- Respeto por las licencias de software
- Único punto de confianza
Pero también tiene sus puntos débiles:
- Barrera entre los desarrolladores y los usuarios
- No controlan cuando llegan las actualizaciones
- No controlan las dependencias
- No reciben un feedback directo de sus usuarios
- Algunas distribuciones ofrecen versiones modificadas con respecto a upstream
- Fragmentación de los usuarios (p. ej. rpm vs deb)
- Las aplicaciones menos populares pueden no estar empaquetadas en tu distro.
- No resulta atractivo para el desarrollo de software por parte de muchas compañias
Flatpak es una tecnología interesante porque resuelve las desventajas del modelo de las distribuciones, y no viene a sustituir las distribuciones, es decir, puede usarse de forma complementaria. De hecho, las principales distrubuciones actuales ya tienen soporte para flatpak (Arch, Debian, Fedora, Gentoo, Mageia, openSUSE, Solus y Ubuntu)[2][3]. La integración de flatpak en las distribuciones es bastante sencilla, y se limita a básicamente empaquetar ostree y flatpak [3]
Runtimes
Una de las críticas más comunes a las soluciones tipo "bundle" de distribución de aplicaciones, en el que la aplicación se acompaña de las dependencias que necesita, es que su uso hace que final al existan numerosas dependencias repetidas una y otra vez en el sistema. Flatpak evita esta situación mediante la creación de los llamados runtimes, que no son otra cosa que paquetes flatpak que aglutinan un conjunto de dependencias versionadas de uso común. De esta manera, las aplicaciones sólo contienen su propio código y aquellas dependencias extras a las proporcionadas por el runtime del que dependen. En la actualidad existen dos runtimes disponibles Freedesktop y GNOME (tanto versiones estables como de desarrollo) [4], y el runtime KDE que está en un avanzado estado de gestación [5]. Además, cualquier otra organización podría realizar sus propio runtime para el desarrollo de sus aplicaciones.
El uso de runtimes, además de solucionar el problema de la duplicidad de dependencias, también libera a los desarrolladores de la tarea de distribución de actualizaciones de seguridad de las dependencias.
Usando flatpak desde la línea de comandos
Veamos algunos comandos básicos para el consumo de paquetes flatpak [6]. En primer lugar, deberemos de instalar los repositorios de los runtimes y/o aplicaciones que queremos usar.
Los repositorios se describen a través de ficheros con el formato .flatpakrepo. Se trata de un sencillo fichero de texto con varios campos: título, comentario, url del repositorio, clave GPG (opcional) y la página web del proyecto.
En este caso vamos a instalar el repositorio de los runtimes de desarrollo de GNOME y un repositorio de aplicaciones basados en este repositorio.
Los repositorios se describen a través de ficheros con el formato .flatpakrepo. Se trata de un sencillo fichero de texto con varios campos: título, comentario, url del repositorio, clave GPG (opcional) y la página web del proyecto.
[Flatpak Repo] Title=GNOME Nightly Runtime Comment=Nightly GNOME Runtime Description=GNOME develops essential free software applications suited for daily
desktop usage. This includes browsing photos, playing music, managing your files,
surfing the web and much more. This repository includes development builds of the
GNOME runtime. Url=https://sdk.gnome.org/nightly/repo/ GPGKey=mQENBFYSUcEBCAC50sRVDy40A0mF Homepage=https://www.gnome.org/
En este caso vamos a instalar el repositorio de los runtimes de desarrollo de GNOME y un repositorio de aplicaciones basados en este repositorio.
$ flatpak remote-add --from gnome-nightly https://sdk.gnome.org/gnome-nightly.flatpakrepo
$ flatpak remote-add --from gnome-apps-nightly https://sdk.gnome.org/gnome-apps-nightly.flatpakrepo
Una vez instalados, podemos listar los paquetes flatpak que se incluyen en cada repositorio
$ flatpak remote-ls gnome-nightly
org.gnome.Platform
org.gnome.Platform.Locale
org.gnome.Sdk
org.gnome.Sdk.Debug
org.gnome.Sdk.Locale
$ flatpak remote-ls gnome-apps-nightly
...
org.gnome.Builder
org.gnome.Builder.Debug
org.gnome.Builder.Locale
....
Vemos que existen runtimes .Sdk, que son los que se usan para desarrollar aplicaciones, frente a los .Platform que son los que se usan para su consumo. Los runtimes con extensión .Locale añáden información de internalización y los .Debug incluyen los símbolos y código necesario para permitir su depuración. Se trata de una simple convención usada en este repositorio.
Cuando instalamos una aplicación, flatpak es capaz de instalar la(s) dependencia(s) flatpak que le hace falta si la(s) localiza en alguno de los repositorios instalados.
$ flatpak install gnome-apps-nightly org.gnome.Builder
Required runtime for org.gnome.Builder/x86_64/master (org.gnome.Sdk/x86_64/master) is not installed, searching...
Found in remote gnome-nightly, do you want to install it? [y/n]: y
Installing: org.gnome.Sdk/x86_64/master from gnome-nightly
20 delta parts, 153 loose fetched; 336691 KiB transferred in 60 seconds
Installing: org.gnome.Sdk.Locale/x86_64/master from gnome-nightly
5 metadata, 1 content objects fetched; 13 KiB transferred in 5 seconds
Installing: org.gnome.Builder/x86_64/master from gnome-apps-nightly
1 delta parts, 6 loose fetched; 5543 KiB transferred in 8 seconds
Installing: org.gnome.Builder.Locale/x86_64/master from gnome-apps-nightly
5 metadata, 1 content objects fetched; 6 KiB transferred in 5 seconds
flatpak usa OSTree para distribuir y desplegar los paquetes. Los repositorios usan el format de OSTree y se pueden gestionar con la utilidad ostree. Tanto la instalación y la actualizaciones de runtimes y aplicaciones se realizan mediante OSTree, y son similares hasta cierto punto a realizar operaciones git clone y pull. El uso de OSTree permite actualizaciones incrementales (deltas) y atómicas y la posibilidad de volver a versiones anteriores.
$ flatpak update org.gnome.Builder
Looking for updates...
Updating: org.gnome.Sdk/x86_64/master from gnome-nightly
1 metadata, 0 content objects fetched; 313 B transferred in 2 seconds
Now at 1f350a3602ed.
Updating: org.gnome.Sdk.Locale/x86_64/master from gnome-nightly
1 metadata, 0 content objects fetched; 313 B transferred in 2 seconds
Now at a030de5ab9e8.
Updating: org.gnome.Builder/x86_64/master from gnome-apps-nightly
1 metadata, 0 content objects fetched; 313 B transferred in 3 seconds
Now at bfceaed2149b.
Updating: org.gnome.Builder.Locale/x86_64/master from gnome-apps-nightly
1 metadata, 0 content objects fetched; 313 B transferred in 2 seconds
Now at ad0bdabc26e2.
flatpak usa OSTree para distribuir y desplegar los paquetes. Los repositorios usan el format de OSTree y se pueden gestionar con la utilidad ostree. Tanto la instalación y la actualizaciones de runtimes y aplicaciones se realizan mediante OSTree, y son similares hasta cierto punto a realizar operaciones git clone y pull. El uso de OSTree permite actualizaciones incrementales (deltas) y atómicas y la posibilidad de volver a versiones anteriores.
$ flatpak update org.gnome.Builder
Looking for updates...
Updating: org.gnome.Sdk/x86_64/master from gnome-nightly
1 metadata, 0 content objects fetched; 313 B transferred in 2 seconds
Now at 1f350a3602ed.
Updating: org.gnome.Sdk.Locale/x86_64/master from gnome-nightly
1 metadata, 0 content objects fetched; 313 B transferred in 2 seconds
Now at a030de5ab9e8.
Updating: org.gnome.Builder/x86_64/master from gnome-apps-nightly
1 metadata, 0 content objects fetched; 313 B transferred in 3 seconds
Now at bfceaed2149b.
Updating: org.gnome.Builder.Locale/x86_64/master from gnome-apps-nightly
1 metadata, 0 content objects fetched; 313 B transferred in 2 seconds
Now at ad0bdabc26e2.
Una vez instalado, podemos ejecutarlo con el siguiente comando.
$ flatpak run org.gnome.Builder
Instalación simplificada con .flatpakref
El uso habitual de Flatpak consiste en lo que hemos visto, configurar unos repositorios que tienen las aplicaciones, e instalarlar las aplicaciones a través de la línea de comandos o través de un instalador gráfico. Sin embargo, existe ocasiones en las es conveniente proporcionar un simple enlace en una web que nos instale la aplicación. Flatpak permite esto a través de los ficheros .flatpakref. Estos ficheros son muy similares a los ficheros .flatpakrepo que hemos visto anteriormente, pero con la diferencia que además se indica la aplicación que se quiere instalar.
Estos ficheros se pueden instalar mediante un click (que abrirá gnome-software para su instalación) o a través de la línea de comandos:
Referencias
El uso habitual de Flatpak consiste en lo que hemos visto, configurar unos repositorios que tienen las aplicaciones, e instalarlar las aplicaciones a través de la línea de comandos o través de un instalador gráfico. Sin embargo, existe ocasiones en las es conveniente proporcionar un simple enlace en una web que nos instale la aplicación. Flatpak permite esto a través de los ficheros .flatpakref. Estos ficheros son muy similares a los ficheros .flatpakrepo que hemos visto anteriormente, pero con la diferencia que además se indica la aplicación que se quiere instalar.
Estos ficheros se pueden instalar mediante un click (que abrirá gnome-software para su instalación) o a través de la línea de comandos:
$ flatpak install https://download.mono-project.com/repo/monodevelop.flatpakref
This application depends on runtimes from:
http://sdk.gnome.org/repo/
Configure this as new remote 'gnome' [y/n]: y
Installing: com.xamarin.MonoDevelop/x86_64/stable
Required runtime for com.xamarin.MonoDevelop/x86_64/stable (org.freedesktop.Platform/x86_64/1.4) is not installed, searching...
Found in remote gnome, do you want to install it? [y/n]: y
Installing: org.freedesktop.Platform/x86_64/1.4 from gnome
9 delta parts, 29 loose fetched; 89585 KiB transferred in 22 second
Installing: org.freedesktop.Platform.Locale/x86_64/1.4 from gnome
5 metadata, 1 content objects fetched; 13 KiB transferred in 5 seconds
Installing: com.xamarin.MonoDevelop/x86_64/stable from com.xamarin.MonoDevelop-origin
946 metadata, 3063 content objects fetched; 127987 KiB transferred in 53 seconds
Referencias
[1] https://mclasen.fedorapeople.org/devconf-flatpak.pdf
[2] http://flatpak.org/getting.html
[3] https://solus-project.com/2017/01/18/adopting-flatpak-to-reassemble-third-party-applications/
[4] http://flatpak.org/runtimes.html
[5] https://community.kde.org/Guidelines_and_HOWTOs/Flatpak
[6] https://blogs.gnome.org/alexl/2016/10/25/new-flatpak-command-line/
[6] https://blogs.gnome.org/alexl/2016/10/25/new-flatpak-command-line/