De package manager van je Linux-distributie is een ware verademing in vergelijking met de wildgroei aan update managers en installers onder Windows. Maar terwijl de repositories enkel bij een distributie-upgrade vernieuwd worden, kun je in Windows wél steevast de laatste versie van je favoriete programma installeren. Portable Linux Apps belooft dit ook onder Linux waar te maken, maar is dat echt zo? Wij zochten het uit!

 

Package managers zoals aptitude, yum en zypper -of hun grafische frontends- zijn een onmisbaar element in moderne Linux-distributies. Ze staan in voor de installatie van het besturingssysteem zelf en voor de updates nadien: denk maar aan security updates of een nieuwe distributie-release. Maar ook de meeste programma’s installeer je gewoon via je package manager. De distributies bevatten allemaal een breed gamma aan open source software in hun repositories. Wil je toch eens een programma installeren dat niet in jouw distributie zit? Soms kan je dat oplossen door pakketten -bijvoorbeeld in .deb- of .rpm-formaat- te downloaden en manueel te installeren. Daarvoor krijg je dan geen automatische updates, want je package manager weet niet waar die updates te vinden zijn. Dat los op je op door een extra repository toe te voegen aan je package manager. Tenminste, als de auteur van de software die repository voorziet.

Eenvoudig packagen
Je staat er wellicht niet bij stil, maar het packagen van software is een behoorlijk tijdrovende klus. Dat geldt vooral voor de kleinere ontwikkelaar wiens software nog niet is opgenomen in de officiële distributie-repositie. Zij moeten immers zélf pakketten voorzien als zij nieuwe gebruikers willen aantrekken. Want wie wilt er nog software installeren via een .tar.gz-bestand of een installatiescript? Maar dat packagen is makkelijker gezegd dan gedaan. Om te beginnen bestaan er verschillende formaten voor packages. De twee meest gebruikte zijn .deb (voor Debian en Ubuntu) en .rpm (voor Fedora en openSUSE). Maar dat betekent niet dat twee pakketten volstaan voor alle distributies…

 

De namen van de dependancies (software waarvan het programma afhankelijk is voor een goede werking) kunnen namelijk erg verschillen van distributie tot distributie. Bovendien zijn de meeste programma’s gecompileerd voor een bepaalde architectuur, dus heb je op zijn minst afzonderlijke 32- en 64-bits-packages nodig voor de Intel-architectuur. Tot slot werken pakketten voor nieuwe distributies meestal niet in oudere distributies, dus moet je per distributie en per architectuur ook nog eens meerdere versies aanbieden! Dat is al gauw te veel van het goede voor de modale hobbyprogrammeur. Voor erg nieuwe programma’s bestaan er dus vaak nog geen goede packages. Dat maakt het installeren van die software er natuurlijk niet gemakkelijker op!

Een gelijkaardig probleem doet zich voor bij nieuwe versies van grote programma’s, zoals Firefox of VLC. Die programma’s zijn aanwezig in de repositories van alle distributies: de ontwikkelaars zelf bieden dus geen packages aan. Maar de nieuwste versie wordt pas opgenomen in de officiële repositories bij de volgende distributie-upgrade. Gebruikers moeten dan ook zes maanden (Ubuntu, Fedora, …) tot zelfs twee jaar (Debian stable, CentOS, …) wachten vooraleer zij die versie kunnen installeren! Uiteraard bestaan er al packages voor de volgende release van je distributie, maar die kan je niet zomaar installeren. Meestal hangen die packages af van nieuwere library-versies dan degene die op jouw systeem staan. In praktijk ben je dus verplicht om steeds te updaten naar de laatste distributie als je nieuwere software wilt draaien. Dat klinkt op zich logisch, maar het is niet in alle omstandigheden even wenselijk. In bedrijfs- of schoolomgevingen wil je namelijk geen twee keer per jaar alle computers upgraden. Dan gebruik je liever een distributie zoals Ubuntu LTS of CentOS met jarenlange security updates. Zou het niet handig zijn als je ook in die distributies selectief nieuwere versies van bepaalde programma’s kon installeren? Gebruikers van Windows XP kunnen toch ook niet alleen software installeren van 10 jaar geleden?

Portable Apps
Je kent allicht het Portable Apps-project, dat een groot aantal open source programma’s voor Windows aanbiedt. Het voordeel van die Portable Apps is dat je ze niet als Administrator hoeft te installeren in Windows om ze te kunnen gebruiken. De meeste apps kan je gewoon starten zonder verdere installatie. Dat is vooral handig als je ze op een usb-stick plaatst: zo heb je overal je favoriete programma’s bij je. Andere portable apps moet je wel installeren, maar dat kan ook als gewone gebruiker in bijvoorbeeld de Mijn Documenten-folder. Portable Apps zijn dan ook erg populair om extra software te installeren op dichtgetimmerde bedrijfscomputers. Helaas werken de Portable Apps enkel onder Windows, tenzij je met Wine aan de slag gaat. Maar sinds enkele jaren bestaan er ook de Portable Linux Apps. Die hebben niets te maken met de Portable Apps voor Windows, al werken ze op een gelijkaardige manier. De Linux Portable Apps gebruiken het AppImage-formaat, dat van volgende uitgangspunten vertrekt:

 

– één applicatie = één bestand.

– de applicatie is distributie-onafhankelijk

– de applicatie mag het onderliggende besturingssysteem niet wijzigen

– je kunt de applicatie van elke locatie starten

– je moet de applicatie niet installeren voor je ze kan starten

In zekere zin is een AppImage dus voor een applicatie, wat een live-cd is voor een Linux-distributie. De bedoeling is dat je elke applicatie meteen na het downloaden ervan kan starten. Het app⁻bestand bevat het programma zelf én alle benodigde extra libraries. Je moet dus geen dependancies installeren en je hebt ook geen root-rechten nodig. Althans, dat is de theorie.

Het aanbod
Het succes van een project zoals Portable Linux Apps staat of valt natuurlijk met het aanbod van applicaties. Helaas valt dat voorlopig erg mager uit. Op de downloadpagina van Sourceforge vind je een tweehonderdtal downloads, waarvan het merendeel al minstens twee jaar oud is. Het is hoog tijd dat iemand die packages eens up-to-date brengt! Voor gamers daarentegen hebben we goed nieuws: op de website van Portable Linux Games vind je een 150-tal populaire games als Portable Linux App. En die zijn -op het ogenblik van schrijven- over het algemeen wél up-to-date. Een nadeel is wel dat de momenteel beschikbare Portable Linux Apps steeds 32-bits zijn. Misschien begrijpelijk als je maar één download wilt aanbieden die op alle Intel-compatible computers werkt, maar ideaal is het niet. Op 64-bitssystemen moet je namelijk nog een boel 32-bits systeemlibraries installeren om dergelijke programma’s te starten. Voor de Portable Linux Games vind je uitgebreide instructies hoe je dit moet doen (zie referenties). Programma’s zomaar starten zonder installatie zit er dus niet in op 64-bitssystemen, maar dit minpunt kunnen we nog door de vingers zien, aangezien het niet inherent is aan het AppImage-formaat. Het is best mogelijk om 64-bitssoftware te packagen als portable app, alleen is dat nog niet vaak gebeurd. Op de Portable Linux Apps-website vind je zelfs 64-bits versies van de AppImage-tools (zie referenties). Je kunt dus probleemloos aan de slag met portable apps in een 64-bitomgeving, mits je ze zelf wilt packagen.

 

1. Firefox als portable Linux app. Helaas niet helemaal up-to-date…

 

AppImage-formaat
Hoewel er momenteel nog niet veel Portable Linux Apps beschikbaar zijn, is de technologie erachter wel interessant. Daarom bekijken we even in detail hoe zo’n portable app nu precies in elkaar zit. Het app-bestand is in feite niets meer dan een iso-bestand, voorzien van een kleine executable om die iso te mounten en het eigenlijke programma te starten. De iso bevat alle benodigde bestanden: de binaries, libraries, eventuele dependancies die niet standaard in elke Linux-distributie aanwezig zijn, configuratiebestanden, icoontjes, etc. Dit alles is bovendien gecomprimeerd met zisofs. Het klinkt misschien een beetje gek dat je een binary gewoon als iso kan mounten. Maar het is wel handig voor troubleshooting als een app niet wil werken. In afbeelding 2 zie je een voorbeeld van de Firefox portable app. Het AppRun-bestand is een executable die het eigenlijke programma start. Het .desktop-bestand bevat het commando om dat te doen. Dit bestand gebruikt dezelfde syntax als de menu-items in jouw distributie (de bestanden onder /usr/share/applications). Verder vind je nog een icoontje (firefox.png) en tot slot de eigenlijke software onder de usr-directory (zie listing 1).

 

Listing 1

$ find appdir/ -type f | head -30

AppRun

firefox.desktop

firefox.png

usr/bin/firefox

usr/bin/firefox-20.0/application.ini

usr/bin/firefox-20.0/blocklist.xml

usr/bin/firefox-20.0/chrome/icons/default/default16.png

usr/bin/firefox-20.0/chrome/icons/default/default32.png

usr/bin/firefox-20.0/chrome/icons/default/default48.png

usr/bin/firefox-20.0/chrome.manifest

usr/bin/firefox-20.0/components/binary.manifest

usr/bin/firefox-20.0/components/libbrowsercomps.so

usr/bin/firefox-20.0/components/libdbusservice.so

usr/bin/firefox-20.0/components/libmozgnome.so

usr/bin/firefox-20.0/crashreporter

usr/bin/firefox-20.0/crashreporter.ini

usr/bin/firefox-20.0/crashreporter-override.ini

usr/bin/firefox-20.0/defaults/pref/channel-prefs.js

usr/bin/firefox-20.0/dependentlibs.list

usr/bin/firefox-20.0/dictionaries/en-US.aff

usr/bin/firefox-20.0/dictionaries/en-US.dic

usr/bin/firefox-20.0/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/icon.png

usr/bin/firefox-20.0/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf

usr/bin/firefox-20.0/firefox

usr/bin/firefox-20.0/firefox-bin

usr/bin/firefox-20.0/icons/mozicon128.png

usr/bin/firefox-20.0/icons/updater.png

usr/bin/firefox-20.0/libfreebl3.chk

usr/bin/firefox-20.0/libfreebl3.so

usr/bin/firefox-20.0/libmozalloc.so

 

2. Je kunt een portable app net zoals een iso-bestand mounten om de inhoud te bekijken

Zelf packagen
Het AppImage-formaat lijkt misschien eenvoudig, het packagen van software tot een portable app is toch wat ingewikkelder. Download eerst de AppImageKit met de nodige tools om je eigen portable apps te maken. Een nieuwe app maak je aan op basis van de in afbeelding 2 getoonde directory-structuur. Die zogenaamde AppDir kan je volgens omzetten in een portable app met de grafische tool AppImageAssistant. De moeilijkheid is nu om uit te vissen welke dependancies je moet opnemen in je AppDir om een werkbare applicatie te verkrijgen. Libraries die op elk Linux-systeem aanwezig zijn (zoals libc of libgtk) hoef je natuurlijk niet op te nemen. Daarom is het erg belangrijk om je app na het packagen uitgebreid te testen in verschillende distributies. Sommige distributies bevatten standaard misschien minder (of andere) libraries dan degene waarin jij jouw app gemaakt hebt. Voor het testen gebruik je ook best standaardinstallaties zonder extra sofware. Alleen zo weet je absoluut zeker of je wel alle extra libraries in je applicatie opgenomen hebt. Een virtuele machine met een live-cd kan daarvoor al volstaan.

 

3. Met AppImageAssistant maak je een portable app van een AppDir.

 

Valkuilen
Ook het kiezen van de correct gecompileerde binary voor jouw app is minder evident dan het lijkt. Je bent misschien geneigd om een binary te nemen van een zo recent mogelijke distributie, bijvoorbeeld Debian unstable. Dat bespaart je al de moeite om de applicatie zelf te compileren, nietwaar? Leuk bedacht, maar dat geeft waarschijnlijk problemen als je de binary op een ouder systeem wilt starten. De binary is immers gecompileerd met een nieuwere versie van glibc of andere libraries. En oudere software draait meestal prima met nieuwere glibc-versies, omgekeerd geldt dat natuurlijk niet! Ga je zelf software compileren voor een portable app? Doe dat dan op de oudst mogelijk distributie waarop je jouw app nog wilt draaien, bijvoorbeeld Ubuntu 10.04 LTS of CentOS 5.

 

Met de create-appimage-tool kan je het compileren overslaan, maar in de praktijk is het nut ervan eerder beperkt. create-appimage downloadt namelijk een programma en al zijn dependancies uit de repositories van je distributie en maakt daarvan een AppImage. Doe je dit op een nieuwe distributie (om nieuwe software te packagen), dan werkt de portable app wellicht niet op oudere distributies. Doe je dit op een oudere distributie, dan zit je met oudere software opgescheept. Laat dat nu net één van de problemen zijn die Portable Linux Apps probeert op te lossen! Zelf compileren is dus vaak de enige optie als je nieuwe software wilt packagen voor oudere distributies.

Een laatste potentieel struikelblok is het feit dat de binaries in een portable app geen absolute paden naar andere binaries mogen bevatten. Dat is ook logisch, want dan zouden ze niet meer gestart kunnen worden vanaf elke locatie. Maak je gebruik van create-appimage, dan hoef je je hier niet om te bekommeren. Voorzie je zelf de binaries, controleer dan zeker met het strings-commando of het geen absolute paden meer bevat. Is dit toch het geval, dan moet je dit ofwel in de code aanpassen, ofwel de binary patchen. Ook scripts geschreven in bash, Perl, Python enzovoorts mogen geen absolute paden bevatten, maar die kan je uiteraard gemakkelijker aanpassen. Hetzelfde geldt trouwens voor de libraries in je portable app: voor meer informatie verwijzen we je naar de AppImageKit-documentatie.

Tot slot
Met Portable Linux Apps kan je dezelfde Linux applicatie gemakkelijk in verschillende distributies draaien, wat ideaal is om nieuwe software snel te packagen. De techniek erachter doet wat het moet doen, maar in de praktijk zijn er toch enkele praktische bezwaren. Zo is het aanbod aan portable apps gewoon nog te klein en te verouderd en zijn er nauwelijks 64-bitsversies beschikbaar. Zelf portable apps packages is ook niet zo eenvoudig en behoorlijk tijdrovend. Voorlopig zijn Portable Apps dus vooral interessant voor ontwikkelaars die hun software beschikbaar willen maken voor verschillende distributies. Voor de modale gebruiker biedt het huidige aanbod portable apps weinig meerwaarde, tenzij je vooral geïnteresseerd bent in games. Het aanbod van Portable Linux Games is immers wél de moeite.

 

Links:

Portable Linux Apps: http://portablelinuxapps.org

Portable Linux Games: http://www.portablelinuxgames.org

Portable Linux Games op 64-bit installeren: http://sourceforge.net/p/pg4l/wiki/Setup%20a%2064bit%20system%20to%20run%2032bit%20AppImages

 

AppImageKit 64-bit: http://portablelinuxapps.org/64/