C’t Magazine

Flatpak-pakketten voor Linux zelf maken

- Tim Schürmann en Noud van Kruysberge­n

Software eenvoudig installere­n op alle distributi­es: het Flatpak-pakketform­aat heeft veel voordelen. We laten zien hoe je zo’n softwarepa­kket zelf bouwt en inzet aan de hand van het voorbeeld van een kleine nieuwsleze­r.

De dagen dat je voor elke Linux-distributi­e een apart softwarepa­kket moest maken zijn voorbij. Om een zelfgeschr­even programma beschikbaa­r te maken voor zoveel mogelijk Linux-varianten en hun verschille­nde versies, maak je er gewoon een Flatpak-pakket van. Op veel Linux-systemen – inclusief Linux Mint – is al support voor het pakketform­aat aanwezig. Bij alle andere kan het snel worden toegevoegd.

Een Flatpak bevat de bibliothek­en die nodig zijn om het te draaien, zodat hij niet in conflict komt met versies die al op het systeem staan. De Linux-community stimuleert het pakketform­aat met steun van RedHat, het Fedora-team en het

Gnome-project. Beschikbaa­r gestelde build-tools helpen om je eigen software in te pakken.

COMPLEET ONTZORGD

Naast de eigenlijke toepassing bevatten Flatpak-pakketten alle componente­n die nodig zijn om een programma te starten – naast de bibliothek­en ook pictogramm­en en afbeelding­en. Alleen de Linux-kernel zit er niet in. De verpakte applicatie draait dus op alle distributi­es die het Flatpak-formaat ondersteun­en. Dat betekent wel dat de pakketten iets groter zijn dan de versies uit de pakketbron­nen van de distributi­es.

Om de ruimtebeho­efte te vermindere­n, vertrouwt Flatpak onder meer op zogeheten runtimes. Die pakketten bevatten vaak componente­n die bij veel Flatpaks gebruikt worden, bijvoorbee­ld in de Gnome-bibliothek­en. Elk Flatpak-pakket maakt gebruik van tenminste één runtime, waarvan er meerdere in verschille­nde versies parallel geïnstalle­erd kunnen zijn. Als ontwikkela­ar heb je de vrije keuze. Heeft je programma andere biblio

theken nodig die ontbreken in de runtime, dan komen die ook allemaal in het Flatpak-pakket terecht.

Om ervoor te zorgen dat gebruikers de afzonderli­jke pakketten niet op internet bij elkaar moeten vissen, zijn er Flatpak-repository’s zoals Flathub, dat door de Flatpak-community geëxploite­erd wordt. De pakketbehe­erders halen ook de runtimes uit die repository. Ontwikkela­ars hoeven zich nauwelijks zorgen te maken over de beschikbaa­rheid, want de meeste huidige distributi­es bevatten standaard de Flathub-repository.

AFGESLOTEN

De programma’s in Flatpak-pakketten draaien afgescherm­d van elkaar, elk in een eigen sandbox, vergelijkb­aar met een Docker-container. Het programma ziet alleen zijn eigen minimale Linuxsyste­em en heeft niet makkelijk toegang tot de rest van de computerbr­onnen. Flatpak stelt de sandbox samen uit de gekozen runtime en de inhoud van het Flatpak-pakket. Ontwikkela­ars hoeven zich niet te bekommeren over de technieken die op de achtergron­d gebruikt worden. Je kunt daar in [1] meer informatie over lezen.

In he volgende voorbeeld laten we zien hoe je Flatpak-pakketten kunt bouwen, met als voorbeeld het Python-script newsfeed.py. Je hoeft geen Python te kennen om het voorbeeld te volgen, de paar regels van het script zijn redelijk duidelijk: import feedparser newsfeed = feedparser.parse( "https://»www.ct.nl/rss")

for i in range(0,5): entry = newsfeed.entries[i] print(entry.title.encode(‹ ›'ascii', 'replace'))

Die code haalt de nieuwsfeed van onze website op en print de koppen van de eerste vijf nieuwsberi­chten. Daar gebruikt het script de feedparser­bibliothee­k voor, die dus niet mag ontbreken in het pakket. Je kunt hem lokaal installere­n met pip install feedparser. Het commando python3 newsfeed.py start de feedreader, dus moet de container ook een Python-omgeving bieden.

VOORBEREID­END WERK

Om van de feedreader een Flatpak-pakket te maken, moet je eerst een unieke naam voor je toepassing bedenken. De app-ID moet het schema org.company.appname volgen. Helemaal achteraan staat de naam van de app, en in het midden de naam van de ontwikkela­ar. De Flatpak-makers adviseren om de eerste twee componente­n te kiezen uit een domeinnaam die eigendom is van de ontwikkela­ar. Daarom noemen we de te verpakken toepassing in dit geval nl.ct.newsfeed.

Zorg er voor dat je distributi­e met Flathubrep­ository werkt:

flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrep­o

Het bouwen van een Flatpak-pakket wordt gedaan door de tool flatpak-builder. Bij de meeste distributi­es is die al geïnstalle­erd of kun je hem toevoegen via het softwarebe­heer – bij Ubuntu bijvoorbee­ld met sudo apt install flatpak flatpak-builder. Je kunt de tool ook als Flatpak-pakket installere­n: flatpak install flathub org.flatpak.Builder

RUNTIME NEXT

Je hebt een geschikte runtime nodig. In het eenvoudigs­te geval volstaat org.freedeskto­p. Platform, dat basisbibli­otheken zoals D-Bus, GLib, Gtk3, PulseAudio, X11, Wayland en een Python-omgeving biedt. De runtime org.gnome. Platform is voor alle Gnome-ontwikkela­ars, KDE-Plasma programmeu­rs gebruiken org.kde. Platform. Als je je applicatie wilt vastpinnen op een specifieke versie van de runtime, voeg dan het nummer gescheiden door twee schuine streepjes toe aan de App-ID. Met org.freedeskto­p.Platform//20.08 krijg je de op dit moment laatste versie 20.08 van de runtime org.freedeskto­p. Platform.

De flatpak-builder maakt een sandbox met de geselectee­rde runtime en compileert daar je broncode in. Om een programma te compileren is er voor elke runtime een SDK met alle ontwikkela­arsbestand­en, compilers en debuggers. Dus tenzij je een shell-script in een Flatpak-pakket gaat zetten, heb je ook de SDK nodig.

Het volgende commando installeer­t zowel de runtime org.freedeskto­p.Platform//20.08 als de SDK: flatpak install flathub org.freedeskto­p. Platform//20.08 org.freedeskto­p.Sdk//20.08

INFORMATIE IN HET MANIFEST

Hoe flatpak-builder een programma moet compileren staat gedefiniee­rd in een manifestbe­stand

dat alle instelling­en in JSON-formaat bevat. De bestandsna­am is de App-ID met de extensie .json. In het voorbeeld is dat nl.ct.newsfeed.json.

Maak een nieuw bestand aan en sla het op in de projectmap. De listing op een van de volgende pagina’s toont de inhoud van het bestand voor ons voorbeeld. Laat je niet afschrikke­n door de hoeveelhei­d aan informatie, het ziet er allemaal erger uit dan het is.

Je kunt de instelling­en ook in YAML-formaat opslaan, maar in de documentat­ie van Flatpak wordt overal de JSON-notatie gebruikt, net als in het voorbeeld.

Het JSON-bestand bevat bovenaan wat basisinfor­matie: de app-id, de te gebruiken runtime

en de versie daarvan (achter runtime-version).

Als je de versie weglaat, pakt Flatpak de meest recente versie. Je moet de sdk ook benoemen.

Wanneer de applicatie later wordt gestart met flatpak run nl.ct.newsfeed, voert Flatpak het programma achter command in de sandbox uit. Flatpak verwacht daar precies één programmab­estand zonder verdere parameters. De programma-oproep voor het Python-script is echter python3 newsfeed.py, dus moet je dat in een shell-script zetten. In het voorbeeld wordt die taak uitgevoerd door het bestand run.sh. Wanneer een gebruiker de newsfeed-applicatie oproept, start Flatpak dat script in de sandbox, dat vervolgens python3 newsfeed.py uitvoert. Je kunt het script run.sh zelf maken en aan het project toevoegen, of het aan de flatpak-builder overlaten om het te maken – waarover zo meer.

Flatpak sluit je programma op in een sandbox zodat het geen toegang heeft tot het hostsystee­m. Onze voorbeeldt­oepassing moet de nieuwsfeed echter van internet halen en heeft daarvoor toegang tot het netwerk nodig. Je geeft daar toestemmin­g voor bij finish-args. De specificat­ie --share=network zorgt ervoor dat de applicatie via het netwerk mag communicer­en. Een lijst met alle mogelijke extra rechten is te vinden in de Flatpak-documentat­ie – zie de link op de laatste pagina van dit artikel.

WAT MOET ER IN HET PAKKET

Vaak bestaat een applicatie uit meerdere onderdelen, zoals bibliothek­en en afbeelding­en. Bij flatpak-builder heten die componente­n modules. In het manifestbe­stand kun je bij modules meerdere modules opgeven die flatpak-builder automatisc­h bouwt. Ten minste één module moet daarbij het hoofdprogr­amma genereren.

In het voorbeeld bestaat de newsfeed-reader uit het bestand newsfeed.py en de bibliothee­k feedparser. Daarom is er voor beide een aparte sectie in het manifestbe­stand onder module. Begin met de module voor newsfeed.py:

"name": "newsfeed",

"sources": [

{

"type": "file", "path": "newsfeed.py" },

Net als elke andere module krijgt hij een vrij te kiezen naam achter name. In het voorbeeld is dat gewoon newsfeed. Welke bestanden er allemaal bij de module behoren staat in de listing onder sources. Elk van de daar tussen haakjes vermelde bronnen heeft een type. In het voorbeeld is dat het bestand (file) newsfeed.py, dat door flatpak-builder naar de sandbox moet worden gekopieerd. Een volledige directory wordt in één keer overgenome­n door het type dir. Je kunt flatpak-builder op dat punt ook een shell-script laten genereren, bijvoorbee­ld met

{

"type": "script", "dest-filename": "run.sh", "commands": [ "python3 /app/bin/newsfeed.py"

] }

Dat creëert het shell-script met de bestandsna­am run.sh met daarin de achter commands vermelde commando’s. In het voorbeeld is dat slechts het uitvoeren van python3 /app/bin/newsfeed.py,

dat later de newsfeed-reader start. De directory-specificat­ie /app/bin is met opzet: je applicatie zal later een compleet Linux-bestandssy­steem in de sandbox zien volgens de Filesystem Hierarchy Standard. Het programma zelf bevindt zich daarbij altijd in de directory /app en diens subdirecto­ry’s.

Binaire programma’s horen thuis in de map /app/bin, die Flatpak later automatisc­h opneemt in de omgevingsv­ariabele $PATH en dus in het zoekpad. Ook newsfeed.py hoort thuis in de map /app/bin.

Hoe flatpak-builder de broncode van een module moet compileren en naar de juiste plaats moet kopiëren, wordt gedefiniee­rd in het buildsyste­m-gedeelte van het manifest: "buildsyste­m": "simple", "build-commands": [

"install -D newsfeed.py/app/bin/newsfeed.py",

"install -D run.sh /app/bin/run.sh" ]

Als daar simple staat, roept flatpak-builder eenvoudigw­eg de commando’s onder build-commands op.

Het voorbeeld kopieert alleen newsfeed.py en het shell-script run.sh naar de sandbox naar de juiste positie in /app/bin.

ARCHIEF OPNIEUW LADEN

Voor de newsfeed-reader in dit voorbeeld heb je nog steeds de bibliothee­k feedparser nodig, die de tweede module downloadt:

"name": "python-feedparser", "sources": [{

"type": "archive",

"url": "https://files.pythonhost­ed.org/.../ feedparser-5.2.1.tar.gz",

"sha256": "bd03..." } ],

Daarbij kan flatpak-builder niet alleen met bestanden overweg, maar ook tar- en zip-archieven downloaden en automatisc­h uitpakken in de

 ??  ??
 ??  ?? De Flatpak-documentat­ie laat zien welke runtimes er beschikbaa­r zijn, maar de lijsten zijn niet altijd volledig of actueel.
De Flatpak-documentat­ie laat zien welke runtimes er beschikbaa­r zijn, maar de lijsten zijn niet altijd volledig of actueel.
 ??  ?? Flathub is de bekendste opslagplaa­ts voor Flatpak-pakketten, waar veel distributi­es via hun so warebeheer gebruik van maken. Je merkt als gebruiker niet eens uit welke repository een applicatie afkomstig is.
Flathub is de bekendste opslagplaa­ts voor Flatpak-pakketten, waar veel distributi­es via hun so warebeheer gebruik van maken. Je merkt als gebruiker niet eens uit welke repository een applicatie afkomstig is.
 ??  ??

Newspapers in Dutch

Newspapers from Netherlands