[Linux] Futtassunk bármely disztrót a terminálunkban

A Distrobox egy olyan program, amivel konténerizált Linux disztribúciókat futtathatunk a gépünkön futó Linuxon belül. Ami miatt nagyon hasznos tud lenni, az az, hogy az alaprendszertől eltérő disztribúciókat, és azon belül eltérő verziókat is használhatunk.

Tehát ha pl. Debiant használunk, telepíthetünk mellé konténerbe egy Arch-ot, egy Fedorát 39-es és 41-et, egy Ubuntu 20.04-et és egy 24.10-et, és mondjuk egy OpenSuse Tumbleweed-et is.
De ahhoz, hogy jobban megértsük a Distrobox működését, nézzük meg, mi az a konténerizációt.

A konténerizáció, azaz a Linuxos operációs-szintű virtualizáció

A konténerizáció egy eléggé "túlterhelt" fogalom lett mára, elég sok, egymástól többé-kevésbé különböző megoldást hívunk konténerizációnak. Amiről itt szó van, az kifejezetten a Linuxos operációs-szintű virtualizáció.
Nos, a konténer tulajdonképpen egy elszeparált futattókörnyezet az operációs rendszeren belül. Egy konténerben futtatott program csak az ugyanabban a konténerben futó processzeket látja, csak az ugyanbban a konténerben lévő fájlokhoz, könyvtárakhoz és hálózati megosztásokhoz fér hozzá, csak a konténernek átadott eszközöket látja, és így tovább. Ráadásul nagyon egyszerűen szabályzhatók a konténerben futó folyamatok erőforrásai (CPU, memória, lemez I/O, stb.). Mindezt a Linux kernel "csípőből" hozza, hiszen a szeparációt megvalósító "kernel namespaces" 2002 óta a Linux kernel része, az erőforrás-szabályozást biztosító "cgroups" pedig 2008 óta, úgyhogy nem egy újkeletű dologról van szó, mondhatni, teljesen kiforrott a technológia. Konténereket szinte mindenki használ, akár úgy is, hogy nem is tud róla - pl. sok NAS is konténerben futtatja az appjait, de a mobilalkalmazások is a saját kis konténerükben futnak.
A konténerek elég rugalmasak, olyan szempontból, hogy futtathatunk bennük csupán egyetlen binárist, vagy belecsomagolhatunk egy binárist a függőségeivel együtt, de nagyon gyakori az is, hogy egy nagyon minimális, de működő Linux disztribúció kerül a konténerbe, és azon a környezeten belül fut a program.
A Distrobox egy segédeszköz, amivel ilyen, konténerizált Linuxot futtathatunk úgy, hogy a létrehozott konténer szorosan integrálódik a rendszerbe.
Maga a Distrobox nem egy konténer implementáció, hanem Dockerre, Podmanre vagy Lilipodra épülve oldja meg a konténerizációt. A Podman a javasolt megoldás, mert "rootless", azaz nem szükséges hozzá, hogy folyamatosan fusson egy root szintű daemon, mint Docker esetében. A konténerekben futó operációs rendszer kernele osztozik a gazdagépen futtatott kernellel, az izoláció kernel szinten történik, tehát a kerneltől "magasabb" (felhasználó-közelibb) szinten lévő rétegek különölnek.

Hirdetés

Itt hívnám fel a figyelmet arra, hogy a Distrobox úgy lett kialakítva, hogy a konténerben futtatott rendszer a lehető legszorosabban integrálódjon a gazdarendszerbe, és ezt többek közt ezt azzal éri el, hogy a teljes /home könyvtárunkhoz hozzáfér, látja a futó folyamatainkat, osztozik a gazdarendszer X/Wayland sessionjével, stb. A distrobox konténerei tehát nagyon "nyitott" konténerek, ellentétben mondjuk egy Docker konténerrel, vagy egy flatpak csomaggal. Így ez nem tekinthető egy biztonsági megoldásnak (security sandbox), tehát veszélyes alkalmazásokat ne futtassunk Distrobox konténerben (sem)!
Továbbá, a konténer nem virtuális gép, tehát ne várjuk azt, hogy majd szépen látjuk, amint megjelenik a Plymouth képernyő, és ahogy bebootol a rendszer. A konténerezett disztribúciót parancssorból lehet kezelni, de ettől függetlenül grafikus alkalmazások is futtathatók benne.
Fontos megjegyezni azt is, hogy nem minden alkalmazás futtatható distrobox konténerben. Az olyanok például, amelyek saját systemd szolgáltatásra támaszkodnak, nem fognak futni, illetve amelyek szolgáltatás nyújtanak, nem lesznek elérhetők a gazdarendszerből.

Distrobox

A telepítése pontosan úgy történik, mint bármelyik másik programnál, azaz a disztribúciónk csomagkezelőjével. Ha esetleg a repóban nincs benn a Distrobox, akkor megpróbálhatjuk közvetlenül a Githubról telepíteni:

curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/install | sudo sh

Vagy wgettel:

wget -qO- https://raw.githubusercontent.com/89luca89/distrobox/main/install | sudo sh

Ha nem akarunk vagy tudunk rootra váltani a telepítéshez, akkor saját részre is telepíthetjük:

curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/install | sh -s -- --prefix ~/.local

Vagy wgettel:

wget -qO- https://raw.githubusercontent.com/89luca89/distrobox/main/install | sh -s -- --prefix ~/.local

Hogy jelenleg melyik disztróban érhető el a distrobox és hogyan lehet telepíteni, arról innen tájékozódhatunk:
https://github.com/89luca89/distrobox/blob/main/docs/compatibility.md#host-distros

A konténerekhez az alaprendszer nem ISO fájlból érkezik, mint általában egy rendszer telepítésénél, hanem Docker lemezképekről, azaz image-ekről.
Ha csak annyit írunk be, hogy distrobox enter, akkor a rendszer készít egy konténert a gazdarendszerrel megegyező disztribúcióval (ha még nincs), ha már létezik ilyen konténer, akkor csak belép a konténerbe. Ha más disztróval szeretnénk konténert készíteni, azt így tudjuk megtenni.

distrobox create --image <disztribúció neve>:<verziószám> --name <konténer neve>

Példák:
distrobox create --image debian --name debian
distrobox create --image arch:latest --name arch
distrobox create --image ubuntu:22.04 --name ubuntu_2204
distrobox create --image ubuntu:noble --name ubuntu_noble

Az --image paraméter után kell megadni azon disztribúció image-ének a nevét és verziószámát, amiből konténert szeretnénk készíteni. Verziószám helyett megadhatunk különböző tageket is, mint pl. latest. Ha nem adunk meg semmit, a legfrissebb image kerül letöltésre.
A --name után a konténer nevét adhatjuk meg, amivel később hivatkozni tudunk rá.

Az image-ek letöltéséhez természetesen élő netkapcsolat szükséges, de itt jellemzően pár száz megabájtos fájlokra kell gondolni, nem több gigabájtos telepítőkre. Ha nem tudjuk, hogy milyen néven találhatunk meg egy adott image-et, nézzünk fel a https://hub.docker.com-ra.
Minden egyes konténerhez készül egy indítóikon is a menübe, ha elindítjuk, egy olyan terminált kapunk, ami már be van lépve a konténerbe.


Egy Arch és egy Debian konténer

Egy konténerbe terminálból belépni így tudunk:

distrobox enter <konténer neve>

Pl. distrobox enter debian

Meglévő konténereinket a distrobox list paranccsal tudjuk kilistázni.

A konténerbe ezután az adott disztribúció csomagkezelőjével telepíthetünk programokat.


Itt éppen Inkscape-et telepítek párhuzamosan egy Arch, egy Debian és egy Fedora konténerbe.


Itt egyszerre futtatom mindhármat.


Itt pedig három eltérő verziójú nano-t futtatok a három konténerben.

A konténerbe telepített alkalmazásokat exportálnunk kell ahhoz, hogy a gazdarendszerben is el tudjuk érni őket. Ehhez be kell lépni abba a konténerben, amibe telepítettük az adott alkalmazást, majd a distrobox-export parancsot kiadni, pl.:

distrobox-export --app gimp

Ha olyan programot szeretnénk exportálni, amihez nem tartozik .desktop fájl, akkor a --bin kapcsolót, és abszolút útvonalat kell használni, pl.:

distrobox-export --bin /usr/bin/nano

Egy flatpakból telepített, és egy Tumbleweed konténerbe telepített GIMP

Tovább a fórumba.