Het jails-systeem van FreeBSD zorgt voor virtualisatie op besturingssysteemsniveau, ook bekend als 'operating-system level virtualization': toepassingen binnen een jail denken dat ze op een standalone FreeBSD-systeem draaien, omdat ze volledig geïsoleerd zijn van toepassingen in een andere jail. Maar in realiteit draaien alle jails op één FreeBSD-kernel, namelijk die van het host-systeem. Dat betekent dat deze virtualisatieoplossing een verwaarloosbare impact heeft op de performance van de containers.

Daarmee zijn jails een prima oplossing voor service providers die de services van hun klanten van elkaar willen scheiden, zonder tot de overhead van volledige virtualisatie of paravirtualisatie te moeten gaan. Verder zijn interessant om verschillende versies van software uit te proberen zonder je systeemconfiguratie om zeep te helpen. En tot slot is het gewoon een efficiënte manier om serverprocessen van elkaar af te scheiden in een sandbox en dus de veiligheid van een systeem te verhogen. Een nadeel is wel dat jails niet zo flexibel zijn: elke jail moet dezelfde kernelversie draaien als het basissysteem. En je kunt geen Windows- of Linux-gast draaien in een jail op FreeBSD.

Onderdelen

Een jail bestaat in FreeBSD uit vier basiscomponenten:

* Een directory-subtree: dit is de directorystructuur die de processen binnen de jail te zien krijgen. Een proces kan hieruit niet ontsnappen.

* Een hostnaam: dit is de hostnaam die in de jail gebruikt wordt.

* Een IP-adres: dit is het IP-adres dat aan de jail toegekend wordt. Dit kan op geen enkele manier veranderd worden tijdens de levensduur van de jail.

* Een commando: een uitvoerbaar programma dat in de jail gedraaid wordt, relatief ten opzichte van de root-directory van de jail.

Uiteraard kan elke jail ook eigen gebruikers hebben, je hebt in een jail een volledig functioneel FreeBSD-systeem.

Aan de slag

De basis van FreeBSD jails wordt gelegd door het commando jail, dat een jail kan draaien en beheren. In de manpagina staat heel wat uitleg en ook wat voorbeelden. Als je verschillende jails aanmaakt, heb je echter voor elke jail een volledige kopie van het basissysteem van FreeBSD nodig. Voor tientallen tot honderden jails schaalt het systeem dus niet echt. Bovendien vergt het configureren en up-to-date houden van alle jails heel wat werk.

Gelukkig is daar een oplossing voor in de vorm van het pakket ezjail. Door gebruik van het nullfs bestandssysteem bestaat het merendeel van het basissysteem (/bin, /boot, /sbin, /lib, /libexec, /rescue, /usr/{bin, include, lib, libexec, ports, sbin, share, src}) slechts één keer en wordt dat in alle jails read-only aangekoppeld. Hierdoor zijn de jails heel klein (ongeveer 2 Mbyte elk). Updaten van de jails gaat dan ook heel eenvoudig.

Voor je met jails begint, kun je het best eerst je FreeBSD-installatie upgraden. Daarna installeer je ezjail, bijvoorbeeld met:

# cd /usr/ports/sysutils/ezjail

# make install clean

De volgende directory's en bestanden zijn in wat volgt belangrijk:

* /usr/jails/ : De standaardlocatie waar je jails in komen.

* /usr/jails/flavours/ : Verschillende templates voor soorten jails. Hier kun je bijvoorbeeld /etc/resolv.conf of /etc/rc.conf voor je jails instellen.

* /usr/jails/basejail/ : Dit is het basissysteem dat door alle jails read-only gedeeld wordt.

* /usr/local/etc/rc.d/ezjail.sh : Script om jails te starten, te stoppen en te herstarten.

* /usr/local/etc/ezjail.conf : Configuratiebestand voor het script ezjail.sh en het commando ezjail-admin.

* /usr/local/etc/ezjail/ : Hierin komen de bestanden met instellingen voor al je jails, zoals hostnaam en IP-adres.

Maak allereerst de basejail aan:

# ezjail-admin install

Nu kun je heel eenvoudig op basis van het template van de basejail een jail aanmaken, bijvoorbeeld:

# ezjail-admin create example.org 192.168.1.10

Maak nu nog een alias aan voor je netwerkinterface met het IP-adres van de zojuist aangemaakte jail door de volgende regel in /etc/rc.conf te plaatsen:

ifconfig_em0_alias1="inet 192.168.1.10"

Je kunt hetzelfde ook op de commandline doen met "ifconfig em0 192.168.1.10 alias", maar dat blijft niet behouden na een herstart.

Je kunt ook een template in de directory /usr/jails/flavours aanmaken waarin je je eigen aanpassingen maakt. Kopieer daarvoor eerst de default template:

cp -Rp /usr/jails/flavours/default /usr/jails/flavours/myflavour

En pas nu de bestanden in myflavour naar believen aan. Een jail aanmaken op basis van dit template gaat dan als volgt:

ezjail-admin create -f myflavour example2.org 192.168.1.11

Nu kun je alle aangemaakte jails starten met:

# /usr/local/etc/rc.d/ezjail.sh start

Stoppen en herstarten verloopt analoog. Je kunt dit commando ook voor één specifieke jail uitvoeren door de hostnaam erachter te plaatsen:

# /usr/local/etc/rc.d/ezjail.sh stop example.org

Met ezjail-admin list kun je opvragen welke jails er aangemaakt zijn en met het commando jls vraag je alle jails op die draaien.

Inloggen op een jail vanaf de host gaat met het commando jexec, gevolgd door het jail ID dat te vinden is in de uitvoer van jls of ezjail-admin list:

# jexec 3 csh

Daarna kun je binnen deze jail commando's uitvoeren.

De puntjes op de i

Ezjail doet standaard al heel goed zijn best om jails aan te maken. Maar er zijn nog een aantal zaken die je maar beter aan kunt passen. Wil je alle jails automatisch laten starten bij het booten van je FreeBSD-installatie, dan voeg je de volgende regel toe aan /etc/rc.conf:

ezjail_enable="YES"

De volgende regel zorgt er bovendien voor dat de syslog-daemon van de host-omgeving en die van de jails elkaar niet onder de voeten lopen:

syslogd_flags="-ss"

Je doet er goed aan om ervoor zorgen dat de SSH-server van de host-omgeving alleen op zijn IP-adres luistert. Dit kan door de volgende regel in /etc/ssh/sshd_config:

ListenAddress 192.168.1.1 # IP-adres van je host-omgeving

Kopieer het bestand /etc/resolv.conf van je host naar al je jails en plaats in /etc/rc.conf van elke jail de volgende regel om SSH-toegang toe te laten:

ezjail_enable="YES"

Beide bestanden kun je ook in een template plaatsen die je gebruikt om je jails aan te maken.

En verder bestaan er nog heel wat tools die het werken met jails vereenvoudigen.

Conclusie

Wie servers wil virtualiseren, hoeft niet onmiddellijk terug te grijpen naar volledige virtualisatie of paravirtualisatie. FreeBSD biedt met jails een lichtgewicht virtualisatieoplossing die in heel wat gevallen volstaat, tenminste als je geen ander besturingssysteem wilt virtualiseren. Met behulp van het pakket ezjail zijn jails bovendien heel eenvoudig op te zetten.

OpenSolaris heeft zo’n zelfde oplossing. Aan die zones besteden we volgende week aandacht.

Bron: Techworld