Hirdetés

[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.

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. Í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 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

Ezután a gimp is, és a nano meghívható a gazdarendszerben.

Korábban exportált appjainkat így tudjuk listázni:

distrobox-export --list-apps

A binárisokat (desktop fájl nélküli programokat) pedig így:

distrobox-export --list-binaries

Ha a konténerből eltávolítunk egy exportált programot, a gazdarendszerből nem fog eltűnni, ezt külön kell megtennünk. Ugyanúgy a distrobox-export parancsot fogjuk használni, csak hozzácsapunk még egy --delete kapcsolót:

distrobox-export --app gimp --delete

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

Ha szeretnénk frissíteni egy konténerben lévő rendszert, megtehetjük úgy, hogy belépünk a konténerbe, és kiadjuk az adott disztribúció csomagkezelőjének megfelelő parancsokat. De használhatjuk a distrobox beépített megoldását is:

distrobox upgrade <konténer neve>

Pl. distrobox upgrade arch

Ez frissíti az arch nevű konténerben lévő rendszert. Ha egy menetben szeretnénk az összes konténert frissíteni, akkor pedig adjuk ki a distrobox upgrade --all parancsot.

A konténer folyamata akkor is tovább fut, ha kilépünk belőle (ez teszi lehetővé a következő belépésnél a gyors indítást), de ha le szeretnénk állítani, a distrobox stop paranccsal meg tudjuk tenni. Ha az --all kapcsolót hozzáírjuk, akkor az összes konténer leáll. Én sosem használtam még ezt a parancsot, szerintem legfeljebb akkor érdemes, ha nagyon erőforrásszűkében vagyunk.

Konténert törölni pedig így tudunk:
distrobox rm <konténer neve>

Pl. distrobox rm arch

Még egy érdekes funkció, a distrobox ephemeral, ami egy átmeneti konténert hoz létre, ami törlődik, ha kilépünk belőle. Adott esetben jól jöhet.

A distrobox create parancshoz használhatjuk a --root kapcsolót is, ez esetben rootként fog futni a konténer. Ezzel legyünk nagyon óvatosak, mert könnyen tönkretehetjük a rendszerünket!

A Distroboxról további információkat és hasznos tippeket itt találunk:
https://distrobox.it

Tipp: Ha Podmant használunk a distroboxhoz (és valószínűleg azt fogunk, mert az az alapértelmezett), akkor a $CONTAINER_ID változó tartalmazza a futó konténer nevét. Ezt beleszőhetjük a promptunkba, így láthatjuk, hogy épp mikor vagyunk konténerben. Az én promptom például ilyen:
export PS1='[\[\e[92;1m\]\u@\H\[\e[97m\] \[\e[90m\]$CONTAINER_ID\[\e[0m\] \w\[\e[0m\]]$ '
A $CONTAINER_ID helyén egy szóköz áll, ha natív shellben vagyok, és a konténer neve, ha a konténerben.
Egyes konténerek esetén egy kis doboz ikon szerepel a prompt előtt, ezzel jelezve, hogy épp konténerben vagyunk, illetve vannak olyan konténerek, amik semmilyen visszajelzést nem adnak, azok esetében pedig be tudjuk állítani a saját promptunkat.

Grafikus konténerkezelés

A BoxBuddy nevű flatpak alkalmazással alapvető műveleteket végezhetünk telepített konténereinkkel, valamint új konténereket és készíthetünk vele.
Letöltés: https://flathub.org/apps/io.github.dvlv.boxbuddyrs

Tovább a fórumba.