LXD - Linux Container Anfänger Guide

LXD - Linux Container Anfänger Guide

Inhalt

Virtualisierung

Ein großes Thema in modernen Rechenzentren ist die Virtualisierung. Dadurch können verschiedene Services in eigene Systeme gekapselt werden ohne für jeden Service einen physischen Server kaufen zu müssen. Dazu gibt es zwei Möglichkeiten:
Eine Virtuelle Maschine simuliert ein komplettes System inklusive ihrer Hardware, wie zum Beispiel Festplatten und USB Schnittstellen.
Die Alternative sind Container. Container simulieren nur Teile des Systems und teilt sich den Rest, wie zum Beispiel den Kernel mit dem Host. Dadurch sind Container deutlich leichter als Virtuelle Maschinen.

Aber auch bei Containern gibt es Unterschiedliche Software. Die wahrscheinlich bekannteste ist Docker. Hier wird normalerweise nur ein Befehl pro Container, zum Beispiel ein Webserver, ausgeführt. Danach wird der Container wieder abgeschaltet. LXD hingegen verhält sich mehr wie eine Virtuelle Maschine. Hier wird ein normales Betriebssystem installiert und der jeweilige Service auf dem manuellen Weg konfiguriert. Der unterschied zu Virtuellen Maschine ist also für den Nutzer kaum spürbar. Dennoch sind LXD Container leichter.

LXD Installation mit Snap

Ich habe LXD bis jetzt ausschließlich mit dem Snappaket installiert und bin damit sehr zufrieden. Dazu muss zu allererst Snap installiert werden.

sudo apt install snapd

Danach können wir LXD installieren.

sudo snap install lxd

Um LXD nutzen zu können, müssen jetzt noch einige Einstellungen vorgenommen werden. Dazu gibt es aber ein vorgefertigtes Programm, dass durch all diese Einstellungen führt. Im zweifel funktioniert es auch immer die Default Option zu wählen. Außerdem könne alle Einstellungen im nachhinein mit relativ wenig Aufwand korrigiert werden.

lxd init

Bei manchen von Euch könnte es zu einem Berechtigungsproblem mit LXD kommen. Dann müsst ihr euch entweder mit ‚root‘ anmelden, oder euren Nutzer zur Gruppe LXD hinzufügen.

sudo usermod --append --groups lxd <username>

Nachdem Ihr „lxd init“ erfolgreich ausgeführt habt, könnt ihr auch schon euren ersten Container starten.

lxc launch <Image:Version> <name> {-s <storage pool> -p <profil>}
lxc launch ubuntu:20.04 container1

Die Parameter -s und -p sind optional und richten sich eher für fortgeschrittene Nutzer und können von Anfänger erstmal ignorieren, da es standardmäßig nur ein Profil und einen Storage-Pool gibt.
Nachdem der Container jetzt gestartet wurde können wir mit folgendem Befehl eine Kommandozeile für den Container bekommen.

lxc exec <container> <command>
lxc exec container1 bash

Natürlich kann auch jeder andere Befehl in dem Container ausgeführt werden. So ist es zum Beispiel möglich ein apt update && apt upgrade -y im Container auszuführen, um den Container zu aktualisieren ohne erst die Kommandozeile zu öffnen.

Wenn man nun den Container wieder stoppen möchte kann man dies mit folgendem Befehl tun.

lxc stop <container>

Im Umkehrschluss lässt er sich danach mit „start“ wieder starten.

lxc start <container>

Das sind erstmal die grundlegenden Befehle, um einen Container zu starten und zu nutzen.

Selbstverständlich nutzt man im Normalfall nicht nur einen Container, sondern mehre. Und nach einiger Zeit wird es wirklich lästig sich zu merken, welche Container gerade laufen und welche nicht. Dafür gibt es den „list“ Befehl, der den Status, die IP-Adresse und die Anzahl der Snapshots jedes Containers anzeigt.

lxc list

Wenn man später einmal die Konfiguration auf einen anderen Host übertragen möchte kann man diese mit lxd init --dump ausgeben lassen und in einer .yaml Datei speichern. Auf dem neuen Host geschieht die Initialisierung dann mit

lxd init --dump > config.yaml
lxd init --preseed < config.yaml

Weitere Hilfe zu LXC

Container Umbennen

Unter LXD können Container, genau so wie bei jedem anderen Linux System mit dem Move-Befehl umbenannt werden. Das Umbenennen eines Containers ändert allerdings nur den Namen des Containers, nicht aber den Hostname des Containers. Das heißt bei der Konfiguration und Verwaltung hat der Container nun einen neuen Namen. Arbeitet man allerdings in dem Container, ist der alte Name gültig. Dieser kann unter Ubuntu in den Dateien /etc/hostname und /etc/hosts geändert werden.

lxc move <old-container> <new-container>

Möchte man den Container in einen anderen Storage-Pool verschieben, geht das ähnlich.

lxc move <old-container> <new-container> -s <storagepool>

Container sichern, exportieren und importieren

Die Grundlage um einen Container zu Sichern oder zu Exportieren ist ein Snapshot. Diese sind ein Abbild der Konfiguration eines Systems und werden wie folgt erstellt.

lxc snapshot <container> <snapshotname>
lxc snapshot <container> <snapshotname> --reuse

Wenn der Snapshot bereits vorhanden ist und überschrieben werden soll, muss man den Parameter --reuse nutzen.

Um einen Snapshot wiederherzustellen gibt es den Befehl

lxc restore <container> <snapshotname>

Im nächsten Schritt kann man aus diesem Snapshot ein Containerimage erstellen und nach diesem Abbild neue Container starten, wenn man das möchte.

lxc publish <container>/<snapshot> --alias <imagename>

Nun hat man neben seinen Images von Betriebssystemen auch ein Image von seinem Container. Dieses kann für eine externe Sicherung auch exportiert werden.

lxc image export <imagename> /pfad/zum/Speicherort/imagename

Wichtig ist hierbei am Ende des Pfades noch einen Namen zu vergeben. Dies ist hinterher der Name des tar-Archivs in dem das Image gespeichert ist.

Möchte man nun dieses Image auf einem anderen Host importieren geht das mit

lxc image import /pfad/zum/Speicherort/imagename --alias <imagename>

Diese Methode hat aber auch einen Nachteil. Im Gegensatz zu heruntergeladenen Images, werden selbst erstellt Images nicht automatisch gelöscht und können so über die Zeit sehr viel Speicherplatz einnehmen. Um den entgegen zu wirken, muss man sich manuell die List der Images ausgeben lassen und einzeln löschen. Das geht wie folgt:

lxc image list
lxc image delete <fingerprint>

LXD bietet außerdem die Möglichkeit automatische Snapshots erstellen zu lassen. Zusätzlich lässt sich ein Löschdatum setzen, sodass zum Beispiel täglich ein Snapshot gemacht wird und nach 2 Wochen wieder automatisch gelöscht wird um Speicherplatz freizugeben.

lxc config set <container> snapshots.expiry "2w" #Löscht in 2 Wochen
lxc config set <container> snapshots.schedule "0 0 * * *"
#Zeitmuster wie bei Cron (Minute, Stunde, Tag, Monat, Wochentag
#"0 0 * * *" -> jeden Tag um 00:00
lxc config set <container> snapshots.schedule.stopped false
lxc config set <container> snapshots.patter "snapshot-%d" #name

Verzeichnis zwischen Host und Container teilen

In manchen Situationen ist es sinnvoll Dateien nicht direkt in einem Container zu speichern, sondern in der Verzeichnisstruktur des Hosts. In meinem Beispiel möchte ich z.B. die Daten meiner Nextcloud direkt auf dem Host gespeichert haben, um diese leichter sichern zu können. Dazu habe ich unter dem Host ein Verzeichnis „nextcloud“ unter „/media/nextcloud“ angelegt. Wo Ihr ein geteiltes Verzeichnis anlegt ist egal, solange ihr die Berechtigungen so anpasst, dass dort jeder lesen und schreiben kann. Ist dies geschehen, könnt ihr mit folgendem Befehl das Verzeichnis im Container mounten. Auch hier könnt ihr das Zielverzeichnis frei wählen.

lxc config device add <container> <sharename> disk path=/verzeichnis/im/container source=/verzeichnis/des/host

Im Beispiel meiner Nextcloud lautet der Befehl konkret

lxc config device add nextcloud sharedmedia disk path=/media/nextcloud/ source=/media/nextcloud

Dateien vom Host in einen Container kopieren

Um Dateien von dem Hostsystem in einen Container zu kopieren hat LXC einen eigenen Befehl. Um ganze Ordner zu kopieren gibt es den Parameter „-r“.

lxc file push /host/pfad <container>/container/pfad
lxc file push -r /host/pfad <container>/container/pfad

Um eine Datei vom Container auf den Host zu kopieren nutzt man pull statt push.

lxc pull <container/container/pfad /host/pfad

Virtuelle Maschinen mit LXD erstellen

Mit LXD kann man neben Containern auch vollwertige Virtuelle Maschinen erstellen. Dazu wird das Parameter –vm angehängt

lxc launch ubuntu:20.04 c1 --vm

CGroups zum auslesen der RAM Auslastung

Standardmäßig zeigen alle LXD Container die gleiche RAM Auslastung an. Aber manchmal ist es sehr hilfreich zu sehen, wie viel RAM der einzelne Container wirklich nutzt. Dazu muss die CGroup konfiguriert werden.

Dazu muss der folgende Befehl in die Datei /boot/firmware/cmdline.txt auf dem Host eingefügt werden.

cgroup_enable=memory cgroup_memory=1

Danach muss der Host einmal neu gestartet werden.

ACHTUNG: Ich habe diesen Schritt bisher nur bei einem Raspberry Pi getestet.

Error beim Import von Containern

Error: Failed creating instance record: Failed initialising instance: Invalid devices: Failed detecting root disk device: No root device could be found

Das Problem ist wahrscheinlich, dass ein anderes Profil als das Default-Profil genutzt wird und in diesem kein Storage Device definiert ist. In meinem Fall war es das macvlan Profil.

Als Lösung muss man das Storage-Device im Profil hinzufügen.

lxc profile add device add macvlan root disk path=/ pool=default

So wird dem Profil „macvlan“ der Storage-Pool „Default“ unter dem Verzeichnis „/“ eingehängt.

Error Macvlan Error

Error: Failed to start device "eth0": Failed to run: ip link add macbe9625fe link eth0 type macvtap mode bridge: Error: Unknown device type.

Auf dem Raspberry Pi kann es unter Ubuntu vorkommen, dass entsprechende Kernel-Module fehlen. Diese kann man einfach nachinstallieren.

sudo apt install linux-modules-extra-raspi
Kommentare anzeigen

Wir nutzen Cookies

Um die Nutzung der Website zu verbessern, nutzen wir Cookies.
Desweiteren werden Google-Dienste für das schalten von Werbung verwendet. Mit der Nutzung der Website geben Sie ihr Einverständnis.
Sollte die Nutzung von Cookies abgelehnt werden, kann dies Auswirkung auf die Nutzung der Website haben.