Linux concept: distributie
Niemand installeert "Linux". Je installeert Ubuntu, Debian, Fedora, Arch of Alpine, en elk daarvan geeft je dezelfde kernel, verpakt in een andere set programma's, een andere pakketbeheerder, een ander updateritme en een ander idee van hoe een af systeem eruitziet. Vraag twee beheerders hoe je een webserver installeert en je kunt twee verschillende commando's krijgen, die allebei kloppen. Wat bepaalt welk commando op jouw machine het juiste is, is de Linux-distributie. Zodra je begrijpt wat een distributie eigenlijk is, valt de helft van de verwarrende verschillen tussen Linux-systemen ineens op zijn plek.
1. De basis
Een Linux-distributie, of kortweg distro, is een compleet besturingssysteem dat rond de Linux-kernel is gebouwd. De kernel zelf is alleen het kernprogramma dat met de hardware praat (zie het artikel over de kernel). Hij kan geen map tonen, geen shellscript uitvoeren en geen software installeren. Alles waar je echt mee werkt komt ergens anders vandaan, en een distributie is het project dat al die onderdelen verzamelt, ze laat samenwerken en ze jarenlang bijwerkt.
Een distributie neemt een lange lijst beslissingen voor je. Welke kernelversie er wordt meegeleverd. Tegen welke C-bibliotheek elk programma wordt gelinkt. Welke shell er achter /bin/sh zit. Welk init-systeem je services start. Welk pakketformaat en welke pakketbeheerder je gebruikt om software te installeren. Hoe vaak er een nieuwe release uitkomt, en hoe lang elke release beveiligingsupdates krijgt. Twee distributies kunnen precies dezelfde upstream-programma's delen en toch totaal anders aanvoelen, omdat ze op die lijst andere keuzes hebben gemaakt.
Het juiste mentale model: de kernel is de motor, en een distributie is de hele auto die eromheen is gebouwd, plus de garage die hem onderhoudt. Twee auto's kunnen dezelfde motor hebben en toch verschillen in alles wat je aanraakt, en in hoe lang de garage ze blijft repareren.
Dit artikel legt uit waaruit een distributie bestaat, waar de families vandaan komen, hoe je ontdekt welke je draait, hoe de verschillen in je dagelijkse werk opduiken, en waarom de versienummers die een distributie je laat zien vaak niet zijn wat ze lijken. De voorbeelden zijn geverifieerd op Ubuntu 24.04, en tegen Debian 13, Fedora 44, Arch Linux, AlmaLinux 9, openSUSE Leap 16.0 en Alpine 3.23, die als containers op dezelfde machine draaien.
1.1 Zien welke distributie je draait
Elke moderne distributie beschrijft zichzelf in één klein tekstbestand, /etc/os-release. Het is het eerste wat je leest op een onbekende server:
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.5 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
...
De regel PRETTY_NAME is voor mensen. De regels ID en VERSION_ID zijn voor scripts. De regel ID_LIKE is de interessantste: die zegt van welke distributie deze is afgeleid. Ubuntu zegt debian, en dat ene woord vertelt je dat bijna alles wat je over Debian weet hier ook werkt.
1.2 De lagen van een distributie
Het helpt om een distributie als een stapel te zien. Alleen de onderste laag is strikt genomen "Linux":
YOUR SOFTWARE web server, database, PHP, your application
|
DISTRO CHOICES package manager, repositories, init system, defaults
|
USERLAND shell, ls/cp/grep, C library, compilers
|
KERNEL Linux: hardware, processes, memory, filesystems
De kernel is bij elke distributie hetzelfde. De userland komt grotendeels van upstream-projecten zoals GNU en wordt ook grotendeels gedeeld. De laag die de ene distributie echt van de andere scheidt, is die in het midden: de keuzes, het verpakken, en de mensen die het onderhouden.
1.3 Wat er echt verschilt tussen distributies
Dit zijn de verschillen die je het eerst opvallen, naast elkaar gezet voor de distributies die voor dit artikel zijn getest:
| Distributie | Pakketbeheerder | C-bibliotheek | Releasemodel |
|---|---|---|---|
| Debian | apt / dpkg (.deb) |
glibc | Vaste releases, ongeveer elke twee jaar |
| Ubuntu | apt / dpkg (.deb) |
glibc | Elke zes maanden, elke twee jaar een LTS |
| Fedora | dnf / rpm (.rpm) |
glibc | Vaste releases, korte ondersteuning |
| AlmaLinux | dnf / rpm (.rpm) |
glibc | Volgt Red Hat Enterprise Linux |
| openSUSE Leap | zypper / rpm (.rpm) |
glibc | Vaste releases |
| Arch Linux | pacman |
glibc | Rolling: helemaal geen versies |
| Alpine | apk |
musl | Vaste releases, zeer kleine basis |
Merk op dat de pakketbeheerder de familie volgt, niet de individuele distributie. Ubuntu gebruikt de tools van Debian; AlmaLinux gebruikt die van Fedora. Leer één lid van een familie kennen en je kunt op allemaal werken.
Minder zichtbaar, maar net zo echt, is de keuze van de beveiligingsmodule: de kernelfunctie die beperkt wat een programma mag doen, zelfs als het als root draait. Ubuntu gebruikt AppArmor; volgens de serverdocumentatie "is installed and loaded by default". Red Hat Enterprise Linux gebruikt SELinux, en de documentatie van Red Hat noemt de enforcing-modus "the default, and recommended, mode of operation". In één virtueel bestand zie je welke modules je kernel actief heeft:
$ cat /sys/kernel/security/lsm # on Ubuntu 24.04
lockdown,capability,landlock,yama,apparmor,ima,evm
Dit verschil verklaart een hele groep problemen van het type "werkt op Ubuntu, permission denied op RHEL": de bestandsrechten zijn identiek, maar een andere beveiligingsmodule zegt nee.
1.4 Waarom er zoveel distributies zijn
Al deze software is open source, dus iedereen mag hem nemen, anders combineren en het resultaat delen. Mensen doen dat omdat er op de keuzes hierboven geen één juist antwoord bestaat. Elke distributie is een ander evenwicht tussen een paar doelen die tegen elkaar in trekken:
| Doel | Wat het kost |
|---|---|
| Stabiliteit: versies die jarenlang niet veranderen | Oudere software en oudere hardware-ondersteuning |
| Versheid: de nieuwste upstream-versies | Meer veranderingen om te testen bij elke update |
| Klein formaat: alleen wat strikt nodig is | Minder tools aan boord, meer compatibiliteitsverschillen |
| Lange ondersteuning: jarenlang beveiligingsupdates | Nieuwe functies komen later, soms met een abonnement |
| Bestuur door de community: geen enkel bedrijf aan het roer | Geen leverancier om te bellen als er iets stukgaat |
De nuttige vraag is dus nooit "welke distributie is de beste?", maar "welk evenwicht past bij deze machine?" Een laptop om op te ontwikkelen, een productiewebserver en een container-image hebben elk een ander antwoord, en daarom kan één beheerder zonder tegenspraak drie distributies draaien.
Naar boven2. Waar komt de naam vandaan?
Het woord distributie beschrijft de oorspronkelijke taak vrij letterlijk. Begin jaren negentig betekende "Linux installeren" dat je de kernel op de ene plek ophaalde, de GNU-tools op een andere, een C-bibliotheek, een shell en tientallen kleine programma's weer ergens anders, dat je ze compileerde en zelf op elkaar liet aansluiten. Een distributie was iemand die dat werk al had gedaan en het resultaat als kant-en-klare set schijfimages verspreidde. Je kreeg geen ander besturingssysteem, je kreeg een levering.
Dat is nog steeds de kern van het woord. Een distributie schrijft heel weinig van de software die ze meelevert. Haar echte product is de selectie, de integratie, het verpakken en de belofte om fixes te blijven leveren. De korte vorm distro is informeel, maar zo gangbaar dat je hem ook in officiële documentatie tegenkomt.
De namen van individuele distributies hebben vaak een eigen verhaal:
- Debian is een samentrekking van de namen van Debra en Ian Murdock, die het project oprichtten. Het project spreekt het uit als "Deb-ee-en" (Debian FAQ).
- Ubuntu is, in de woorden van het project zelf, "an ancient African word meaning 'humanity to others'" (ubuntu.com/about).
- Release-codenamen zijn een gewoonte van distributies, niet van Linux. Debian vernoemt zijn releases naar personages uit Toy Story (Debian 13 is
trixie), Ubuntu gebruikt een allitererend bijvoeglijk naamwoord met een dier (24.04 is "Noble Numbat", codenaamnoble). Je ziet die codenamen in de configuratiebestanden van repositories veel vaker dan de versienummers.
3. Een korte geschiedenis
Linus Torvalds kondigde de Linux-kernel aan in 1991, maar een kernel alleen is niet iets wat je kunt gebruiken. Binnen twee jaar verschenen de eerste distributies, en de families die zij begonnen bepalen nog steeds de vorm van bijna elk Linux-systeem dat vandaag draait.
Twee van de vroegste bestaan nog. Slackware, van Patrick Volkerding, had zijn eerste bètarelease in april 1993. Debian werd in augustus 1993 begonnen door Ian Murdock, toen student aan Purdue University, als een distributie die door een community van vrijwilligers wordt gebouwd en bestuurd in plaats van door één persoon of bedrijf. Het pakketformaat van Debian, .deb, en later de tool apt werden de basis van een hele familie.
De distributie van Red Hat gaf de wereld het andere grote pakketformaat, .rpm, en groeide uit tot Red Hat Enterprise Linux (RHEL), een commercieel product met lange ondersteuning. Daarna volgden gratis herbouwde versies van RHEL, waarvan CentOS de bekendste was. Toen het CentOS-project CentOS Linux 8 op 31 december 2021 beëindigde en zich ging richten op CentOS Stream, sprongen community-projecten als AlmaLinux, dat zichzelf "binary compatible with RHEL" noemt, in het gat.
In oktober 2004 verscheen Ubuntu 4.10, gemaakt door een klein team Debian-ontwikkelaars die samen het bedrijf Canonical oprichtten. Ubuntu nam de pakketten en tools van Debian over, voegde een vast releaseschema van zes maanden toe, en maakte de installatie van desktop en server vriendelijk genoeg voor een veel breder publiek.
| Jaar | Mijlpaal |
|---|---|
| 1991 | Linus Torvalds kondigt de Linux-kernel aan |
| 1993 | De eerste bèta van Slackware (april) en de start van Debian (augustus) |
| 2004 | Ubuntu 4.10 "Warty Warthog", gebouwd op Debian, verschijnt in oktober |
| 2012 | /etc/os-release voorgesteld als één standaard identiteitsbestand voor alle distributies |
| 2021 | CentOS Linux 8 bereikt het einde van zijn levensduur; RHEL-compatibele herbouwde versies zoals AlmaLinux nemen het over |
| Vandaag | Honderden distributies, bijna allemaal afstammelingen van een handvol families |
3.1 De families
De meeste distributies worden niet vanaf nul gebouwd. Ze beginnen bij een andere distributie en veranderen daar een deel van. Zo ontstaan stambomen, en de familie kennen is vaak nuttiger dan de naam kennen:
| Familie | Leden die je tegenkomt | Gedeelde tools |
|---|---|---|
| Debian | Debian, Ubuntu, en alles wat op Ubuntu is gebouwd | apt, dpkg, .deb |
| Red Hat | Fedora, RHEL, CentOS Stream, AlmaLinux | dnf, rpm, .rpm |
| SUSE | openSUSE Leap, SUSE Linux Enterprise Server | zypper, rpm, .rpm |
| Onafhankelijk | Arch Linux, Alpine, Slackware | Elk heeft zijn eigen |
De SUSE-familie laat zien dat een pakketformaat en een pakketbeheerder twee verschillende dingen zijn. openSUSE gebruikt hetzelfde .rpm-formaat als Fedora, maar een eigen beheerder, zypper, en noemt in os-release zijn eigen familie:
$ grep -E '^(ID|ID_LIKE)=' /etc/os-release # inside an openSUSE Leap 16.0 container
ID="opensuse-leap"
ID_LIKE="suse opensuse"
$ rpm -qf /usr/bin/ls
coreutils-9.6-160000.2.2.x86_64
3.2 Vaste releases versus rolling releases
De grootste filosofische scheiding tussen distributies is niet het pakketformaat, maar hoe ze met tijd omgaan.
Een distributie met vaste releases, zoals Debian, Ubuntu of AlmaLinux, bevriest een set softwareversies, test die samen, en brengt ze uit als één genummerde versie. Zolang die release meegaat, blijven de versies gelijk; er komen alleen bug- en beveiligingsfixes bij. Dat is wat servers willen: er verandert niets onder je voeten, tenzij je zelf besluit te upgraden.
Een rolling-release-distributie, zoals Arch Linux, heeft helemaal geen versienummers. Je installeert één keer en blijft bijwerken, en elke update kan nieuwe upstream-versies meebrengen. Het eigen /etc/os-release van Arch laat dat duidelijk zien:
$ cat /etc/os-release # inside an Arch Linux container
NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
...
Geen van beide modellen is beter. Rolling geeft je de nieuwste software; vast geeft je voorspelbaarheid. De keuze bepaalt hoeveel je zelf moet testen voor elke update.
3.3 Een derde model: image-gebaseerde en declaratieve systemen
Beide modellen hierboven werken een systeem pakket voor pakket bij, ter plekke. Een nieuwere groep distributies vervangt in plaats daarvan het hele systeem in één stap. Fedora Silverblue beschrijft het zonder omwegen: "The whole system is updated in one go, and an update will not apply if anything goes wrong", en "a previous version of your system is always kept around". De tool erachter, rpm-ostree, noemt zichzelf "a hybrid image/package system".
NixOS gaat nog een stap verder. Je installeert en configureert software helemaal niet met de hand; je beschrijft de hele machine in één bestand, /etc/nixos/configuration.nix, en nixos-rebuild switch bouwt die beschrijving en maakt er het draaiende systeem van. Elke wijziging voegt een nieuwe regel toe aan het opstartmenu, zodat een eerdere configuratie altijd één herstart ver weg is.
Het idee achter beide is het vangnet dat het artikel over de kernel voor kernels beschrijft, uitgebreid naar het hele systeem: verander nooit de werkende versie, bouw een nieuwe ernaast en houd de oude opstartbaar. De prijs is een andere manier van werken, want de klassieke gewoonte om even een bestand onder /usr aan te passen of snel een pakket te installeren past er niet meer bij.
3.4 Mijn vijf overstappen in negentien jaar
De families en releasemodellen hierboven zijn voor mij geen theorie. Ik gebruik Linux sinds 2007, en elke keer dat ik van distributie wisselde, ging het om een van de afwegingen uit paragraaf 1.4:
| Jaar | Overstap | Waarom | Wat het laat zien |
|---|---|---|---|
| 2007 | Ubuntu | Een kant-en-klare desktop om mee te beginnen | Een distributie bespaart je het zelf samenstellen van het systeem |
| 2011 | Ubuntu → Debian | Ik vond de nieuwe Unity-desktop niets | Dezelfde familie: apt, .deb en mijn gewoontes gingen ongewijzigd mee |
| 2012 | Debian → Arch Linux | Ik wilde een minimaal systeem dat ik zelf samenstelde | Rolling release, pacman, volledige controle |
| 2013 | Arch → Debian | USB-schijven werden niet meer automatisch gekoppeld tijdens de overstap van Arch van initscripts naar systemd | Een rolling release brengt grote integratiewijzigingen midden in gewone updates |
| 2018 | Debian → Ubuntu | Moderner en praktischer, en de distributie die ik het vaakst op servers tegenkwam | Één familie op laptop en servers |
Vandaag draai ik Ubuntu op mijn servers, Alpine in Docker-containers, en antiX, een distributie zonder systemd op basis van Debian Stable, op oude hardware. Zelfs mijn laptop begint als een minimale installatie van Ubuntu Server: een Ansible-playbook voegt daarna de GNOME-desktop en elk programma dat ik gebruik toe, zodat er op de laptop alleen staat wat ik nodig heb. Het is een zelfgemaakte versie van het declaratieve idee uit paragraaf 3.3: de machine wordt in een bestand beschreven, niet met de hand opgebouwd.
Geen van die overstappen was een zoektocht naar de beste distributie. Elke overstap was een ander antwoord op "welk evenwicht past bij deze machine?", en het antwoord veranderde zodra de taak veranderde.
Naar boven4. Eenvoudige toepassingen
De eerste vragen op elke nieuwe server zijn altijd dezelfde: wat is dit, welke versie, en hoe lang wordt het ondersteund? De antwoorden staan allemaal in een paar bestanden en commando's.
4.1 os-release lezen
Je zag /etc/os-release hierboven al. Het is het standaardantwoord, en het bestaat net zo goed op Debian, Ubuntu, Fedora, AlmaLinux, Arch als Alpine. Zelfs een minimale container-image heeft het:
$ cat /etc/os-release # inside an Alpine container
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.23.3
PRETTY_NAME="Alpine Linux v3.23"
...
Als een server zo oud is dat hij geen /etc/os-release heeft, vertelt alleen dat al je iets belangrijks: hij is in heel lange tijd niet geüpgraded.
4.2 hostnamectl en lsb_release
Op een systeem dat systemd draait, toont hostnamectl de distributie samen met de kernel en de hardware, een snel overzicht van de hele machine:
$ hostnamectl
Static hostname: xps
...
Operating System: Ubuntu 24.04.5 LTS
Kernel: Linux 7.0.0-34-generic
Architecture: x86-64
Oudere handleidingen gebruiken lsb_release, waarbij de vlag -a (kort voor "all") alles toont wat het weet. Het werkt op Ubuntu, maar het is een apart pakket dat op minimale installaties en in containers vaak ontbreekt, dus vertrouw er in scripts niet op:
$ lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 24.04.5 LTS
Release: 24.04
Codename: noble
4.3 Distributieversie is geen kernelversie
Dit zorgt voortdurend voor verwarring. De distributie heeft een versie, en de kernel heeft een volledig aparte versie:
$ grep VERSION_ID /etc/os-release
VERSION_ID="24.04"
$ uname -r
7.0.0-34-generic
24.04 is de release van Ubuntu, genoemd naar het jaar en de maand: april 2024. 7.0.0 is de Linux-kernel, die op deze laptop veel nieuwer is dan de distributie, omdat Ubuntu LTS-releases nieuwere kernels aanbiedt voor nieuwere hardware. Als een leverancier vraagt "welke Linux-versie?", wil hij bijna altijd beide nummers.
4.4 Uitzoeken hoe lang je release wordt ondersteund
Elke vaste release heeft een einddatum, waarna hij geen beveiligingsupdates meer krijgt. Die datum is het allerbelangrijkste feit over het besturingssysteem van een server, en de termijnen verschillen sterk per distributie:
| Distributie | Ondersteuning | Bron |
|---|---|---|
| Ubuntu LTS | Ongeveer vijf jaar standaardondersteuning (24.04: april 2024 tot mei 2029), langer met het betaalde Ubuntu Pro | ubuntu.com/about |
| Debian stable | Reguliere beveiligingsondersteuning, daarna verlengt Debian LTS elke stabiele release tot minstens vijf jaar | wiki.debian.org/LTS |
| Arch Linux | Geen einddatum, want er is geen release: je blijft ondersteund door continu bij te werken | Arch-wiki |
Zoek de datum voor jouw exacte release op de eigen site van de distributie op, en noteer hem naast de naam van de server. Een server die die datum ongemerkt passeert, blijft prima draaien; hij wordt alleen niet meer gerepareerd.
4.5 Naar de volgende release
De uitweg uit een aflopende release is een upgrade ter plekke naar de volgende, en elke familie heeft daar een eigen procedure voor. Op Ubuntu is het één commando, en de documentatie van Ubuntu voegt eraan toe: "you can only upgrade from one LTS release directly to the next sequential LTS release". Of de tool überhaupt niet-LTS-releases aanbiedt, staat in een klein configuratiebestand:
$ grep Prompt /etc/update-manager/release-upgrades
Prompt=lts
$ sudo do-release-upgrade # Ubuntu: upgrade to the next release
Debian heeft zo'n tool niet. De release notes zeggen dat je de codenaam in je APT-bronnen aanpast (bookworm wordt trixie), en daarna apt update, apt upgrade --without-new-pkgs en ten slotte apt full-upgrade uitvoert. Fedora gebruikt een dnf-commando dat eerst alles downloadt en het tijdens een herstart installeert:
$ sudo dnf system-upgrade download --releasever=45 # Fedora: fetch the next release
$ sudo dnf system-upgrade reboot # install it during a restart
Welke familie het ook is: lees eerst de release notes en maak een back-up. Een release-upgrade vervangt honderden pakketten tegelijk, en dat is het riskantste moment in het leven van een systeem met vaste releases.
Naar boven5. Gematigde toepassingen
Als je weet op welke distributie je zit, is de volgende stap werken met wat haar anders maakt: haar pakketbeheerder, haar repositories, en haar versies van de tools die je elke dag gebruikt.
5.1 Eén taak, vijf pakketbeheerders
Het meest zichtbare verschil tussen families is het commando dat je typt om software te beheren. De ideeën zijn overal hetzelfde; alleen de woorden veranderen:
| Taak | Debian / Ubuntu | Fedora / AlmaLinux | openSUSE | Arch | Alpine |
|---|---|---|---|---|---|
| Pakketlijsten verversen | apt update |
dnf makecache |
zypper refresh |
pacman -Sy |
apk update |
| Een pakket installeren | apt install nginx |
dnf install nginx |
zypper install nginx |
pacman -S nginx |
apk add nginx |
| Zoeken | apt search nginx |
dnf search nginx |
zypper search nginx |
pacman -Ss nginx |
apk search nginx |
| Van wie is dit bestand? | dpkg -S FILE |
rpm -qf FILE |
rpm -qf FILE |
pacman -Qo FILE |
apk info --who-owns FILE |
Bij pacman is de hoofdletter de bewerking: -S (kort voor "sync", installeren vanuit de repositories) en -Q (kort voor "query", vragen over geïnstalleerde pakketten). In rpm -qf is -q "query" en -f "file"; het werkt ook op openSUSE, omdat zypper boven op dezelfde rpm-database zit. De apt-kant wordt uitgebreid behandeld in het artikel over apt.
5.2 Elk bestand hoort bij een pakket
Op een distributie is bijna elk bestand buiten je thuismap en je data daar door een pakket neergezet. Vragen welk pakket een bestand bezit, is hoe je ontdekt waar een programma vandaan komt, wat je opnieuw moet installeren als het stukgaat, en wiens documentatie je moet lezen:
$ dpkg -S /usr/bin/ls # Ubuntu
coreutils: /usr/bin/ls
$ rpm -qf /usr/bin/ls # Fedora
coreutils-9.10-5.fc44.x86_64
$ pacman -Qo /usr/bin/ls # Arch
/usr/bin/ls is owned by coreutils 9.12-2
$ apk info --who-owns /bin/ls # Alpine
/bin/ls symlink target is owned by busybox-1.37.0-r30
Drie distributies geven hetzelfde antwoord: ls komt uit GNU coreutils. Alpine geeft een ander antwoord, en dat verschil is het onderwerp van paragraaf 6.4.
5.3 Repositories: waar de software vandaan komt
Een pakketbeheerder installeert uit repositories: servers van de distributie waarop haar ondertekende pakketten staan. Je systeem heeft daar een lijst van, en op Ubuntu 24.04 ziet die er zo uit:
$ cat /etc/apt/sources.list.d/ubuntu.sources
Types: deb
URIs: http://nl.archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
...
Lees het als een zin: haal .deb-pakketten op van deze mirror, voor de release noble en zijn updatekanalen, uit deze vier secties, en vertrouw alleen pakketten die met deze sleutel zijn ondertekend. De codenaam duikt hier weer op; dit is waar hij er echt toe doet. Om precies te zien uit welke repository een pakket is geïnstalleerd, vraag je het aan apt-cache policy:
$ apt-cache policy coreutils
coreutils:
Installed: 9.4-3ubuntu6.3
Candidate: 9.4-3ubuntu6.3
Version table:
*** 9.4-3ubuntu6.3 500
500 http://nl.archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages
500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages
5.4 Hetzelfde commando, verschillende versies
Omdat elke distributie haar eigen set upstream-versies bevriest, kan hetzelfde commando op elke machine een ander programma zijn. Hier is ls op de zes systemen die voor dit artikel zijn getest, allemaal op dezelfde dag:
| Distributie | Levert ls | Waarom |
|---|---|---|
| Ubuntu 24.04 | GNU coreutils 9.4 | LTS-release, bevroren in 2024 |
| Debian 13 | GNU coreutils 9.7 | Nieuwere stabiele release |
| Fedora 44 | GNU coreutils 9.10 | Snelle releasecyclus |
| Arch Linux | GNU coreutils 9.12 | Rolling: altijd dicht bij upstream |
| Alpine 3.23 | BusyBox 1.37.0 | Een heel ander programma |
Meestal maakt dit niets uit. Soms bestaat een vlag waarop je rekent in de ene versie wel en in de andere niet, en faalt een commando dat je van een blog hebt gekopieerd op je server zonder zichtbare reden. Als dat gebeurt, is de eerste vraag: "welke distributie en welke release is dit?"
Naar boven6. Gevorderde toepassingen
De paragrafen hierboven gingen over lezen. Deze gaat over de plekken waar verschillen tussen distributies pijn doen: scripts die overal moeten draaien, versiestrings die je moet ontcijferen, containers, en programma's die weigeren te starten.
6.1 Scripts die de distributie kennen
/etc/os-release is gemaakt om door scripts te worden gelezen. Het formaat bestaat uit eenvoudige shellvariabelen, dus een script kan het laden met het commando . en daarna de variabelen testen:
#!/bin/sh
. /etc/os-release
case "$ID" in
debian|ubuntu) pkg="apt-get install -y" ;;
fedora|almalinux|rhel) pkg="dnf install -y" ;;
opensuse-leap) pkg="zypper install -y" ;;
arch) pkg="pacman -S --noconfirm" ;;
alpine) pkg="apk add" ;;
*) echo "Unknown distribution: $ID" >&2; exit 1 ;;
esac
Dat werkt tot iemand je script draait op een distributie waar je nog nooit van hebt gehoord. Daar is ID_LIKE voor. De handleiding van os-release zegt dat buildscripts "should check this variable if they need to identify the local operating system and the value of ID= is not recognized". AlmaLinux noemt bijvoorbeeld drie verwanten, de naaste eerst:
$ grep -E '^(ID|ID_LIKE)=' /etc/os-release # inside an AlmaLinux 9 container
ID="almalinux"
ID_LIKE="rhel centos fedora"
Een robuust script controleert dus eerst ID en loopt daarna ID_LIKE af. Een distributie die van Ubuntu is afgeleid, zet meestal ubuntu of debian in ID_LIKE, en je apt-tak werkt gewoon. Merk op dat het formaat bewust geen shellfuncties ondersteunt behalve gewone toewijzingen, zodat andere programma's het bestand zonder shell kunnen lezen. De volledige lijst velden staat in man os-release en op de documentatiesite van systemd.
6.2 De versiestring van een distributie lezen
Een pakketversie op een distributie is niet de upstream-versie. Het is de upstream-versie plus de eigen wijzigingsgeschiedenis van de distributie. Neem de SSH-client op Ubuntu 24.04:
$ dpkg -l openssh-client | tail -1
ii openssh-client 1:9.6p1-3ubuntu13.19 amd64 secure shell (SSH) client, ...
Lees 1:9.6p1-3ubuntu13.19 van links naar rechts:
| Deel | Betekenis |
|---|---|
1: |
De epoch: een teller die de pakketbouwers ophogen als een versieschema verandert, zodat nieuwer altijd hoger sorteert |
9.6p1 |
De upstream-versie: wat het OpenSSH-project uitbracht |
-3 |
De Debian-revisie: de derde Debian-verpakking van die upstream-versie |
ubuntu13.19 |
De eigen wijzigingen van Ubuntu boven op het pakket van Debian, sindsdien vele keren herzien |
Die ene string vertelt het hele familieverhaal uit paragraaf 3.1: upstream-code, verpakt door Debian, opnieuw aangepast door Ubuntu. Distributies op basis van RPM coderen hetzelfde idee anders; coreutils-9.10-5.fc44 betekent upstream 9.10, de vijfde build van Fedora, voor Fedora 44.
6.3 Distributies in containers
Als je FROM debian of FROM alpine in een Dockerfile schrijft, kies je een distributie. Een container-image bevat de userland van een distributie, haar pakketbeheerder en haar /etc/os-release, maar geen kernel. Elke container op een host gebruikt de kernel van de host:
$ uname -r # the Ubuntu host
7.0.0-34-generic
$ docker exec web uname -r # an Alpine container on it
7.0.0-34-generic
$ docker exec web grep PRETTY /etc/os-release
PRETTY_NAME="Alpine Linux v3.23"
Deze Alpine-container is geen demo: het is de Apache-container uit mijn eigen lokale Joomla-ontwikkelomgeving, die op deze Ubuntu-laptop draait. De container meldt zich eerlijk als Alpine, en draait eerlijk op de kernel van Ubuntu. Allebei waar, want een distributie en een kernel zijn verschillende lagen. Dit is het praktische bewijs van de stapel uit paragraaf 1.2. Het artikel over Docker legt uit welke kernelfuncties dit mogelijk maken.
Een virtuele machine is het omgekeerde geval. Die emuleert een hele computer, dus de gast start zijn eigen kernel, en een Debian-VM draait echt een Debian-kernel. Heb je een andere kernelversie of andere kernelinstellingen nodig dan de host, dan heb je een VM nodig, geen container.
Een container-image is ook niet altijd een complete distributie. Basis-images zijn flink uitgekleed, en de kleinste hebben soms geen init-systeem, geen shell of helemaal geen pakketbeheerder. Dat is normaal: een image hoeft maar één applicatie te draaien, geen machine op te starten.
6.4 Als een programma niet wil starten: glibc versus musl
Bijna elke distributie gebruikt de GNU C-bibliotheek, glibc. Alpine is anders: het is "built around musl libc and busybox". De C-bibliotheek is de laag die bijna elk programma aanroept voor basiszaken zoals bestanden openen, dus een programma dat tegen glibc is gecompileerd, verwacht dat glibc er is. Kopieer het programma ls van Ubuntu naar een Alpine-container en probeer het te starten:
$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB pie executable, x86-64, ... interpreter /lib64/ld-linux-x86-64.so.2 ...
$ docker run --rm -v /usr/bin/ls:/tmp/ls:ro httpd:alpine sh -c '/tmp/ls /'
sh: /tmp/ls: not found
"Not found" voor een bestand dat er duidelijk staat, is een van de verwarrendste foutmeldingen in Linux. Het bestand is er. Wat ontbreekt, is de interpreter die erin wordt genoemd, /lib64/ld-linux-x86-64.so.2, de programmalader van glibc, en die heeft Alpine niet. Alpine heeft zijn eigen lader, die van musl:
$ docker exec web sh -c 'ls /lib/ld-musl*'
/lib/ld-musl-x86_64.so.1
Hetzelfde gebeurt met een gedownload programma dat voor de ene familie is gebouwd en op een andere draait, of met een kant-en-klaar taalpakket (een PHP-extensie, een Python-wheel, een Node-module) dat voor glibc is gecompileerd. De oplossing is het eigen pakket van de distributie installeren, of een build die voor musl is gemaakt. Dat is precies wat de PHP-image van mijn eigen Joomla-ontwikkelomgeving doet: hij begint bij php:8.3.26-fpm-alpine, installeert g++, make en de -dev-headers van ImageMagick, en compileert de extensie imagick met pecl in de image zelf, zodat het resultaat tegen musl linkt en niet tegen glibc. Een programma is alleen overdraagbaar tussen distributies die dezelfde C-bibliotheek gebruiken.
6.5 De commando's van Alpine zijn BusyBox
Het antwoord van apk info --who-owns in paragraaf 5.2 verraadde het al: op Alpine is ls helemaal geen GNU ls. Het is een symbolische link naar BusyBox, één enkel programma dat zich gedraagt als ls, cp, sh en honderden andere commando's, afhankelijk van de naam waarmee het wordt aangeroepen:
$ docker exec web ls -l /bin/ls /bin/sh
lrwxrwxrwx 1 root root 12 Jan 28 2026 /bin/ls -> /bin/busybox
lrwxrwxrwx 1 root root 12 Jan 27 2026 /bin/sh -> /bin/busybox
$ docker exec web ls --version
ls: unrecognized option: version
Daarom zijn Alpine-images zo klein, en daarom kunnen vlaggen die alleen GNU kent, uit een handleiding, erin falen. Ook de standaardshell verschilt per distributie: op Debian en Ubuntu is /bin/sh dash; op Fedora is het bash; op Alpine is het BusyBox. Een script dat begint met #!/bin/sh krijgt op elk ervan een andere shell. Het artikel over POSIX legt uit hoe je scripts schrijft die dat overleven.
6.6 Software die de distributie omzeilt
Niet alles op een modern systeem komt via de eigen repositories van de distributie binnen. Formaten zoals snap en Flatpak leveren een applicatie samen met de bibliotheken die ze nodig heeft, zodat hetzelfde pakket op veel distributies draait. Ubuntu 24.04 gaat nog verder en levert Firefox op deze manier. Het Firefox-.deb is alleen een plaatshouder die naar de snap verwijst:
$ dpkg -l firefox | tail -1
ii firefox 1:1snap1-0ubuntu5 amd64 Transitional package - firefox -> firefo...
$ snap list firefox
Name Version Rev Tracking Publisher Notes
firefox 157.0-1 8995 latest/stable/... mozilla** -
Kijk naar de kolom Publisher: deze Firefox wordt gebouwd en bijgewerkt door Mozilla, niet door Ubuntu. Dat verandert wie verantwoordelijk is voor de fixes. Alles wat paragraaf 7.1 zegt over beheerders van een distributie die beveiligingspatches backporten, geldt voor de pakketten uit de repositories van de distributie. Een snap, een Flatpak, een container-image of een programma dat je hebt gedownload, wordt gepatcht door wie het heeft gepubliceerd, op hun eigen schema, en apt upgrade raakt het niet aan. Houd op een server bij wat waar vandaan komt, en controleer elke bron apart.
7. Iets wat de meeste gebruikers niet weten
7.1 Oude versienummers kunnen volledig gepatcht zijn
Een beveiligingsscanner bekijkt de server hierboven, ziet OpenSSH 9.6p1, en meldt een lange lijst kwetsbaarheden die in nieuwere upstream-versies zijn opgelost. In veel gevallen is de server helemaal niet kwetsbaar.
Een distributie met vaste releases belooft tijdens een release geen versies te veranderen, omdat een nieuwe upstream-versie gedrag kan veranderen en dingen kan breken. Wordt er een beveiligingslek gevonden, dan nemen de beheerders van de distributie alleen de fix uit de nieuwere versie en passen die toe op de oude. Dat heet backporten. Het upstream-nummer blijft 9.6p1; alleen het achtervoegsel van de distributie groeit. De changelog laat zien welke fixes erin zijn gegaan:
$ zcat /usr/share/doc/openssh-client/changelog.Debian.gz | grep -c CVE-
64
Op een distributie zegt het upstream-versienummer dus weinig over beveiliging. De volledige pakketversie en de eigen beveiligingsberichten van de distributie zeggen dat wel. Dit is ook waarom "upgrade naar de nieuwste upstream-versie" meestal het verkeerde advies is voor een stabiele server: de distributie doet dat werk al, en zorgvuldiger.
7.2 Ubuntu denkt dat het een Debian is die nooit is uitgebracht
Distributies uit de Debian-familie hebben al lang voordat os-release bestond een klein bestand, /etc/debian_version. Ubuntu erft het, en het zegt iets verrassends:
$ cat /etc/debian_version # on Ubuntu 24.04
trixie/sid
$ cat /etc/debian_version # on real Debian 13
13.7
Ubuntu wordt niet gebouwd op een afgeronde Debian-release. Elke zes maanden neemt het een momentopname van de ontwikkeltak van Debian, die op dat moment nog niet af is, en bouwt daarop verder. trixie/sid betekent "het werk dat later Debian 13 zou worden, uit de ontwikkelstroom genomen". Het bestand is een fossiel van precies de plek waar Ubuntu 24.04 van zijn ouder is afgetakt.
7.3 /etc/os-release is jonger dan de meeste distributies
Ongeveer twintig jaar lang had elke familie een eigen manier om te zeggen wie ze was: /etc/debian_version, /etc/redhat-release, /etc/lsb-release, en nog veel meer. Scripts moesten ze allemaal controleren. In februari 2012 stelden de ontwikkelaars van systemd os-release voor als één standaardbestand voor iedereen, en het bleek zo nuttig dat zelfs distributies die geen systemd gebruiken, zoals Alpine, het overnamen. De oude bestanden staan er nog, omdat oude scripts ze nog lezen:
$ cat /etc/redhat-release # inside a Fedora container
Fedora release 44 (Forty Four)
En het bestand dat je leest, staat meestal niet eens in /etc. De specificatie zegt dat de kopie van de leverancier in /usr/lib/os-release hoort, met /etc/os-release als relatieve symbolische link ernaartoe:
$ ls -l /etc/os-release
lrwxrwxrwx 1 root root 21 Sep 6 16:29 /etc/os-release -> ../usr/lib/os-release
7.4 Waar een distributie ophoudt
Het helpt om te weten welke vragen over de distributie gaan en welke niet:
- Hardware, drivers en systeemaanroepen zijn de kernel, die bij elke distributie hetzelfde is: zie het artikel over de kernel.
- Hoe services starten en stoppen, is het init-systeem. Debian, Ubuntu, Fedora en Arch gebruiken systemd; Alpine gebruikt OpenRC. Zie het artikel over systemd.
- Hoe software op de machine komt, is de pakketbeheerder, het meest distributiespecifieke onderdeel van allemaal: zie het artikel over apt.
- Of een commando zich overal hetzelfde gedraagt, is een vraag over standaarden: zie het artikel over POSIX.
8. Beste werkwijzen
- Lees eerst
/etc/os-release. Weet op elke onbekende server de distributie, de release en de familie voordat je ook maar één installatiecommando typt. - Kies voor servers een distributie met vaste LTS-releases. Voorspelbare versies en jarenlange beveiligingsupdates wegen op een productiemachine veel zwaarder dan de nieuwste software.
- Noteer de einddatum van de ondersteuning. Zet hem naast de naam van de server en plan de upgrade ruim van tevoren. Een server voorbij die datum draait nog; hij wordt alleen niet meer gerepareerd.
- Installeer software uit de repositories van de distributie. Die pakketten zijn ondertekend, samen getest en krijgen gebackporte beveiligingsfixes. Een programma dat je zelf compileert of downloadt, is een programma dat je zelf moet patchen.
- Beoordeel beveiliging op de pakketversie, niet op de upstream-versie. Controleer de beveiligingsberichten van de distributie of de changelog van het pakket voordat je een scanner gelooft die alleen het upstream-nummer leest.
- Gebruik
IDenID_LIKEin scripts. Lees nooitPRETTY_NAMEof/etc/issueuit; die zijn voor mensen en veranderen van vorm. - Let op de C-bibliotheek als je programma's kopieert of images bouwt. Een glibc-programma draait niet op Alpine, en een "not found" voor een bestand dat bestaat, betekent meestal precies dat.
- Houd waar het kan dezelfde familie aan op al je servers. Eén pakketbeheerder, één set paden, één set gewoontes: minder verrassingen om drie uur 's nachts.
- Lees de documentatie.
man os-releasebeschrijft elk veld, en het eigen handboek of de wiki van elke distributie is de naslag voor haar tools.
$ man os-release # every field of the identity file
$ man hostnamectl # system identity on systemd distributions
$ man dpkg # Debian family packages (rpm, pacman, apk elsewhere)
Naar boven9. Veelgemaakte fouten
9.1 Mythe versus werkelijkheid
| Mythe | Werkelijkheid |
|---|---|
| "Ik heb Linux geïnstalleerd." | Je hebt een distributie geïnstalleerd. Linux is alleen de kernel erin. |
| "De distributieversie en de kernelversie zijn hetzelfde." | Ze staan los van elkaar. Ubuntu 24.04 draait op deze machine kernel 7.0.0. |
| "Een oud versienummer betekent dat de software kwetsbaar is." | Distributies met vaste releases backporten beveiligingsfixes naar de oude versie. Controleer de pakketversie en de changelog. |
| "Een Linux-programma draait op elke Linux." | Alleen op distributies met dezelfde C-bibliotheek en de bibliotheken die het nodig heeft. Een glibc-programma faalt op Alpine, dat musl gebruikt. |
| "Een Debian-container draait de Debian-kernel." | Containers hebben geen eigen kernel. Ze gebruiken allemaal de kernel van de host. |
| "Rolling releases zijn instabiel, vaste releases zijn stabiel." | Beide kunnen stabiel zijn. Ze verschillen in wanneer veranderingen komen: continu, of eens per release. |
| "Elke distributie is totaal anders." | De meeste horen bij een paar families en delen dezelfde pakkettools en gewoontes. |
9.2 Andere valkuilen om te vermijden
- Installatiecommando's kopiëren uit een handleiding voor een andere familie. Een
apt-commando doet niets nuttigs op AlmaLinux. Controleer eerst de familie, en vertaal het commando dan met de tabel uit paragraaf 5.1. - Repositories van verschillende releases of distributies mengen. Een Debian-repository aan Ubuntu toevoegen, of de repository van een nieuwere release aan een oudere, kan bibliotheken binnenhalen die de rest van het systeem breken.
- De einddatum van de ondersteuning vergeten. De machine blijft werken, en juist daarom merkt niemand dat hij geen beveiligingsupdates meer krijgt.
- In scripts op
lsb_releaserekenen. Het is op minimale systemen en in containers vaak niet geïnstalleerd./etc/os-releaseis er altijd. - Aannemen dat
/bin/shbash is. Het isdashop Debian en Ubuntu en BusyBox op Alpine. Bash-functies in een#!/bin/sh-script breken daar. - Alpine kiezen voor een kleine image zonder te testen. Het formaat is echt, maar de verschillen van musl en BusyBox ook. Test je applicatie erop, niet alleen je Dockerfile.
10. Samenvatting
Een Linux-distributie is het complete besturingssysteem rond de kernel: de userland, de C-bibliotheek, de pakketbeheerder en repositories, het init-systeem, de standaardinstellingen, en de belofte om het allemaal een vastgesteld aantal jaren te patchen. De kernel wordt gedeeld. Alles wat je in je dagelijkse werk opmerkt, de commando's, de versies, het updateritme, is de distributie.
- Een distributie (of distro) bundelt de Linux-kernel met upstream-software, verpakt die en onderhoudt die; de naam komt van het letterlijk verspreiden van die bundel.
/etc/os-releaseidentificeert het systeem:IDenVERSION_IDvoor scripts,ID_LIKEvoor de familie,PRETTY_NAMEvoor mensen.- Er zijn zoveel distributies omdat elke een ander evenwicht kiest tussen stabiliteit, versheid, formaat, duur van de ondersteuning en bestuur.
- De meeste distributies horen bij een familie: Debian (
apt,.deb), Red Hat (dnf,.rpm), SUSE (zypper,.rpm), of een onafhankelijke zoals Arch of Alpine. - Distributies kiezen ook de beveiligingsmodule: AppArmor op Ubuntu, SELinux op Red Hat Enterprise Linux.
- Slackware en Debian begonnen allebei in 1993; Ubuntu volgde in 2004, gebouwd op Debian; AlmaLinux en andere herbouwde versies vulden het gat nadat CentOS Linux 8 in 2021 stopte.
- Vaste releases bevriezen versies en backporten fixes; rolling releases zoals Arch werken continu bij en hebben geen versienummer; image-gebaseerde systemen zoals Fedora Silverblue en NixOS vervangen het hele systeem in één stap en houden het vorige opstartbaar.
- Elke vaste release loopt af;
do-release-upgrade, de codenaamwissel van Debian plusapt full-upgrade, endnf system-upgradebrengen je naar de volgende. - De distributieversie en de kernelversie zijn verschillende nummers; meestal heb je ze allebei nodig.
- Elk bestand hoort bij een pakket:
dpkg -S,rpm -qf,pacman -Qo,apk info --who-owns. - Een pakketversie zoals
1:9.6p1-3ubuntu13.19bevat de upstream-versie plus de eigen revisies van de distributie, dus een oud upstream-nummer kan nog steeds volledig gepatcht zijn. - Containers bevatten de userland van een distributie maar gebruiken de kernel van de host; een virtuele machine start haar eigen kernel.
- Snaps, Flatpaks, container-images en gedownloade programma's omzeilen de distributie, dus hun uitgever, niet de distributie, is verantwoordelijk voor het patchen.
- Programma's zijn gebonden aan hun C-bibliotheek: een glibc-programma meldt "not found" op Alpine, dat musl gebruikt en waarvan de commando's BusyBox zijn.
Dit is de handige naslag om te bewaren:
cat /etc/os-release which distribution, release and family
. /etc/os-release; echo "$ID" the distribution ID inside a script
hostnamectl distribution, kernel and hardware at once
uname -r the kernel version (not the distro version)
cat /etc/debian_version Debian family: the parent release
dpkg -S FILE Debian/Ubuntu: which package owns a file
rpm -qf FILE Fedora/RHEL/SUSE: which package owns a file
pacman -Qo FILE Arch: which package owns a file
apk info --who-owns FILE Alpine: which package owns a file
apt-cache policy PKG Debian/Ubuntu: installed version and its repository
cat /sys/kernel/security/lsm active security modules (apparmor, selinux)
snap list software that bypasses the distribution
sudo do-release-upgrade Ubuntu: move to the next release
file BINARY which loader (glibc or musl) a program expects
man os-release every field explained
En als een beveiligingsscan een server als gevaarlijk verouderd markeert terwijl elke update is geïnstalleerd, is het antwoord vaak een distributie die de fixes stilletjes heeft gebackport en het oude versienummer heeft gehouden.
Naar boven

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.












