LXC is een vorm van operating-system level virtualization. Dat wil zeggen dat toepassingen binnen een container denken dat ze op een standalone systeem draaien, omdat ze volledig geïsoleerd zijn van toepassingen in andere containers. In realiteit draaien alle containers echter op één Linux-kernel, namelijk diegene van het host-systeem. Eerder al bespraken we de oplossing OpenVZ, maar die heeft als nadeel dat het buiten de kernel ontwikkeld wordt. LXC daarentegen maakt sinds Linux 2.6.29 standaard onderdeel uit van de kernel. Een nadeel is dat het nog niet zo volwassen is als OpenVZ en er nog niet zoveel beheertoepassingen rond bestaan. Maar op lange termijn lijkt de voorkeur van een aantal distributies wel uit te gaan naar LXC. Zo zal Ubuntu 10.04 LTS geen OpenVZ meer ondersteunen, maar wel LXC.

Aan de slag

We gaan aan de slag met LXC op Fedora 12 (die Linux-kernel 2.6.31 bevat), maar in principe werkt de procedure op elke recente Linux-distributie met een moderne kernel (minimum 2.6.29, bij voorkeur 2.6.31). Naast een kernel met ingebouwde LXC hebben we ook de userspace tools van LXC nodig, en bij voorkeur ook het pakket bridge-utils. Verder maken we onder Fedora ook gebruik van het virtuele netwerk van libvirt en de handige tool febootstrap:

# yum install lxc bridge-utils libvirt febootstrap

Nu vind je in /usr/bin allerlei tools waarvan de naam begint met lxc-. Voer eerst het volgende commando uit om te verifiëren dat je kernel LXC ondersteunt:

# lxc-checkconfig

Het programma controleert de aanwezigheid van verschillende deelfunctionaliteiten van LXC. Als overal "enabled" bij staat, dan kun je aan de slag.

De eerste stap is het aanmaken en aankoppelen van een "control group" bestandssysteem voor LXC. Plaats hiervoor de volgende regel in /etc/fstab:

none /cgroup cgroup default 0 0

En daarna:

# mkdir /cgroup

# mount /cgroup

Isoleren

Nu kunnen we onze eerste container aanmaken. We doen dat op de eenvoudigste manier, door een shell te starten die geïsoleerd wordt, maar wel gebruik maakt van het netwerk van de host:

# lxc-execute -n test /bin/bash

Deze shell heeft geen enkele toegang tot processen buiten de container, zoals we kunnen zien met ps:

# ps ax

PID TTY STAT TIME COMMAND

1 pts/1 S 0:00 /usr/lib/lxc/lxc-init -- /bin/bash

2 pts/1 S 0:00 /bin/bash

12 pts/1 R+ 0:00 ps ax

Dit is dus een eenvoudige manier om processen op te starten die minimaal van elkaar geïsoleerd zijn. We kunnen zowat alles in deze shell uitvoeren wat we op de host kunnen doen, we hebben volledige toegang tot de bestandssystemen en het netwerk van de host, maar de verschillende containers zien niets van elkaars aanwezigheid of de aanwezigheid van processen op de host zelf.

Werken met containers

Interessanter dan individuele processen isoleren is echter om een container aan te maken die een service of verschillende services aanbiedt, zeker als we de container een eigen root-bestandssysteem en netwerk geven. We starten eerst libvirt, zodat we kunnen gebruik maken van de virtuele bridge:

# service libvirtd start

Er zijn verschillende manieren om een root-bestandssysteem aan te maken. Eén ervan is dat je een OpenVZ-template downloadt, wat een tarball is van een volledig bestandssysteem. Op de website van OpenVZ staan een aantal officieel ondersteunde OS templates en een aantal die door de gebruikersgemeenschap gemaakt zijn. Tussen die laatste vind je bijvoorbeeld meer distributies of uitgeklede versies.

Fedora levert echter nog een eenvoudiger manier mee. Met het commando lxc-fedora download je een Fedora-template en maak je een container aan. Helaas heb je daarna nog wat configuratiewerk te doen. KageSenshi Puchong, een Fedora-ambassadeur uit Maleisië, heeft daarom een script aangemaakt dat alle configuratiestappen voor je automatiseert: lxc-febootstrap. Download het, maak het uitvoerbaar en maak nu een container aan:

# ./lxc-febootstrap create

Dit script stelt je een aantal vragen, zoals de naam die je aan je container wilt geven. De eerste keer downloadt het bovendien een rootbestandssysteem voor Fedora 12 via febootstrap in /var/cache/lxc/fedora-12/. Bij het aanmaken van een nieuwe container via lxc-febootstrap wordt dat bestandssysteem gekopieerd naar een nieuwe directory in /var/lib/lxc/rootfs/. Op het einde vraagt het script ook om een wachtwoord voor de root-gebruiker in de container in te stellen.

Daarna kun je de container starten (we hebben hem hier 'constantine' genoemd):

# lxc-start -n constantine

Dit toont de uitvoer van de init-scripts, waarvan er een aantal waarschuwingen en foutmeldingen geven. Wil je de container liever in de achtergrond opstarten, dan kan dat ook:

# lxc-start -d -n constantine

Je kunt de container op elk moment stoppen:

# lxc-stop -n constantine

Met het volgende interactieve commando vernietig je de container (dit werkt niet voor containers die nog draaien):

# lxc-febootstrap destroy

Je kunt nu op de console van de container inloggen:

# lxc-console -n constantine

En nu kun je hierin werken zoals je in een normaal Fedora-systeem werkt. Het script lxc-febootstrap heeft de container zo geconfigureerd dat die voor zijn netwerk gebruik maakt van virbr0, de bridge van libvirt. Standaard gebruikt die DHCP en is de routering al geconfigureerd, zodat het netwerk in de container normaal moet werken: vanuit de container kun je de host bereiken, evenals andere containers of externe servers, en vanuit de host kun je alle containers bereiken. Om DNS te laten werken in de containers moet je alleen nog de juiste nameserver plaatsen in /etc/resolv.conf in hun root-bestandssysteem.

Tips

De userspace tools van LXC kunnen heel wat handige taken uitvoeren. Zo kunnen we vanop de host monitoren welke processen een container draait:

# lxc-ps --name constantine

Of we kunnen de processen van alle containers zien, met de aanduiding op welke container ze draaien:

# lxc-ps --lxc

Je kunt ook rechtstreeks vanaf de host een signaal sturen naar een proces in een container:

# lxc-kill -n constantine -s SIGNAL

Verder kun je containers pauzeren en weer verder laten draaien:

# lxc-freeze -n constantine

# lxc-unfreeze -n constantine

Meer info over de toestand van een container kun je opvragen met lxc-info:

# lxc-info -n constantine

'constantine' is RUNNING

Tot slot kun je grafische toegang tot je containers bieden. Start je er bijvoorbeeld een VNC-server in op, dan kun je vanaf andere computers of vanaf de host waarop de container draait met een VNC-client toegang krijgen tot de desktop van de container. Dit is ideaal om een testomgeving op te zetten in een container. Je kunt ook GDM of een andere login manager in de container zo configureren dat die zijn uitvoer op een virtuele terminal van de host laat zien.

Ubuntu of Fedora

Wie servers wil virtualiseren, hoeft niet onmiddellijk terug te grijpen naar volledige virtualisatie of paravirtualisatie. LXC biedt een lichtgewicht virtualisatieoplossing voor Linux die in heel wat gevallen volstaat, tenminste als je geen ander besturingssysteem wilt virtualiseren. Een Ubuntu-container op een Fedora-host draaien is echter perfect mogelijk. LXC zit bovendien standaard in de kernel, waardoor het op termijn wel eens even populair kan worden als KVM.

Bron: Techworld