LXC, LXD und “Error: not found”

Beim Lernen wie LXC und LXD funktionieren ist mir eine Meldung recht häufig aufgetreten. Das war die Fehlermeldung

Error: not found

Wie es sich herausgestellt hat, habe ich ein LXD Kommando ausgeführt und wollte das auf einen Container anwenden, den ich aber mit LXC erstellt hatte. Das führt aber zur Frage: Was ist der Unterschied zwischen LXC und LXD.

LXC ist eine Abkürzung für “Linux Container”. Sie funktioniert wie eine normale VM, jedoch mit weniger Overhead als andere Hypervisor.

LDX ist hingegen eine Erweiterung von LXC. LXD ist ein Systemdaemon und dieser verbindet sich mit libxlc, der Bibliothek, auf der LXC aufgebaut ist. Um mit dem Daemon zu kommunizieren, benutzt man eine REST API. LXD ist hierbei der neue Weg, Container zu erstellen und zu verwalten und ist eine Alternative zu den LXC Werkzeugen. Es wird abgerate, LXC und LXD gleichzeitig laufen zu lassen.

Den Unterschied zwischen LXC und LXD bemerkt man auch an den Kommandos, die man aufruft. Kommandos, die ein Bindestrich enthalten wie z.B. lxc-ls oder lxc-create sind LXC Kommandos. Kommandos ohne ein Bindestrich wie z.B. lxc info kommen von LXD.

Quellen

Kleiner Einblick in Snapshots mit LXC

Mit LXC lassen sich Snapshots von Containers erstellen. Auf diese Weise wird ein gewissen Zustand von dem System abgespeichert. Diesen kann man später nutzen, um damit einen neuen Container zu schaffen, ohne die mühselige Arbeit von Anfang an. In diesem Post will ich zeigen, wie man das mit wenigen LXC-Kommandos erreicht.

In diesem Beispiel habe ich schon einen Container namens container1 erstellt und werde ihn nun auch weiterhin verwenden. D.h. überall, wo bei mir container1 steht, solltet ihr euren Containernamen hinschreiben.

Um herauszufinden, ob ein gewählter Container schon Snapshots besitzt, findet man durch das Kommando

sudo lxc-snapshot -n container1 --list

heraus. Falls noch keine Snapshots existieren, wird hier die Meldung No snapshots auftauchen.

Bevor wir ein Snapshot erstellen, müssen wir sichergehen, dass der Container gestoppt ist, was wir mittels folgendem Kommando sehen:

sudo lxc-ls --fancy

Nur noch mal kurz zur Erinnerung: Einen LXC Container stoppt man mittels

sudo lxc-stop -n container1

Nun erstellen wir ein Snapshot von dem gewünschten Container:

sudo lxc-snapshot -n container1

Wenn alles erfolgreich gelaufen ist, müssten wir nun einen Snapshot sehen, wenn wir das Kommando

sudo lxc-snapshot -n container1 --list

aufrufen.

Snapshots des Containers container1 aufgelistet.

Um jetzt einen neuen Container aus einem bestehenden Snapshot zu schaffen, muss man folgendes Kommando aufrufen (in meinem Fall war es der Snapshot mit dem Namen snap0):

sudo lxc-snapshot -n container1 --restore snap0 --newname container2

Nun müsstet ihr einen weiteren Container sehen wenn ihr wieder alle Container auflistet. Mehr Informationen zum Thema Snapshots von LXC Containern findet man in der Dokumentation.

Erste Schritte mit LXC

In diesem Post möchte ich kurz zeigen, wie man mit LXC recht schnell einen ersten Container starten kann. Ich habe hierfür Ubuntu 18.04.2 als Hostsystem gehabt, aber auf anderen System müssten die meisten Kommandos genauso funktionieren.

Als erstes müssen wir die entsprechenden Pakete installieren:

sudo apt install lxc lxc-templates bridge-utils

Nachdem diese Pakete installiert sind, muss geprüft werden, ob alle Einstellungen OK sind. Soweit mir bekannt, kann der folgende Befehl ohne sudo ausgeführt werden.

lxc-checkconfig

Man müsste nun eine Ausgabe sehen, die in etwa so aussieht

Wenn alles gut aussieht, kann man anfangen, LXC Container zu erstellen und diese dann starten. Beim Erstellen eines Containers muss man in der Regel ein Template dazu angeben. Eine Liste der möglichen Templates findet man in dem Ordner /usr/share/lxc/templates. Die Templates werden über das apt-Paket lxc-templates installiert, was ich weiter oben aber schon getan hab.

In meinem ersten Versuch habe ich das Ubuntu-Template genommen. Um ein LXC Container zu erstellen, muss man nun diese Befehl ausführen:

sudo lxc-create -n <containername> -t <template>

In meinem Fall sah der Befehl so aus:

sudo lxc-create -n container1 -t ubuntu

Nun braucht LXC eine Weile, bis alles eingerichtet ist. Am Ende müsste man jedoch diesen Text zu sehen bekommen:

#
The default user is 'ubuntu' with password 'ubuntu'!
Use the 'sudo' command to run tasks as root in the container.
#

Bis jetzt haben wir nur einen Container erstellt. Nun müssen wir ihn zum Laufen bekommen:

sudo lxc-start -n container1

Um zu sehen, ob ein Container läuft oder nicht, sieht man mit diesem Befehl:

sudo lxc-ls --fancy

Wenn ein Container läuft, können wir uns nun mit ihm verbinden:

sudo lxc-console -n container1

Hier kommt der typische Bash-Login:

Hier bitte nicht vom Containernamen verwirren lassen 🙂

Für den Login gibt man als Benutzer ubuntu und als Passwort ebenfalls ubuntu ein (wie in der Ausgabe weiter oben beschrieben).

Hier noch eine wichtige Info: Wenn man nach dem Login irgendwann exit ausführt, wird man gleich wieder nach einem Benutzer und Passwort gefragt. Um aus der Containerumgebung wieder in die Hostumgebung zu kommen, muss man die Tastenkombination STRG+A und Q drücken. Das heißt, erst STRG+A gleichzeitig drücken und direkt danach nur Q.