Lxc Linux-Container sind eine feine Sache. Aufgrund ihrer leichtgewichtigen Basis von chroot und cgroups lassen sich damit schnell und resourcensparend Testsysteme aufsetzen. Diese Testsyteme erzeugen auf dem Host wenig Overhead, da statt einer Virtualisierung von Pheripherie nur eine Trennung der Prozesse und des Dateisystems stattfindet. Man spricht hierbei von einer Betriebssystemvirtualisierung. Oder wie das Projekt es selbst ganz gut beschreibt: “chroot on steroids”
Es ist damit grob vergleichbar mit den Jails von FreeBSD, den Containern bei Solaris und natürlich OpenVZ oder Vserver unter Linux. Anders als bei den anderen Lösungen für Linux unterstützen aktuelle Linux-Kernel lxc out-of-the-box und somit entfällt das patchen des Kernels. Ich denke, dass lxc auf lange Sicht die anderen Projekte aufgrund der direkten Integration im Linux-Kernel ablösen wird. Die Unterstützung direkt im Kernel macht die Sache besonders bequem und unter Ubuntu 12.04 ist die Installation von lxc besonders einfach.
sudo apt-get install lxc
Und schon kann man seinen ersten Container erzeugen.
sudo lxc-create -t ubuntu -n hello-ubuntu
Dies erzeugt ohne weitere Interaktion mit dem Nutzer einen Container namens hello-ubuntu und installiert darin ein komplettes, aktuelles, wenn auch minimales, Ubuntu. Beim ersten Container kann dies eine Weile dauern, da erst alle notwenigen Ubuntu-Pakete heruntergeladen werden müssen. Das erzeugte Dateisystem verbleibt aber im Cache unter /var/cache/lxc, sodass die nächste Erzeugung eines Containers gleichen Typs nur wenige Sekunden dauert. Dies ist ein weiterer Vorteil der Containervirtualisierung. Nun aber zum Start des Containers.
sudo lxc-start -n hello-ubuntu
Schon kann man sich mit ubuntu/ubuntu einloggen und hat ein komplett abgeschottetes, frisch installiertes Ubuntu vor sich.
Ubuntu 12.04.2 LTS hello-ubuntu console
hello-ubuntu login:
Stoppen kann man den Container nach dem gleichen Prinzip.
sudo lxc-stop -n hello-ubuntu
Neben der Installation eines normalen Ubuntus, gibt auch auch noch weitere Templates, welche mittels des -t Switches beim Befehl lxc-create ausgewählt werden könen.
- busybox - ein kleiner Container auf Basis von Busybox
- debian - ein Container mit Debian
- fedora - ein Container mit Fedora
- opensuse - ein Container mit OpenSUSE
- sshd - ein kleiner sshd Applikations-Container
- ubuntu-cloud - ein Container mit der Cloud-Variante von Ubuntu
Den einzelnen Templates können mitunter Optionen mitgegeben werden, z.B. welche Version einer Distribution installiert werden soll. Mehr dazu findet man in der offiziellen Ubuntu-Dokumentation zu lxc.
Aber man kann sogar andere Architekturen mit LXC verwenden. Da ich mittlerweile zwei Raspberrys mein Eigen nenne und Softwarekompilierungen für die Raspis gerne auf performanterer Hardware laufen lasse, habe ich bisher immer chroot und qemu-bootstrap bemüht. Eine gute Anleitung dazu findet sich hier.
Aber die Erstellung und das Handling gestaltet sich halt doch mühsam. Also warum nicht lxc mit qemu-boostrap verheiraten. Also habe ich mich rangesetzt und das Debian-Template (/usr/lib/lxc/templates/lxc-debian) dahingehend abgeändert, dass es mithilfe von qemu-bootstrap ein Raspbian-Image baut und daraus einen Linux-Container erzeugt. Dies ging erstaunlich einfach. Das entstandene Template könnt Ihr euch hier runter laden und unter /usr/lib/lxc/templates ablegen. Damit das Template und die Emulation der CPU funktioniert müsst ihr noch qemu installieren.
sudo apt-get install qemu-user-static
Anschließend erzeugt ihr einen Raspbian-Container durch den folgenden Aufruf.
sudo lxc-create -t pi -n raspberry-container
Ist nur eine Spielerei und kann natürlich noch Bugs enthalten. Aber es läuft:
sudo lxc-start -n raspberry-container
Als Login wird hier die Kombination root/root verlangt.
Debian GNU/Linux 7 raspberry-container console
raspberry-container login:
Geschwindigkeitsrekorde werdet ihr damit, aufgrund der Emulation der CPU, sicher nicht aufstellen aber die Kompilierung von Software sollte dennoch schneller laufen als auf dem Raspberry selbst. Und obwohl es den lxc-Vorteil des Geschwindigkeitgewinns durch Verzicht auf Emulation widerspricht hat es doch den klaren Vorteil, dass man mal eben schnell einen Container aufsetzen und etwas testen kann. Dafür sind nur zwei Befehle (lxc-create, lxc-start) notwendig.
An dieser Stelle nochmal ein Hinweis zum Thema Testsystem. Lxc befindet sich noch in der Entwicklung und ist daher für den Produktivgebrauch nicht zu empfehlen. Auch beim Thema Sicherheit ist lxc nicht vergleichbar mit anderen Lösungen, da eine sichere Abschottung zum Hostsystem derzeit nicht gewährleistet ist. Aber man arbeitet daran und behilft sich derweil mit Apparmor.
Ein interessantes Tool im Zusammenhang mit lxc ist Docker. Das Open-Source-Tool nutzt lxc um ganz einfach und schnell (Applikations-)Container zu erzeugen und wird von der entwickelnden Firma für ihre Cloud-Infrastruktur genutzt. Sieht spannend aus und ist für das Handling vieler Container sicher hilfreich. Aber mir genügt derzeit das Standard-lxc, wie es mit Ubuntu mitgeliefert wird.
Übrigens läuft lxc natürlich auch direkt auf dem Raspberry Pi und man kann sogar lxc in einem lxc-Container laufen lassen. Nicht das dies ein gängiger Anwendungsfall wäre - aber es geht und zeigt die Flexibilität der Lösung.