Application Containers

Distributie-onafhankelijke pakketten

Toen ik indertijd met Linux begon (Debian 2.0) hadden de grote distributies (Debian, SuSE, Red Hat1, …) hun eigen pakketsystemen. Bij Debian waren dat .deb pakketten en bij SuSE en Red Hat .rpm pakketten. Een uitgebreide repository zoals we deze vandaag kennen was er nog niet (Debian had al wel een systeem dat via dselect toeliet om bepaalde pakketten toe te voegen.

Had je toen iets nodig dat niet in de repository van jouw distro zat, dan was het vaak enkel mogelijk om het programma vanaf de broncode (sourcecode) te compileren en te installeren (met alle mogelijke problemen zoals dependencies).

In de loop der tijd hebben de meeste Linux distributies een grote repository met eigen pakketbeheerders en bijna alle software die men nodig kan hebben. Vaak is men hierbij wel beperkt door de licensie van het programma.

Het grote nadeel van dit soort systemen is dat de ontwikkelaar van het programma (of een lid van een bepaalde distribtutie) ervoor moet zorgen dat zijn programma in zo'n repository komt. En omdat er zoveel verschillende distributies zijn is het voor deze ontwikkelaars onmogelijk om alle distributies te ondersteunen en beperken ze zich vaak tot een beperkt aantal (Fedora en Ubuntu bijvoorbeeld, omdat veel distributies overweg kunnen met .RPM or .DEB bestanden, helaas wil het niet zeggen dat je een Ubuntu .DEB zonder problemen op Debian of Linux Mint kunt installeren).

De ultieme oplossing?

Als oplossing voor dit probleem zijn er systemen gekomen die als doel hebben het maken van pakketten of containers die alle nodige onderdelen bevatten en daarom werken op (bijna) alle Linux distributies. Men zegt soms dat het doel is om programma's zo "gemakkelijk" te maken zoals bij Windows® waarbij je een programma kunt downloaden en het .exe bestand uitvoeren.

En Linux zou Linux niet zijn als er niet meerdere van deze systemen zijn. Dus in plaats van ze allemaal een eigen artikel te geven, ga ik ze hier kort bespreken.

Op het moment van schrijven zijn er 3 systemen
  1. AppImage
  2. Flatpak
  3. Snapcraft

AppImage

Laten we beginnen met AppImage:

AppImage heeft als doel om pakketten te maken waarmee je maar 3 dingen moet doen om ze te laten werken
  1. Downloaden
  2. Uitvoerbaar maken (met chmod)
  3. Het programma uitvoeren

AppImages moeten niet geïnstalleerd worden en er worden geen systeeminstellingen aangepast. AppImages kunnen gedownload worden vanaf de website van de ontwikkelaar (er zit dus geen service achter).

Flatpak

FlatPak heeft als tagline: The Future of Apps On Linux en heeft een soort "Software Center" dat ze FlatHub noemen.

Het verschil met AppImage is dat je flatpak moet installeren en daarna kun je pakketten downloaden vanaf hun FlatHub.

Om bijvoorbeel VideoLAN te installeren via FlatPak gebruik je het volgende commando:

flatpak install flathub org.videolan.VLC

Figuur 1. $ flatpak install flathub org.videolan.VLC
$ flatpak install flathub org.videolan.VLC

flatpak kun je uitvoeren zonder sudo, maar dan zal er tijdens de installatie wel een pop-up komen waar je het wachtwoord van de "Administrator" (root) moet ingeven. Deze melding komt nadat het eerste onderdeel gedownload is (in bovenstaand geval dus na het downloaden van org.freedesktop.Platform.GL.default

En om huit uit te voeren

flatpak run org.videolan.VLC

Figuur 2. $ flatpak run org.videolan.VLC
$ flatpak run org.videolan.VLC

Naar een pakket zoeken doe je simpelweg met flatpak search PAKKETNAAM

Figuur 3. $ flatpak search firefox
$ flatpak search firefox
In tegenstelling tot Snapcraft is het met flatpak mogelijk om software uit een andere "repository" te gebruiken. Deze kun je manueel toevoegen, zo heb je bij de installatie van flatpak de default repository al toegevoegd met:
# flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

Snapcraft

Snapcraft is ook een soort "Software Center" zoals flatpak of "App Store", hun tagline is dan ook The app store for Linux.

In tegenstelling tot Flatpak maakt snapcraft geen gebruik van externe bronnen (repositories) maar enkel zijn eigen "store" (zoals de Apple Store of Microsoft Store).

Net zoals bij flatpak moet je snapcraft ook installeren. De instructies kun je op de site vinden, maar als je een distro zoals Debian gebruikt is het simpel sudo apt install snapd

Na de installatie kun je programma's zoeken en installeren met snap (dus niet snapd of snapcraft).

Laten we als voorbeeld nog eens zoeken naar Firefox (zoals in het flatpak voorbeeld hierboven):

snap seaerch firefox:

Figuur 4. $ snap search firefox
$ snap search firefox

Installatie is hetzelfde als met flatpak:

snap install firefox:

Figuur 4. $ snap install firefox
$ snap install firefox

Geef je dit commando in zonder SUDO dan moet je het wachtwoord van de administrator ingeven in een pop-up.

Tijdens de installatie zal snap enkele stappen doorlopen, eenmaal klaar verschijnt de volgende melding:

Figuur 6. Installatie voltooid
Installatie voltooid

In tegenstelling tot flatpak heeft snap(craft) naar mijn mening enkele nadelen:

  1. Voor elk programma wordt een mountpoint gecrëerd onder /dev/loop (op mijn systeem met maar enkele snaps geïnstalleerd zijn er dat al 8).
    Figuur 7. mount-points
    mount-points
  2. snapcraft maakt een directory met naam snap aan in het "root" van het bestandssysteem. Alle "binaire" of uitvoerbare bestanden worden geplaatst in /snap/bin.

Nu vraag je je misschien af, wat het probleem is met punt 2? En dan zit je in de doelgroep van deze website ;-)

Linux probeert zoveel mogelijk te voldoen aan de POSIX2 standaard. Deze standaard bepaald bijvoorbeeld dat de text editor vi aanwezig moet zijn op een standaard installatie.

Ook probeert Linux de FHS3" deze standaard de layout van de directory structuur, en snapcraft gaat in tegen deze standaard.

Volgens de FHS worden uitvoerbare bestanden in 1 (of meer) van de volgende 4 directories geplaatst:
  1. /bin : Alle programma's die nodig zijn voor een "single-user" systeem (cat, ls, …)
  2. /usr/bin : Alle "niet essentiële" programma voor alle gebruiker (in niet "single-user" modus)
  3. /sbin : Alle essentiële programma's (fsck, init, …)
  4. /usr/sbin : Alle niet essentiele systeem programma's (daemons e.d.)

Dit lijkt mischien een vreemde manier om bestanden in directories in te delen, maar there's a method behind the madness. Deze standaard komt uit een periode dat opslagruimte klein en duur was, en met deze setup is het mogelijk om alle essentiële op de <"master"> disk te plaatsen en de rest op een andere of netwerk schijf. Het systeem kon dan opstarten omdat alle nodige programma's aanwezig waren, en vervolgens werdt er een andere schijf of network-share aangekoppeld met alle andere software.

Het voordeel van het volgen van deze standaarden is dat het "redelijk simpel" is om programma's te maken die werken op UNIX®, UNIX varianten (HP-UX, BSD, Solaris, …), Unix-achtige systemen (zoals Linux) en andere systemen die voldoen (of zo veel mogelijk in het geval van Linux) aan de POSIX en FHS standaarden.

Ook zijn er mensen die deze manier van werken verkiezen boven de directory structuur die Microsoft Windows gebruikt.

Meer informatie over de FHS kun je vinden op Wikipedia

Wat de Application Containers zoals AppImage, Flatpak en Snapcraft bertreft; Meer informatie kun je altijd terugvinden in de manpages of de infopages

1 De "Red Hat Linux" van toen is het huidige "Fedora"
2 POSIX staat voor "Portable Operating System Interface"
3 FHS staat voor "Filesystem Hierarchy Standard