Alpine Linux is een minimalistische Linux-distributie die oorspronkelijk op Gentoo gestoeld was, maar nu een onafhankelijke, eigen gehoste distro is. In sommige opzichten lijkt het op NanoBSD in de zin dat techneuten Alpine kunnen gebruiken om een Linux-systeem op te tuigen die alleen doet wat de missie vereist en niets meer.

Je ziet Alpine het meest terug embedded in apparaten of appliances. Het kreeg meer populariteit toen het gekozen werd als basisimage voor Docker om Ubuntu te vervangen. De redenen daarvoor waren beveiliging, betrouwbaarheid en goede ontwikkelpraktijken.

Het is een heel andere distributie dan wat een doorsnee Linux-gebruiker gewend zal zijn. Laten we eerst eens kijken naar directory /bin waar de systeemprogramma's in staan.

Het valt je waarschijnlijk wel op dat alle binary's verwijzen naar /bin/busybox. Busybox bestaat uit een groep utility's die in één binary zijn verwerkt om snel te starten, minder ruimte op te nemen en betere beveiliging te bieden, met als offer dat bepaalde functionaliteit wordt ingeleverd. Veel van de weinig gebruikte utility's zijn verdwenen, maar de doorgaans gebruikte opties zijn beschikbaar.

Daarnaast gebruikt Alpine musl libc, een minimalistische implementatie van de standaard C/POSIX-library en extensies, die is ontworpen voor statische linking en realtime embedded applicaties. De GNU-bloat van glibc wordt daarmee vermelden. Statisch in plaats van dynamische linking betekent sneller opstarten, maar het kost meer ruimte. Het is daarom vooral geschikt voor kleinere systemen. Door alle systeembinary's in één uitvoerbaar bestand te verwerken en te linken met musl heeft Alpine een kleine en snelle set systeembinary's, wat je nodig hebt bij een embedded systeem.

Kernel-patches inbegrepen

Ten slotte is er specifiek aandacht voor beveiliging. Het bevat kernelpatches van GRsec/PaX, die een aantal securityfeatures toevoegen aan de Linux-kernel, waaronder beveiliging voor adresseringsruimte, verbeterde auditing en toegangs- en procescontrole. Met typische Linux-distributies zouden gebruikers hun eigen kernel moeten compileren en draaien om deze patches te krijgen - iets wat zelfs veel geavanceerde gebruikers liever vermijden.

Hierna: Installatie van Alpine Linux.

Er is veel ongebruikelijk aan de installatie van Alpine Linux en dat komt doordat het OS oorspronkelijk bedoeld is om te draaien in embedded systemen als routers. Daarom is het besturingssysteem ontworpen om te booten en draaien vanuit RAM, hoewel er hybride opties beschikbaar zijn.

Booten vanaf usb etc

Gezien deze oorsprong gebruikt Alpine Linux als bootloader Syslinux-variant extlinux. Syslinux wordt in de regel niet gebruikt om volledige Linux-installaties te booten, omdat Linux doorgaans niet op FAT-bestandssystemen wordt geïnstalleerd. Syslinux wordt meestal gebruikt voor bootdisks of recoveryschijven, live-usb's en andere lichtgewicht bootable systemen.

Alpine gebruikt delen van het Syslinux-project om te kunnen booten vanaf cd-roms en gebruikt extlinux om te booten vanaf Linux-bestandssystemen of FAT-bestandssystemen voor usb-apparaten. FAT heeft zijn beperkingen, zoals de bestandsgrootte en een limiet aan de lengte van bestandsnamen.

Schijf en data

Alpine heeft drie installatiemodi: schijfloos, 'data' en 'sys'. Met een data-installatie wordt het OS in het werkgeheugen geladen vanaf een read-only medium, maar worden lees/schrijf-partities gemount om data op te slaan. Dit wordt bijvoorbeeld gebruikt als een Alpine-gebaseerde router logbestanden wil opslaan. Kopiëren van logs naar RAM zou verspilling van de resources zijn. Installatie zonder schijf lijkt hierop, maar de lees/schrijf-partitie is doorgaans kleiner en wordt gebruikt om OS-configuratiedetails op te slaan. Sys is de traditionele schijfgebaseerde installatie.

Als je installeert in schijfloos of data, wordt het Alpine Local Backup-systeem gebruikt om configuratiebestanden op te slaan. Dit wordt gedaan met lbu (Local Backup Utility), dat bijhoudt welke bestanden zijn gewijzigd in de directory /etc en de wijzigingen opslaat in .apkovl-bestanden (tar-gzip-archiefbestanden). Met lbu kunnen admins bijvoorbeeld configuraties wijzigen, samenvoegen of terugrollen naar een eerdere configuratie.

Eerste tests

Ik begon met een schijfloze installatie, omdat ik Alpine wilde testen zoals het oorspronkelijk is bedoeld: als een OS voor apparaten. Helaas kwam ik een oude bug (uit 2015) tegen in een VMware-installatie die niet is gerepareerd, maar ook de documentatie is niet bijgewerkt. Het lijkt erop dat het virtuele floppy-image niet wordt gemount bij het booten. Dat betekent dat bij elke herstart configuratiewijzigingen verloren raken.

Lees verder: De configuratie van het OS.

Ik week uiteindelijk uit naar een sys-installatie, wat prima werkte. Het eerste wat opvalt is dat niets, zelfs SSH niet, standaard wordt geïnstalleerd. Als je een embedded systeem maakt, is dit waarschijnlijk een groot goed. Maar Linux-nieuwkomers krijgen te maken met een steile leercurve. Nadat ik wat bijgelezen had over de Apline Package Manager (APK) installeerde ik een set minimale tools om te kunnen beginnen: Sudo, SSH en de webgebaseerde grafische beheertool ACF.

De meeste Linux-systemen hebben een grafische admintool, maar Alpine gebruikt shell-scripts voor configuratie. Ik gebruikte setup-alpine om alle basisbenodigdheden te configureren, zoals netwerk, hostname, schijven, tijdzones, etc. Ook al is setup-alpine ontoereikend om een werkbaar systeem te krijgen, moet je als je iets meer wilt systeemconfiguratiebestanden bewerken en opslaan via lbu. Tevens is de installer setup-aline, dus je kunt een schijfnaam opgeven waarna het OS wordt weggeschreven en schrijfbare partities voor /etc en /var worden aangemaakt.

Ander pakketbeheer

Het ontwikkelen en distribueren van software is ook anders op Alpine. Deels komt dat weer door dat gebruik in embedded systemen of als basisimage voor containers, maar ook omdat de makers vonden dat bestaande pakketbeheersystemen niet optimaal zouden werken in een systeem dat over het algemeen vanuit RAM draait.

De Alpine Package Manager (APK) voldoet aan al deze eisen met lage overhead en korte installatietijden. Ik zou alleen willen dat ze het in een API hadden verwerkt die gebruikelijker was. We hebben al genoeg pakketbeheer-API's en er valt iets te zeggen voor compabiliteit. APK wordt gebruikt om containers of standalone-systemen.

OpenRC als init

De ports-tree om packages af te leveren doet een beetje denken aan de ports-verzameling van FreeBSD. Maar in plaats van een geavanceerd makefile-systeem gebruikt het ook hier een Alpine-eigen uitvinding: abuild. De repository aports lijkt op de ports-tree die we overal zien en de methode apk add [...] is veel sneller dan andere pakketbeheersystemen.

Ook opvallend is het gebruik ban OpenRC voor het init-systeem. Er zijn meer dan tien init-systemen voor Linux en OpenRC begon met Gentoo - net als Alpine. Er ontbreekt functioneel gezien niets aan, maar wees erop voorbereid dat je een nieuw systeem aan init-opdrachten en run-levels moet leren.

Hierna: Het ontbreekt aan documentatie.

Gelukkig kun je veel van de dagelijkse beheertaken doen via het webgebaseerde Alpine Configuration Framework (ACF), maar het werken met ACF was niet helemaal soepel. Ik kon bijvoorbeeld de gebruiker die ik voor mezelf had toegevoegd met adduser niet terugvinden. De GUI van ACF lijkt heel erg op de webinterface van een doorsnee Linux-router:

Je moet ook wat graven om ACF te vinden en installeren. Een gemiddelde gebruiker zou het alleen gezien hebben als hij of zijn erop lette en zelfs dan zijn er geen installatie-instructies.

Alpine ondersteunt diverse opslagopties behalve RAM-only, waarbij configuraties worden opgeslagen op media en flashgeheugen. De documentatie, of liever: het gebrek hieraan, maakt het begrijpen van opslag lastig. Zo wilde ik een ISO aanmaken met een applicatie die ontbreekt in aports - een regelmatig voorkomende gebeurtenis. De documentatie hiervoor was een doodlopend spoor:

De laatste bewerking was in 2012 en het lijkt lang dat we hier dus al bijna vijf jaar op wachten. Om eerlijk te zijn was opslag nooit een prioriteit voor Alpine en diens positionering in embedded, dus het moet geen verrassing zijn dat dit een zwakke plek in. Er wordt gewerkt aan alle gebieden die je verwacht in een Linux-distributie, zoals LVM, iSCSI en RAID, maar bereid je erop voor dat je tijd kwijt bent aan het begrijpen van de documentatie of de bronocode.

Lees verder: Netwerken en release-branches.

Netwerken met Alpine is een heel ander verhaal: de documentatie is vollediger en beter beschreven. en bevat vaak best practices voor het opzetten van efficiënte netwerken. IPv4, IPv6, bonding, VLAN, bridging en vrijwel alles wat je nodig hebt voor netwerkconfiguratie wordt ondersteund. Je vindt zelfs instructies voor het opzetten van satelliet-internet!

Interessante documentatie

Configuratie doe je met traditionele tools als ifconfig en route of nieuwere pakketen als iproute2. Een configuratietool voor Linux-firewalls, Alpine Wall, verdient speciale vermelding. Zelfs PPP over seriële lijnen wordt ondersteund, wat vandaag de dag nog verrassend is te noemen.

Ik heb veel geleerd van het lezen van de documentatie en vond diverse tips over configuratie die ik nog niet kende en leerde over obscure netwerkutility's. Het is de moeite waard om de documentatie terug te lezen als een snelgids voor netwerken, zelfs als je Alpine Linux niet gebruikt.

Releases

Release-engineering van Alpine Linux is niet zo rigoureus of formeel als doorgewinterde systemen als FreeBSD, maar aan de basale eisen is voldaan. En het is prima geschikt voor de primaire use case van Docker-hosts en -applicaties.

Er zijn in feite twee streams: edge en stable. Edge is de rolling release, een snapshot van de status van ontwikkeling die elke zes maanden wordt genomen. Pakketten gaan door deze stream en als ze klaar zijn voor brede uitrol, gaan ze naar stable/community, waar ze zes maanden lang worden ondersteund door de community. Pakketten die deze fase doorkomen, ontwikkelen zich naar stable/main, waar ze twee jaar lang worden ondersteund.

Op de laatste pagina: Upgraden, downgraden en conclusie.

Je moet een beetje oppassen als je van 2.x naar 3.x gaat, omdat er een wijziging in C-library's is (van uClib naar musl). Als je niet oplet kan het systeem platgaan halverwege een upgrade. Upgraden naar de 3.x-lijn is simpeler, hoewel het nog steeds een handmatig proces is dat grotendeels via scripts wordt uitgevoerd.

De truc is om de correcte APK-repository te pakken (community, main of edge), de cache te legen en dan alle APK-pakketten bijwerken met apk upgrade. Het upgraden van de kernel is ook behoorlijk rechttoe-rechtaan en gebruikt script setup-bootable om de nieuwe kernel en busybox naar het bootmedium te schrijven.

Over het geheel genomen zijn er niet veel bewegende delen binnen het Alpine-systeem waar je rekening mee moet houden, dus als je de architectuur eenmaal begrijpt is het uitvoeren van een upgrade niet ingewikkeld.

Samengevat:

Alpine Linux is een goede keus voor een netwerkgeoriënteerd systeem met één doel. Monitoring, intrusion detection en IP-telefonie zijn voorbeelden van goede toepassingen voor Alpine Linux. Het is een logische keuze voor containers. Applicaties die veel gebruik maken van opslag moeten grondig worden getest. Gebruikers moeten wat tijd steken in de community en de mouwen opstropen: er is wat trial and error vereist.