Leider gibt es immer wieder Momente, wo eine andere Linux Version benötigt wird. Sei es, um etwas zu testen oder auszuprobieren oder weil vielleicht ein spezielles Tool nur unter einer speziellen Distribution funktioniert. Und nicht immer möchte man dazu extra eine virtuelle Maschine einsetzen. Dank den heutigen Container Techniken ist dies aber kein Problem mehr. Und für Linux Distributionen ist das Tool der Wahl Distrobox.
Inhalt
1. Einleitung
Distrobox bildet eine Container-Umgebung, die es Anwendern gestattet, eigenständige Linux-Instanzen zu installieren, die sich von der Hauptumgebung unterscheiden. Dabei wird eine nahtlose Integration mit dem Hauptsystem gewährleistet, sodass Binärdateien, die für eine Distribution entwickelt wurden, problemlos auf einer anderen ausgeführt werden können.
Die Webseite des Distrobox Projektes beschreibt das ganze wie folgt:
“Verwenden Sie jede Linux-Distribution in Ihrem Terminal. Ermöglichen Sie sowohl die Abwärts- als auch die Aufwärtskompatibilität mit Software und die Freiheit, die Distribution zu verwenden, mit der Sie sich am wohlsten fühlen. Distrobox verwendet Podman oder Docker, um Container mit der Linux-Distribution Ihrer Wahl zu erstellen. Der erstellte Container wird eng mit dem Host integriert sein und ermöglicht das Teilen des HOME-Verzeichnisses des Benutzers, externer Speicher, externer USB-Geräte und grafischer Anwendungen (X11/Wayland) sowie Audio.”
Quelle: https://github.com/89luca89/distrobox
2. Installation
2.1 Distrobox installieren
Für Arch Linux existiert ein passendes Paket, mit dem man recht einfach Distrobox installieren kann. Als Voraussetzung für Distrobox wird ein Containerdienst benötigt. Als Optionen stehen hier Docker, Podman oder Lilipod zur Verfügung. Welchen Container Dienst man nutzen möchte, muss jeder für sich selber entscheiden. Persönlich nutze ich Podman, den ich persönlich in einigen Punkten gegenüber Docker besser finde, wie das Sicherheitsmodell.
Sofern ein entsprechender Container Dienst noch nicht installiert wurde, kann beides in einem Schritt installiert werden:
$ sudo pacman -S podman distrobox
2.2 Linux installieren
Welche Linux Distributionen in welchen Versionen verfügbar sind, kann unter https://distrobox.it/compatibility/#host-distros nachgelesen werden. In diesem Beispiel wähle ich stellvertretend Ubuntu in der Version 23.04 aus. Dazu erstellt man einen neuen Container und gibt dabei direkt das entsprechende Image an:
$ distrobox create --image ubuntu:22.04 --name ubuntu-22.04
Sofern das Image nicht schon in einem anderen Container installiert wurde, fragt Distrobox nach, ob dieses Image aus dem Internet herunter geladen werden soll, was mit “Y” bestätigt wird.
Image ubuntu:23.04 not found. Do you want to pull the image now? [Y/n]: Y Resolved "ubuntu" as an alias (/etc/containers/registries.conf.d/00-shortnames.conf) Trying to pull docker.io/library/ubuntu:22.04... Getting image source signatures Copying blob 29202e855b20 done | Copying config e34e831650 done | Writing manifest to image destination f4cdeba72b994748f5eb1f525a70a9cc553b66037ec37e23645fbf3f0f5c160d Creating 'ubuntu-22.04' using image ubuntu:23.04 [ OK ] Distrobox 'ubuntu-22.04' successfully created. To enter, run: distrobox enter ubuntu-22.04
3. Linux Container starten und nutzen
3.1 Container betreten
Der gerade installierte Container wird wie folgt gestartet:
$ distrobox enter ubuntu-22.04
Wenn der Container zum ersten Mal betreten wird, wird dieser initialisiert. Dies kann man mit einer Installation des Betriebssystems auf der Festplatte vergleichen. Es werden noch Pakete heruntergeladen und installiert und Einstellungen vorgenommen. Dies kann einige Minuten dauern.
Starting container... [ OK ] Installing basic packages... [ OK ] Setting up devpts mounts... [ OK ] Setting up read-only mounts... [ OK ] Setting up read-write mounts... [ OK ] Setting up host's sockets integration... [ OK ] Integrating host's themes, icons, fonts... [ OK ] Setting up package manager exceptions... [ OK ] Setting up dpkg exceptions... [ OK ] Setting up apt hooks... [ OK ] Setting up distrobox profile... [ OK ] Setting up sudo... [ OK ] Setting up groups... [ OK ] Setting up users... [ OK ] Setting up skel... [ OK ] Container Setup Complete! [archlinux@ubuntu-22 ~]$
Beim nächsten Mal geht dies wesentlich schneller innerhalb weniger Sekunden.
3.2 Ein Paket installieren im Container
Nach dem wechsel in diesen Container befindet man sich nun in der Ubuntu Distribution. Möchte man zum Beispiel das Paket neofetch in Ubuntu installieren, dann nutzt man natürlich den Ubuntu eigenen Paketmanager. Das Paket wird dann auch nur in diesem Container installiert.
[archlinux@ubuntu-22 ~]$ sudo apt install neofetch
Und wenn man dann den Befehl neofetch ausführt, bekommt man die Meldung, dass Ubuntu läuft:
[dirk@ubuntu-22 ~]$ neofetch
.-/+oossssoo+/-. archlinux@ubuntu-22.04.archvm
`:+ssssssssssssssssss+:` -----------------------------
-+ssssssssssssssssssyyssss+- OS: Ubuntu 22.04 x86_64
.ossssssssssssssssssdMMMNysssso. Host: VMware20,1 None
/ssssssssssshdmmNNmmyNMMMMhssssss/ Kernel: 5.15.1-arch1-1
+ssssssssshmydMMMMMMMNddddyssssssss+ Uptime: 1 hour, 1 min
/sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Packages: 395 (dpkg)
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Shell: bash 5.1.16
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Resolution: 1280x800
ossyNMMMNyMMhsssssssssssssshmmmhssssssso Terminal: conmon
ossyNMMMNyMMhsssssssssssssshmmmhssssssso CPU: AMD Ryzen 9 3950X (32) @ 3.500GHz
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ GPU: AMD ATI Radeon RX 5600 OEM/5600 XT / 5700/5700 XT
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Memory: 44308MiB / 128723MiB
/sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
+sssssssssdmydMMMMMMMMddddyssssssss+
/ssssssssssshdmNNNNmyNMMMMhssssss/
.ossssssssssssssssssdMMMNysssso.
-+sssssssssssssssssyyyssss+-
`:+ssssssssssssssssss+:`
.-/+oossssoo+/-.
[archlinux@ubuntu-22 ~]$Und da es sich nicht um eine virtuelle Maschine handelt, wird als Hardware auch keine virtuelle, sondern die reale angezeigt. Und da hier nichts emuliert wird, kann man beim arbeiten keinen Unterschied in der Performance feststellen.
3.3 Container verlassen
Um den Container zu verlassen, reicht ein einfaches exit aus.
[archlinux@ubuntu-22 ~]$ exit
Danach befindet man sich wieder in der Shell von Arch Linux. Der Container selber läuft im Hintergrund aber weiter und kann jederzeit wieder betreten werden:
$ distrobox enter ubuntu-22.04
Möchte man den Container aber komplett beenden, vergleichbar mit dem herunterfahren und Ausschalten eines Rechners, dann geht dies über den stop Parameter:
$ distrobox stop ubuntu-22.04
4. Arbeiten mit Distrobox
4.1 Container anzeigen
Es können problemlos mehrere Container installiert sein. Um sich anzuzeigen, welche Container aktuell installiert sind, hilft der Parameter list weiter:
$ distrobox list
Und bekommt anschließend eine Liste der installierten Container angezeigt:
ID | NAME | STATUS | IMAGE 04be76cc0694 | fedora-35 | Exited (143) 8 hours ago | registry.fedoraproject.org/fedora:35 a96df9992048 | ubuntu-22.04 | Up 5 hours | docker.io/library/ubuntu:22.04
Man sieht auch den aktuellen Status der einzelnen Container. “Up” bedeutet, dass der Container aktuell im Hintergrund läuft.
4.2 Einzelnes Kommando in Container ausführen
Es ist auch möglich, eine Shelleingabe abzusetzen, ohne den Container zu betreten. Der Container wird also geöffnet, der Befehl ausgeführt und der Container wieder verlassen (nicht beendet!). Möchte man also zum Beispiel den Befehl neofetch ausführen, dann sieht dies so aus:
$ distrobox enter ubuntu-22.04 -- neofetch
4.3 Starteintrag im Host hinzufügen
Zusätzlich können die Menüeinträge von Programmen auch in den Host exportiert werden. Als Beispiel mal das Spiel Solitaire. Wenn man dieses in den Container installiert, besteht die Möglichkeit den Menüeintrag des Ubuntu Desktops auch in den Desktop des Hosts Rechner zu exportieren. So braucht man nicht jedesmal vorher den Container in einer Shell zu öffnen, sondern kann das entsprechende Programm direkt starten (im Hintergrund wird der Container geöffnet und das entsprechende Programm gestartet. Der Befehl wird innerhalb des entsprechenden Containers abgesetzt:
[archlinux@ubuntu-22 ~]$ distrobox-export --app 'AisleRiot Solitaire'
4.4 Container aktualisieren
Um die Linux Distribution im Container zu aktualisieren, also über den Paketmanager die aktuellen Pakete herunter zu laden und zu installieren, kann entweder der Container betreten und dann manuell die entsprechenden Befehle abgesetzt werden, oder über den Parameter upgrade das automatisiert erledigen:
$ distrobox upgrade ubuntu-22.04
Es besteht auch die Möglichkeit, ein Upgrade bei allen installierten Container durchzuführen:
$ distrobox upgrade --all
4.5 Container schließen
Um den Container zu beenden, bzw. zu schließen wird der stop Parameter aufgerufen:
$ distrobox stop ubuntu-22.04
4.6 Container löschen
Wenn der Container komplett entfernt werden soll, kann dieser mit dem rm Parameter gelöscht werden:
$ distrobox rm ubuntu-22.04
5. Fazit
Container sind eine praktische Alternative zu virtuellen Maschinen. Sofern es nicht um sicherheitskritische Anwendungen geht, die eine Sandbox benötigen, können mit Containern fast alle Anwendungsfelder abgedeckt werden. Und mit Distrobox wurde ein zusätzlich Tool geschaffen, welches es ermöglicht, auch Linux Distributionen in einem Container zu nutzen. So kann man auch Anwendungen ausführen, die eine spezielle Linux Distribution benötigen.
Quellen:
https://distrobox.it
https://github.com/89luca89/distrobox
https://podman.io
https://wiki.archlinux.org/title/Distrobox
