[Linux] A Flatpak

Áttekintjük az elméleti alapjait és az alapvető parancssori működést valamint néhány hasznos alkalmazást.

Elméleti áttekintés

A napokban szakítottam időt arra, hogy kicsit alaposabban utánajárjak a Flatpak működésének. Ezt a friss tudást szeretném most megosztani veletek :)
Az első oldalon áttekintjük a Flatpak elméleti alapjait, a második oldalon az alapvető parancssori működést nézzük meg, a harmadikon pedig bemutatok néhány hasznos Flatpak alkalmazást.

Mi az a Flatpak?

A Flatpak egy Linuxos alkalmazáscsomagolási- és terjesztési rendszer. Célja, hogy megkönnyítse az alkalmazások terjesztését úgy, hogy közben a biztonságot is növeli. A Flatpak segítségével a szoftverfejlesztők disztribúciófüggetlen, konténerizált csomagokat készíthetnek alkalmazásaikból, amiket a felhasználók bármely olyan Linux disztribúcióra feltelepíthetnek, amely támogatja a Flatpakot (és manapság gyakorlatilag mindegyik disztribúció támogatja).

Hogyan működik?

A Flatpak felépítését az alábbi ábra szemlélteti (közbeszerezve a hivatalos dokumentációból):

A rendszer alapvetően két nagy részre osztható:

a runtime-ok biztosítják az alkalmazások futásához szükséges összetevők (függvények) zömét. Minden Flatpak alkalmazás ezekből építkezik. A runtime-ok által nem tartalmazott függőségeket a fejlesztők elhelyezik a Flatpak csomagban, de törekszenek rá, hogy ilyenből minél kevesebb legyen. Néha előfordul az is, hogy sem a Flatpak csomag, sem egyik runtime sem tartalmaz egy függőséget, ez esetben a fejlesztők jelzik a felhasználók felé, hogy az alkalmazás működéséhez telepíteniük kell az adott csomagot a disztribúció csomagkezelőjével.
Runtime-ból csupán néhány létezik, ezek közül a jelentősebbek az alábbiak:

A Freedesktop runtime tartalmazza az asztali alkalmazásokhoz szükséges legalapvetőbb összetevőket (D-Bus, GLib, PulseAudio, X11, Wayland, stb.), néhány kiegészítőt, illetve olyan részeket, amelyek segítségével a fejlesztők további kiegészítőket adhatnak hozzá.

A Freedesktop runtime részei:
org.freedesktop.Platform
org.freedesktop.Sdk
org.freedesktop.Platform.Locale (kiegészítő)
org.freedesktop.Sdk.Debug (kiegészítő)
org.freedesktop.Sdk.Locale (kiegészítő)
org.freedesktop.Sdk.Docs (kiegészítő)
org.freedesktop.Platform.GL (kiegészítő)
org.freedesktop.Platform.GL.nvidia (kiegészítő)
org.freedesktop.Platform.VulkanLayer (kiegészítő)
org.freedesktop.Platform.GStreamer (kiegészítő)
org.freedesktop.Platform.Icontheme (kiegészítő)
org.gtk.Gtk3theme (kiegészítő)
org.freedesktop.Platform.VAAPI.Intel (kiegészítő)
org.freedesktop.Platform.openh264 (kiegészítő)
org.freedesktop.Platform.ffmpeg (kiegészítő)

A GNOME runtime a GNOME alkalmazásohoz futásához szükséges összetevőket tartalmazza.
org.gnome.Platform
org.gnome.Sdk
org.gnome.Platform.Locale (kiegészítő)
org.gnome.Sdk.Debug (kiegészítő)
org.gnome.Sdk.Locale (kiegészítő)
org.gnome.Sdk.Docs (kiegészítő)

A KDE runtime a KDE programok futásához szükséges Qt és KDE összetevőket tartalmazza.
org.kde.Platform
org.kde.Sdk
org.kde.Platform.Locale (kiegészítő)
org.kde.Sdk.Debug (kiegészítő)
org.kde.Sdk.Locale (kiegészítő)
org.kde.Sdk.Docs (kiegészítő)

Az elementary runtime pedig az elementary OS programjaihoz szükséges.
io.elementary.Platform
io.elementary.Sdk
io.elementary.Platform.Locale (kiegészítő)
io.elementary.Sdk.Debug (kiegészítő)
io.elementary.Sdk.Locale (kiegészítő)
io.elementary.Sdk.Docs (kiegészítő)

Ezeken kívül létezik még néhány kisebb runtime (pl. az adw-gtk3 témának saját runtime-ja van).

a runtime-okra épülve pedig ott vannak az alkalmazások, az adataik, és az esetleges olyan függőségek, amiket a runtime-ok nem tudnak biztosítani - mindezek becsomagolva egy Flatpak csomagba.

Amikor egy olyan Flatpak alkalmazást töltünk le, amelynek szüksége van egy runtime-ra, akkor a rendszer letölti a szükséges runtime-ot is. Egy adott runtime verzióból egy időben csak egy példány lehet a gépünkön, így ha ismét letöltünk egy alkalmazást, ami ugyanazt a runtime-ot igényli, akkor a rendszer nem tölti le ismét, hanem a már letöltöttet fogja használni.
Az, hogy a Flatpak alkalmazások a lehető leginkább disztribúció-függetlenek legyenek, csak úgy érhető el, hogy ha a Flatpak rendszer a legminimálisabb mértékben támaszkodik a disztribúciókra. Emiatt a Flatpaknak semmilyen más függősége nincs a disztribúció felé, mint maga 'flatpak' nevű csomag, ami a Flatpak csomagok műkődéséhez szükséges összetevőket és parancssori eszközöket tartalmazza, és ami manapság részét képezi majd minden Linux disztribúciónak.
Az, hogy a Flatpak rendszer próbál a lehető legfüggetlenebb lenni a disztrótól, egyben azt is jelenti, hogy ha egy Flatpak alkalmazásnak pl. a Gnome 47-es függvényekre van szüksége, és a gépünkön Gnome 47 fut, a Flatpak akkor is le fogja tölteni a Flatpakos Gnome 47 runtime-ot, mert nem támaszkodhat a gépünkön lévő Gnome-ra.
Emiatt a Flatpak alkalmazásoknak általánosságban nagyobb a helyfoglalásuk. Elég gyakran előfordul az, hogy letöltünk egy Flatpak alkalmazást, az hozza magával az 1 GB-os Gnome runtime-ot, az 500 MB-os Mesat, és mondjuk az 50 MB-os Intel VAAPI drivert, így egy pár száz MB-os programból gyorsan 1,5-1,7 GB-os lesz. Természetesen, ha letöltünk egy másik alkalmazást, aminek szintén ugyanaz a verziójú Gnome rumtime, Mesa és VAAPI driver kell, akkor a rendszer már nem fogja még egyszer letölteni ezeket a csomagokat.
Ez épp olyan, mint ha egy adott asztali környezet alatt elkezdenénk egy másik asztali környezethez tartozó programokat használni (mondjuk Gnome alatt KDE-s programokat). Itt annyi előnye van a Flatpaknak, hogy nem a rendszercsomagok közé ékelődik be, és könnyebb eltávolítani az a pár Flatpak runtime-ot, mint ha a rendszercsomagok közül kellene kibogarászni a másik asztali környezet csomagjait.

Sebesség

Ha már a méretproblémákról szó esett, itt ragadnám meg az alkalmat, hogy beszéljek a Flatpak másik jellemző hátrányáról, az alkalmazások indulási sebességéről. Ugyanis a Flatpak alkalmazások lassabban startolnak, mint hagyományos társaik. Némelyiknél egészen kicsi a különbség, míg másoknál érezhetően nagyobb, főleg, ha HDD-s gépünk van.
Természetesen minél újabb és nagyobb teljesítményű géppel rendelkezünk, ez az indulási "delay" annál kevésbé érzékelhető.

Biztonság, sandboxing

A Flatpak alkalmazások biztonságát az adja, hogy ún. sandbox-ban futnak. A sandbox egyfajta konténer, ami azt jelenti, hogy az alkalmazás alapvetően csak a sandboxban lévő futó processzeket látja, csak az ugyanabban a sandboxban lévő fájlokhoz, könyvtárakhoz és hálózati megosztásokhoz fér hozzá, csak a sandboxnak átadott eszközöket látja, és így tovább.
Felhasználói oldalról nagyon pontosan szabályozhatjuk egy Flatpak alkalmazás jogosultságait. Meghatározhatjuk, hogy milyen könyvtárakhoz férhet hozzá, milyen típusú eszközöket érhet el, mely rendszerösszevetőket használhatja, stb. Szükség esetén egyes erőforrások exportálhatók a sandboxból a rendszerbe, ezeket 'exportoknak' nevezzük. Itt olyanokra kell gondolni, mint desktop fájlok, ikonok, stb.

Itt hívnám fel azonban a figyelmet arra, hogy a Flatpak sanboxing megoldása nem helyettesíti a felhasználói tudatosságot!
Sok Flatpak alkamazásnak "gyárilag" eléggé tágan vannak meghatározva a jogosultságai, tehát gyakran láthatunk olyat, hogy az alkalmazás hozzáfér a teljes /home könyvtárunkhoz, vagy a teljes fájlrendszerhez, esetleg olyan eszközökhöz vagy fájlokhoz, amikhez látszólag semmi köze. Mindig nézzük meg, hogy milyen jogosultságokra tart igényt az alkalmazás, és ha kell, nyugodtan korlázottuk a hozzáféréseit! Legfeljebb funkcióvesztést tapasztalunk, de hát valamit, valamiért...
A később bemutatott Flatseal programmal a jogosultságok vezérlését nagyon egyszerűen megtehetjük.

Portálok

A portálok egyfajta "kapuk", amelyek a Flatpak alkalmazásokat összekötik a külvilággal, biztonságos és szabályozott módon.
Az igény a portálok megalkotására akkor keletkezett, amikor a fejlesztők szerették volna elérni, hogy a sandboxolt alkalmazásokban megjelenő fájlkiválasztó ablakok pontosan úgy nézzenek ki és úgy működjenek, mint a rendszer ablakai. Ekkor találták ki azt a megoldást, hogy ne az alkalmazás nyissa meg a fájlkiválasztó ablakot, hanem kérje meg a rendszert egy meghatározott interfészen keresztül, hogy nyújtson számára egy ilyen ablakot, és amikor a felhasználó az ablakban a "Megnyitás" gombra kattint, akkor a rendszer adja vissza az ablakban kiválasztott fájlok nevét és elérési útját az alkalmazás számára. Később ez a megoldás további portálokkal bővült, és xdg-desktop-portal néven Freedesktop szabvánnyá vált.
Csak érdekességképp, jelenleg az alábbi portálok léteznek. A backend interfészek a portálokhoz tartozó kéréseket kezelik, ezek végzik el a tényleges munkát, ezeket külön folyamatok biztosítják. Pl. egy a screenshot portál esetén a frontend portál érintkezik a felhasználóval, a backend portál pedig elkészíti és visszadja a képernyőket a frontend portál számára.

org.freedesktop.portal.Account — Portál a felhasználói információk lekéréséhez.
org.freedesktop.portal.Background — Portál az automatikus indítás és a háttértevékenységek engedélyezéséhez.
org.freedesktop.portal.Camera — Portál a kamera eléréséhez.
org.freedesktop.portal.Device — Portál eszközök eléréséhez.
org.freedesktop.portal.Documents — Dokumentum portál.
org.freedesktop.portal.DynamicLauncher — Portál alkalmazásindítók telepítéséhez.
org.freedesktop.portal.Email — Portál e-mailek küldéséhez.
org.freedesktop.portal.FileChooser — Fájlválasztó portál.
org.freedesktop.portal.FileTransfer — Portál fájlok átviteléhez alkalmazások között.
org.freedesktop.portal.Flatpak.UpdateMonitor — Flatpak frissítéseket figyelő portál.
org.freedesktop.portal.Flatpak — Flatpak portál.
org.freedesktop.portal.GameMode — Portál a GameMode eléréséhez.
org.freedesktop.portal.Inhibit — Portál a munkamenet-átmenetek tiltásához.
org.freedesktop.portal.Location — Portál helyadatok lekéréséhez.
org.freedesktop.portal.MemoryMonitor — Memóriafigyelő portál.
org.freedesktop.portal.NetworkMonitor — Hálózatfigyelő portál.
org.freedesktop.portal.Notification — Portál értesítések küldéséhez.
org.freedesktop.portal.OpenURI — Portál URI-k megnyitásához.
org.freedesktop.portal.PowerProfileMonitor — Teljesítményprofil-figyelő portál.
org.freedesktop.portal.Print — Portál nyomtatáshoz.
org.freedesktop.portal.ProxyResolver — Proxy információk lekérése.
org.freedesktop.portal.Realtime — Portál szálak valós idejű futtatásához.
org.freedesktop.portal.RemoteDesktop — Távoli asztal portál.
org.freedesktop.portal.Request — Közös kéréskezelő interfész.
org.freedesktop.portal.ScreenCast — Képernyőmegosztási portál.
org.freedesktop.portal.Screenshot — Portál képernyőképek készítéséhez.
org.freedesktop.portal.Secret — Portál alkalmazás-titkok lekéréséhez.
org.freedesktop.portal.Session — Közös munkamenet-kezelő interfész.
org.freedesktop.portal.Settings — Beállítások interfész.
org.freedesktop.portal.Trash — Portál fájlok törléséhez.
org.freedesktop.portal.Wallpaper — Portál az asztali háttérkép beállításához.

Backend interfészek:

org.freedesktop.impl.portal.Access — Hozzáférési párbeszédablak megjelenítésére szolgáló interfész.
org.freedesktop.impl.portal.Account — A felhasználói információk lekéréséhez tartozó portál backendje.
org.freedesktop.impl.portal.AppChooser — Alkalmazásválasztó interfész.
org.freedesktop.impl.portal.Background — Háttérfolyamat portál backend interfész.
org.freedesktop.impl.portal.Email — E-mail portál backend interfész.
org.freedesktop.impl.portal.FileChooser — Fájlválasztó portál backend interfész.
org.freedesktop.impl.portal.Inhibit — Tiltási portál backend interfész.
org.freedesktop.impl.portal.Lockdown — Korlátozási backend interfész.
org.freedesktop.impl.portal.Notification — Értesítési portál backend interfész.
org.freedesktop.impl.portal.PermissionStore — Engedélyek tárolására szolgáló adatbázis.
org.freedesktop.impl.portal.Print — Nyomtatási portál backend interfész.
org.freedesktop.impl.portal.RemoteDesktop — Távoli asztal portál backend interfész.
org.freedesktop.impl.portal.Request — Közös kéréskezelő interfész.
org.freedesktop.impl.portal.ScreenCast — Képernyőmegosztási portál backend interfész.
org.freedesktop.impl.portal.Screenshot — Képernyőkép portál backend interfész.
org.freedesktop.impl.portal.Secret — Titok portál backend interfész.
org.freedesktop.impl.portal.Session — Közös munkamenet-kezelő interfész.
org.freedesktop.impl.portal.Settings — Beállítások portál backend interfész.
org.freedesktop.impl.portal.Wallpaper — Portál az asztali háttérkép beállítására.

Amikor egy portált használunk, az alkalmazásnak egyben engedélyt is adunk arra, hogy az adott portál által biztosított erőforrást használja. Ha például egy fájlválasztó ablakban kiválasztunk egy fájlt, a Flatpak rendszer ezt megjegyzi, és onnantól fogva engedélyezett az alkalmazás számára a fájl elérése. Az így megadott engedélyeket dinamikus engedélyeknek nevezzük.

Repozitóriumok

Akárcsak a hagyományos Linuxos csomagkezelők (apt, dnf, zypper, stb.), a Flatpak is repozitóriumokat (repókat) használ a csomagok terjesztéséhez. Az olyan szoftverközpontok, mint a Gnome Software, a KDE Discover és az elementary AppCenter képesek Flatpak repókról letölteni. A legjelentősebb Flatpak repó, a Flathub 2018 óta működik, és jelen pillanatban 2799 asztali alkalmazást kínál (https://flathub.org/statistics).
A Flathubon kívül megemlíthető még a Fedora Flatpaks repó, amelyben jelenleg 484 csomag van, és az elementary OS AppCenter repója, ahol pillanatnyilag 160 csomag található. A Fedora Flatpaks-ban sok olyan csomag van, ami megtalálható Flathubon is, viszont a licenszdíjas komponensek (jellemzően a kodekek) ki vannak hagyva belőlük, ezért előfordulhat, hogy az onnan telepített videólejátszó, böngésző nem fog minden videót lejátszani!
Ezeket a következőképp telepíthetjük:
- Fedora Flatpaks: flatpak remote-add --if-not-exists fedora oci+https://registry.fedoraproject.org
- elementary OS flatpakrepo: flatpak remote-add --if-not-exists elementaryos https://flatpak.elementary.io/repo.flatpakrepo

.flatpakref, .flatpakrepo

Flatpak használata esetén találkozhatunk .flatpakref kiterjesztésű fájlokkal. Ezek a fájlok tartalmazzák azokat az információkat, amik szükségesek egy távoli Flatpak fájl telepítéséhez. Egy flatpakref fájl például így néz ki:
[Flatpak Ref]
Name=fr.free.Homebank
Branch=stable
Title=fr.free.Homebank from flathub
Url=https://dl.flathub.org/repo/
RuntimeRepo=https://dl.flathub.org/repo/flathub.flatpakrepo
IsRuntime=false
GPGKey=mQINBFlD2sABEADsiUZUO...

Ha van egy flatpakref fájlunk, az alábbi módon közvetlenül telepíthejük a fájlt által hivatkozott alkalmazást anélkül, hogy az alkalmazást tartalmazó repót fel kellene vennünk:
flatpak install https://flathub.org/repo/appstream/fr.free.Homebank.flatpakref

Ezen kívül találkozhatunk még .flatpakrepo fájlokkal is, ezek nem alkalmazásokat, hanem repókat azonosítanak. Segítségükkel könnyen hozzáadhatunk a rendszerhez távoli Flatpak repókat, Flathub esetén például így:
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo

Rendszerszintű és felhasználószintű Flatpak telepítések

Flatpak alkalmazásokat két féle módon telepíthetünk. Az alapértelmezett mód a rendszerszintű mód, ebben az esetben a gépen lévő összes felhasználó számára elérhetők lesznek a telepített alkalmazások. Ez esetben a /var/lib/flatpak könyvtárba kerülnek az alkalmazások.
A másik módszer a felhasználószintű telepítés, ez esetben a ~/.local/share/flatpak és a ~/.var/app/ mappákba kerülnek a telepítések.
Rendszerszintű telepítésnél meg kell adnunk a sudo vagy a root jelszót (mivel rendszermappába szeretnénk írni), felhasználószintű telepítésnél viszont nem. A hivatalos ajánlás az, hogy tartsuk be az alapértelmezett telepítési módot. Én a hivatalos ajánlást megszegve, mindent felhasználó szinten telepítek, mert ilyenkor nem kér jelszót (hiába no, gyarló az ember). Viszont ennek megvan az a hátránya, hogy ha már vannak fent rendszerszinten telepített runtime-ok, és felhasználószinten kezd el telepítgetni az ember, akkor azok a runtime-ok még egyszer felkerülnek, így kétszer annyi helyet foglalnak el. Utólag átmozgatni a rendszerszinten telepített alkalmazásokat felhasználószintre pedig csak újratelepítéssel lehet, bár a beállításaink így nem vesznek el, hiszen azok a /home alatt tárolódnak akkor is, ha az alkalmazás rendszerszinten van telepítve.

Flatpak alkalmazások felépítése

A Flatpak alkalmazások az OSTree-n alapulnak. Ha tudod, mi az a Git, akkor meg fogod érteni az OSTree-t, ha azt mondom, hogy az OSTree olyan az alkalmazások számára, mint a Git a forráskódok számára.
Az OSTree az alkalmazás és a fájlrendszer között helyezkedik el, és egy olyan frissítési mechanizmust nyújt, amely egyrészt folyamatosan követi és nyilvántartja a jelenlegi és az összes korábbi frissítést (változást), másrészt atomi frissítésekkel operál. Ez két dolgot jelent, és az utóbbi a fontosabb számunkra:
- egyrészt az atomi frissítések biztosítják, hogy minden appfrissítés egyetlen atomi műveletben menjen végre, így kisebb az esély a hibázásra
- másrészt mivel a frissítések mindenkori állapota folyamatosan nyomon van követve, ezért bármikor visszaállhatunk egy korábbi verzióra

Újabban a Flatpak támogatja az OCI konténer típusú felépítést is, így könnyen lehet Docker image-ből Flatpak csomagot készíteni, és OCI registryn keresztül terjeszteni.

Háttéretechnológiák

Csak említés szintjén érdemes tudni, hogy a Flatpak a Bubblewrap segítségével oldja meg a sandboxingot, systemd-et használ a sandboxok cgroups részéhez, AppStream-et a metaadatok kezeléséhez, és D-Bust az interprocessz kommunikációhoz (pl. a portálok meghívásához).

A cikk még nem ért véget, kérlek, lapozz!