LXC – chroot auf Steroide

LXCLinuX Container ist eine Virtualisierung welche auf Betriebssystemebene wie z.b. Linux-VServer arbeitet. Es kann auch mit BSD-Jails verglichen werden.

Mit LXC ist es möglich verschiedene Container isoliert voneinander auf dem gleichen System laufen zu lassen. Dabei muss nicht ein komplettes root-Dateisystem vorhandensein mit LXC ist es auch möglich einzelne Applikationen isoliert zu starten.

Es wird nicht wie z.b. bei KVM oder VMWare eine Virtuelle Maschine erzeugt sondern ein root-Dateisystem mit dem gleichen Kernel des Host als „Container“ gestartet.

Mit den „Namespaces“ und „Control groups“ ergibt sich eine flexible möglichkeit Resourcenschonend mehrere Virtuelle Instanzen zu erstellen, diese isoliert voneinander zu betreiben und die Resourcen des Host für die Virtuellen Instanzen zu kontrollieren .

Ich nutze die möglichkeit verschiedene Instanzen um Programme auf meinem „Cubietruck“ zu testen. Auf ein ARM-SoC KVM oder Qemu laufen zu lassen wäre die denkbar schlechteste Idee.

Legen wir los, als erstes installieren lxc und ein paar tools die uns das leben vereinfachen.

apt-get install lxc lxctl bridge-utils libvirt-bin debootstrap dnsmasq-base ebtables gawk libxml2-utils netcat-openbsd

Um „Control groups“ nutzen zu können müsst Ihr dies „mounten“. Tragt folgendes in eure /etc/fstab ein:

/etc/fstab:

# cgroup for lxc / docker
cgroup /sys/fs/cgroup cgroup defaults 0 0

Und mountet es mit „mount /sys/fs/cgroup„.

libvirt wurde aus zwei Gründen installiert, erstens es kann u.a. lxc steuern(und kvm, xen, qemu …) und es wird die virtuelle Netzwerkbrücke samt dhcp-Server installiert und konfiguriert.

Im folgenden wird die Virtuelle Netzwerkbrücke „virbr0“ erzeugt und konfiguriert:

root@test:~# virsh net-edit default

Euer Editor der Wahl öffnet die default.xml in der Ihr das IP-Netzwerk, die IP-Adresse eures dhcp-Server und die „range“ aus welchen Bereich die Adressen vergeben werden sollen konfiguriert.
Anschliessend startet ihr die Netzwerkbrücke mit:

root@test:~# virsh net-start default

Mit „ifconfig“ könnt ihr euch vergewissern das diese gestartet wurde.

Jetzt prüfen wir mit „lxc-checkconfig“ ob die vorraussetzungen für lxc vorhanden sind bzw. welche möglichkeiten der Steuerung vorhanden sind:

root@test:~# lxc-checkconfig
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Im Idealfall sieht eure Ausgabe ähnlich aus. Sollte bei „Control groups“ ein „missing“ erscheinen ist dies nicht unbedingt ein Fehlschlag – es fehlt dann nur z.b. eine möglichkeit eine Instanz einzuschränken.

Instanz bzw. root-Dateisystem erzeugen:

root@test:~# lxc-create -n test1 -t debian

Es wird mithilfe von „debootstrap“ das root-Daateisystem heruntergeladen und vorkonfiguriert. Mit den Schaltern „-n“ legen wir fest wie die Instanz benannt werden soll mit „-t“ welches template genutzt werden soll. Wir/Ich habe/n uns für Debian entschieden eine Ubuntu, Redhat usw. wäre auch möglich und mithilfe von debootstrap erzeugt und eingerichtet.

Bevor Ihr die Instanz startet konfiguriert ein paar Parameter:

root@test:~# vim /var/lib/lxc/<name der Instanz>/config

Und fügt folgendes hinzu:

lxc.utsname = <containername>
# network
lxc.network.type = veth 
lxc.network.flags = up 
lxc.network.link = virbr0 
lxc.network.ipv4 = /
lxc.network.hwaddr = 00:1E:62:CH:GE:ME

Bitte beachtet das Ihr den korrekten Hostname, die korrekte IP-Adresse und eine „vernünftige“ MAC-Adresse angebet (CH:GE:ME wechseln zu z.b. 00:00:01).

Jetzt könnt Ihr eure Instanz starten:

root@test:~# lxc-start -n test1

Wenn Ihr Debian als Template gewählt habt ist das Passwort für root: „root“.
Aus der Konsole kommt Ihr mit <STRG>+a und anschlessenden „q“.

PS: solltet ihr z.b. Putty benutzen funktioniert <STRG>+a und q nicht. Stellt dann euren „Terminal-type-string“ unter Connection -> Data auf „linux“.


Links:
[1] – https://de.wikipedia.org/wiki/LXC
[2] – https://help.ubuntu.com/12.04/serverguide/lxc.html
[3] – http://lxc.sourceforge.net/man/lxc.html