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