Per Chroot starten Sie ein weitgehend autonomes Gastsystem auf einem Rechner, ohne dabei die Hardware zu emulieren. Die Containerverwaltung LXC verfeinert diese Technik mit umfangreichen Zusatzfunktionen.
Seit mehreren Jahren ermöglicht LXC (“Linux Containers”) das Anlegen autonomer, vom restlichen System abgeschotteter Verzeichnisteilbäume. Im Gegensatz zu anderen Systemen nutzt LXC [1] dafür jedoch keine virtuellen Maschinen wie etwa Vmware, sondern erzeugt eine virtuelle Umgebung – zwar mit eigenen Prozessen, aber einem gemeinschaftlich genutzten Kernel des Hostsystems.
Erste Schritte
Die folgende Beschreibung bezieht sich auf Debian 8.0 “Jessie” als Wirt, lässt sich aber mit kleineren Änderungen auch auf andere Systeme wie OpenSuse oder Ubuntu übertragen.
Zunächst einmal installieren Sie die Pakete lxc, lxctl und libvirt-bin samt den vom Paketmanagement angeforderten Abhängigkeiten wie debootstrap. Bei eigenen Kernel-Konstrukten müssen Sie die Control Groups (Cgroups) aktivieren – prüfen Sie das gegebenenfalls über einen Aufruf des Kommandos lxc-checkconfig.
Abhängig von der Installationsquelle nimmt das Anlegen des Wurzel-Dateisystems für einen Container einige Zeit in Anspruch. Unter Debian erledigen Sie diese Aufgabe mit dem Befehl aus der ersten Zeile von Listing 1. Der Schalter LANG legt dabei bereits die Spracheinstellungen fest, SUITE definiert die gewünschte Vorlage. Mit der Option -n benennen Sie den Container (Abbildung 1). LXC verwendet für das Anlegen des Subsystems Vorlagen aus dem Verzeichnis /usr/share/lxc/templates/, die Sie hinter dem Schalter -t angeben. Es geht auch kürzer, wie ein alternativer Vorschlag aus dem Debian-Wiki [2] zum Erstellen des Containers zeigt (Zeile 2).
Listing 1
$ LANG=de_DE.UTF-8 SUITE=jessie MIRROR=http://httpredir.debian.org/debian lxc-create -n debian8 -t debian $ lxc-create -n debian8 -t debian -- -r jessie

Abbildung 1: Beim Anlegen eines neuen Containers lädt LXC sämtliche benötigten Elemente aus dem Internet herunter und richtet ihn quasi schlüsselfertig ein.
Nach erfolgreicher Installation endet die Prozedur mit der Ausgabe eines zufällig generierten Root-Passworts. Notieren Sie es, und vergeben Sie nach dem ersten Anmelden im Container via passwd ein eigenes. Die Eingabe von lxc-ls listet alle vorhandenen Container auf.
Um auf lokaler Ebene auf den soeben angelegten Container zuzugreifen, starten Sie diesen mit dem Kommando lxc-start -n debian8 -d. Wie bei fast allen LXC-Befehlen geben Sie mit der Option -n den Namen des Containers an. Vergessen Sie den Schalter -d nicht – andernfalls erscheint der Anmeldeprompt, der sich im selben Terminal nicht mehr beenden lässt. Fordern Sie danach via lxc-console -n debian8 eine Konsole mit dem Anmeldeprompt an (Abbildung 2).
Mit dem Aufruf lxc-info -n Container ermitteln Sie den Status und die Prozess-ID eines laufenden Containers. Das Kommando lxc-stop -n Container stoppt den laufenden Container wieder. Eine Auswahl der wichtigsten Steuerungs- und Kontrollprogramme finden Sie in der Tabelle “Wichtige LXC-Kommandos”.
Wichtige LXC-Kommandos
| Aktion | Kommando |
|---|---|
| Anlegen, klonen, löschen | |
| Container anlegen | lxc-create -n Container -t Vorlage |
| Container klonen | lxc-clone -o Container -n NeuerContainer |
| Container löschen | lxc-destroy -n Container |
| Starten und stoppen | |
| Container starten | lxc-start -n Container |
| Container anhalten | lxc-freeze -n Container |
| Container fortsetzen | lxc-unfreeze -n Container |
| Container beenden | lxc-stop -n Container |
| Informationen | |
| Liste aller Container | lxc-ls |
| Liste aktiver Container | lxc-ls --active |
| Liste gestoppter Container | lxc-ls --stopped |
| Infos zu einem Container | lxc-info -n Container |
| IP-Adresse des Containers | lxc-info -i -n Container |
| Prozess-ID des Containers | lxc-info -p -n Container |
| Container überwachen | lxc-monitor -n Container |
| Anwendungen ausführen | |
| Anwendung im Container starten | lxc-attach -n Container --Befehl |
Netzwerkkonfiguration
Um per Netzwerk auf den Container zuzugreifen, müssen Sie auf Wirt und Gast die Netzwerkeinstellungen anpassen. So gilt es, in beiden Fällen die Datei /etc/network/interfaces zu ändern. Weiterhin benötigen die Netzwerkeinstellungen für den Container unter /var/lib/lxc/Container/config Anpassungen. Um den Container im LAN mit seinem Namen anzusprechen, erweitern Sie die /etc/hosts um einen entsprechenden Eintrag (siehe Kasten “Netzwerkkonfiguration”).
Legen Sie im Container via adduser User einen Benutzer an. Prüfen Sie danach mit der Eingabe von systemctl status sshd.service, ob der SSH-Server im Container läuft (Abbildung 3). Nun führen Sie von einem weiteren Terminal aus einen Login-Versuch mit ssh User@Container durch. Nach der Frage mit dem neuen SSH-Schlüssel sollte der Login auf die Shell nun klappen. Mittels exit melden Sie sich wieder ab.

systemctl den Zustand des SSH-Daemons.” width=”300″ height=”99″ />
Abbildung 3: Innerhalb des Containers prüfen Sie mit dem Kommandosystemctl den Zustand des SSH-Daemons.Netzwerkkonfiguration
In den folgenden Beispielen aus dem Netz 192.168.0.0/24 verwenden wir für das Wirtssystem die IP-Adresse 192.168.0.37, für den Gast die 192.168.0.90 und den Containernamen debian8. Die entsprechenden Werte aus den Listings müssen Sie für die lokalen Gegebenheiten anpassen.
Listing 2 zeigt die Änderungen der Datei /etc/network/interfaces auf dem Wirt, außerdem ergänzen Sie für eine korrekte Namensauflösung die Datei /etc/hosts um die Zeile 192.168.0.90 debian8. Öffnen Sie danach vom Wirtssystem aus die Datei /var/lib/lxc/debian8/config, und ergänzen Sie diese um die Einträge aus Listing 3. Abschließend modifizieren Sie die Datei /var/lib/lxc/debian8/rootfs/etc/network/interfaces wie in Listing 4 gezeigt.
Die Einstellungen konfigurieren die Netzwerkkarte des Wirts als Bridge (br0 statt eth0). Der Container verfügt über ein virtuelles Ethernet-Interface (veth), das sich mit br0 verbindet.
Nach Abschluss der Änderungen starten Sie zunächst das Netzwerk auf dem Wirt mit dem Kommando /etc/init.d/networking restart neu, im Anschluss auch den Container. Dann testen Sie die Konfiguration mit einem Ping auf die Container-IP-Adresse. Zum Überprüfen der Namensauflösung geben Sie dabei den Hostnamen anstelle der IP-Adresse an.
Listing 2
iface eth0 inet manual auto br0 iface br0 inet static bridge_ports eth0 bridge_stp off bridge_fd 0 bridge_maxwait 0 address 192.168.0.37 netmask 255.255.255.0 network 192.168.0.1 broadcast 192.168.0.37 gateway 192.168.0.1 dns-nameservers 192.168.0.1
Listing 3
# Netzwerk: lxc.network.type=veth lxc.network.link=br0 lxc.network.flags=up lxc.network.hwaddr=00:16:3e:10:20:30 lxc.network.ipv4=192.168.0.90
Listing 4
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.0.90 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.90 gateway 192.168.0.1 dns-nameservers 192.168.0.1
Container klonen
Um einen Klon des Containers debian8 zu erstellen, genügt der Aufruf lxc-clone -o Original -n Neu. Das funktioniert jedoch nur, wenn Sie zuvor das Gastsystem stoppen. Das Klonen dauerte im Test etwa 20 Sekunden. Danach ändern Sie die IP-Adresse unter /var/lib/lxc/debian_clone/config und /var/lib/lxc/debian_clone/rootfs/etc/network/interfaces Ihren Wünschen entsprechend ab. Zudem müssen Sie die hosts-Dateien um einen entsprechenden Eintrag für den geklonten Container ergänzen. Starten Sie dann den Klon-Container, und nehmen Sie probehalber per SSH Verbindung auf. Die Konfigurationsdatei des Klons weist unter Umständen mehr Einträge auf als jene des Originals – das ist normal.
Programmverwaltung und Updates
Über die Container-Konsole aktualisieren Sie die bereits installierten Pakete wie üblich mit apt-get update gefolgt von apt-get upgrade. Über die Paketverwaltung lassen sich zudem weitere Softwarepakete aus den eingetragenen Bezugsquellen installieren. Um auf eine breitere Programmauswahl zuzugreifen, ergänzen Sie im Container die Datei /etc/apt/sources.list um die gewünschten Repositories (Listing 5).
Listing 5
# /etc/apt/sources.list deb http://httpredir.debian.org/debian jessie main contrib non-free deb http://ftp.de.debian.org/debian/ jessie main contrib non-free deb http://security.debian.org/ jessie/updates main contrib non-free deb http://ftp.de.debian.org/debian/ jessie-updates main contrib non-free
Sie müssen Updates nicht zwingend aus dem laufenden Container heraus starten: Das klappt mittels lxc-attach auch vom Wirt aus [3].
Es bietet sich an, die Aktualisierungen in einem Rutsch mit dem Hauptsystem vorzunehmen. Das im Listing 6 gezeigte Shell-Skript erledigt das Update des Wirts, beendet alle laufenden Container und startet diese dann einzeln zur Aktualisierung neu.
Der Schalter -qq hinter apt-get unterdrückt alle Ausgaben – verwenden Sie ihn also erst nach einem erfolgreichen Testlauf. Gleiches gilt für -y (“yes”), das den Befehl ohne Rückfragen durchlaufen lässt. Das Kommando lxc-wait in der eigentlichen Update-Schleife stellt sicher, dass der Container betriebsbereit ist.
Listing 6
#! /bin/sh echo "--- Update des Wirtssystems -----" apt-get -qq update apt-get -qq -y upgrade apt-get -qq -y clean apt-get -qq -y autoclean apt-get -qq autoremove echo "--- Container beenden -----------" for i in $(lxc-ls --active -1); do echo $i lxc-stop -n $i done echo "--- Container starten/updaten ---" for n in $(lxc-ls --stopped -1); do echo $n lxc-start -n $n -d lxc-wait -n $n -s 'RUNNING' sleep 5 lxc-attach -n $n -- apt-get -qq update lxc-attach -n $n -- apt-get -qq -y upgrade lxc-attach -n $n -- apt-get -qq -y clean lxc-attach -n $n -- apt-get -qq -y autoclean lxc-attach -n $n -- apt-get -qq autoremove lxc-stop -n $n done echo "--- Aktualisierung ausgeführt ---"
Ausblick
Im Debian-Handbuch [4] finden Sie wertvolle Hinweise bezüglich des Einsatzes mit Debian und der darauf basierenden Distributionen. Daneben finden sich im Netz auch ausführliche Informationen zur Netzwerkkonfiguration von Containern [5] sowie zu Display-Umleitungen für GUI-Anwendungen [6].
Der Autor
Harald Zisler beschäftigt sich seit den frühen 90er-Jahren mit FreeBSD und Linux. Er verfasst Zeitschriftenbeiträge und Bücher zu Technik- und EDV-Themen, daneben gibt er auch Kleingruppenkurse rund um Linux und Datenbanken.
Infos
[1] LXC: https://linuxcontainers.org
[2] LXC im Debian-Wiki: https://wiki.debian.org/LXC
[3] Software-Updates für Container: http://www.cyberciti.biz/faq/how-to-update-debian-or-ubuntu-linux-containers-lxc
[4] Debian-Handbuch: https://debian-handbook.info/browse/de-DE/stable/sect.virtualization.html#sect.lxc
[5] Netzwerk unter LXC einrichten: http://unix.stackexchange.com/questions/50201/how-to-configure-external-ip-addresses-for-lxc-guests
[6] Display-Umleitung für GUI-Anwendungen: https://newspaint.wordpress.com/2015/09/14/how-do-i-get-x11-applications-running-in-a-lxc-container/







Das ist falsch:
address 192.168.0.37
netmask 255.255.255.0
network 192.168.0.1
broadcast 192.168.0.37
gateway 192.168.0.1
dns-nameservers 192.168.0.1
Richtig
network 192.168.0.0
broadcast 192.168.0.255
Falsch
address 192.168.0.90
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.90
gateway 192.168.0.1
dns-nameservers 192.168.0.1
Richtig
broadcast 192.168.0.255
Quellen
https://0fury.de/blog/?/post/Subnetting+f%C3%BCr+Anf%C3%A4nger/
http://www.itslot.de/2013/06/ipv4-netzwerkadresse-berechnen.html