Terwijl zowel FreeBSD als OpenSolaris een officieel systeem voor operating-system level virtualization hebben dat standaard in de kernel ondersteund is (jails respectievelijk zones), heeft Linux die luxe niet. Er zijn minstens twee populaire systemen voor Linux, en geen van beiden is officieel ondersteund in de kernel: OpenVZ en Linux-VServer. Vooral OpenVZ is populair bij ISP's die zo eenvoudig virtual private servers kunnen aanbieden. In dit artikel focussen we ons op OpenVZ omdat het populair is, er uitstekende documentatie voor bestaat, en de ontwikkelaars nauw samenwerken met de Linux kernelontwikkelaars. Overigens is er ook een propriëtair product dat op OpenVZ voortbouwt: Parallels Virtuozzo Containers.

Nog eens ter opfrissing: bij operating-system level virtualization denken toepassingen binnen een container 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. Dat betekent ook dat deze virtualisatieoplossing een verwaarloosbare impact heeft op de performance van de containers. Omdat de kernel door alle containers gedeeld wordt, kun je wel geen ander besturingssysteem in een container draaien dan het host-systeem. Linux-only dus bij OpenVZ. Maar anders dan bij FreeBSD jails en OpenSolaris zones hoeven de containers niet dezelfde distributie te bevatten dan de host, zolang de distributie in de container compatibel is met de kernel van de host.

Aan de slag

Genoeg theorie, we gaan OpenVZ installeren op CentOS 5.3. We kiezen hiervoor omdat het OpenVZ-project heel nauw de ontwikkeling van Red Hat Enterprise Linux volgt. De RHEL-gebaseerde OpenVZ-kernels zorgen dus voor weinig problemen op een RHEL- of CentOS-host.

Voeg eerst de OpenVZ yum repository toe aan CentOS (of RHEL). Download daarom het bestand openvz.repo en plaats het in de directory /etc/yum.repos.d/. Importeer daarna de GPG-sleutel van het OpenVZ-team:

# cd /etc/yum.repos.d

# wget http://download.openvz.org/openvz.repo

# rpm --import http://download.openvz.org/RPM-GPG-Key-OpenVZ

Installeer nu de OpenVZ-kernel:

# yum install ovzkernel

Dit updatet ook je GRUB-configuratie zodat de OpenVZ-kernel automatisch vanaf de volgende reboot gekozen wordt. Voor je dat doet, moet je echter nog de volgende instellingen aanpassen in /etc/sysctl.conf:

net.ipv4.ip_forward = 1

net.ipv4.conf.default.proxy_arp = 0

net.ipv4.conf.all.rp_filter = 1

kernel.sysrq = 1

net.ipv4.conf.default.send_redirects = 1

net.ipv4.conf.all.send_redirects = 0

Het laatste waarop je nog moet letten voor je reboot is dat je SELinux uitschakelt. De OpenVZ-kernel heeft immers geen SELinux aan boord. Plaats daarom het volgende in /etc/sysconfig/selinux:

SELINUX=disabled

En reboot. Hierna installeer je de OpenVZ-tools en start je de OpenVZ-service:

# yum install vzctl vzquota

# service vz start

Creëer een container

Nu kun je met de opdracht vzctl OpenVZ-containers aanmaken en configureren. Maar eerst moet je een zogenoemd OS template hebben. Een OpenVZ-container installeer je immers niet van een installatie-cd of een ISO-bestand, maar van een template, dat 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.

We downloaden een Ubuntu 8.04 template (107 MB) en installeren deze in /vz/template/cache:

# cd /vz/template/cache

# wget http://download.openvz.org/template/precreated/ubuntu-8.04-x86.tar.gz

Nu kunnen we op basis van dit OS template zoveel containers maken als we willen. We maken er één aan met ID 101 en IP-adres 192.168.1.201. Vergeet ook niet om de nameserver in te stellen:

# vzctl create 101 --ostemplate ubuntu-8.04-x86 --ipadd 192.168.1.201 --nameserver 192.168.1.1

Nu starten we de container:

# vzctl start 101

Vanaf nu is de container op zijn IP-adres bereikbaar vanaf het netwerk zoals een fysieke server. Je kunt echter ook vanaf de host rechtstreeks op de container inloggen:

# vzctl enter 101

Wijzig nu het root-wachtwoord, zodat je ook via ssh op de container kunt inloggen.

Je kunt een container niet alleen starten, maar uiteraard ook stoppen en herstarten:

# vzctl restart 101

# vzctl stop 101

Wil je tot slot de container volledig verwijderen, dan gaat dat als volgt:

# vzctl destroy 101

Tips

Als je eenmaal een container hebt aangemaakt, kun je altijd nog zijn configuratie aanpassen. Stel dat je bijvoorbeeld de disk quota wilt aanpassen naar een zachte limiet van 5 GB en een harde limiet van 6 GB, dan gaat dat als volgt:

# vzctl set 101 --diskspace 5G:6G --save

De instelling wordt onmiddellijk aangepast, ook als de container al draait. Standaard configureert OpenVZ zijn containers zo dat ze bij het booten van de host ook gestart worden. Wil je dit niet, dan is dit ook aan te passen met vzctl set:

# vzctl set 101 --onboot no --save

Je kunt ook rechtstreeks vanaf de host een niet-interactieve opdracht in de container draaien:

# vzctl exec 101 df -h

Met het virtuele netwerk waarvan de containers gebruik maken kun je natuurlijk nog van alles doen wat ons hier te ver zou leiden. Eén tip misschien wel: standaard functioneert DNS niet in een container, waardoor je in onze Ubuntu-container zelfs geen apt-get update kunt doen. Voeg daarom in /etc/sysconfig/iptables van de host de volgende regels toe:

-A RH-Firewall-1-INPUT -d 192.168.1.201 -j ACCEPT

-A RH-Firewall-1-INPUT -s 192.168.1.201 -j ACCEPT

En herstart iptables op de host:

# service iptables restart

Wil je een overzicht van alle containers (inclusief degene die niet draaien), dan kan dat met het commando vzlist:

# vzlist -a

Je kunt ook specifieke informatie van de containers tonen, bijvoorbeeld geheugen- of schijfgebruik. Kijk in de manpagina voor alle mogelijkheden:

# vzlist -o ctid,ip,kmemsize,kmemsize.l,diskspace

En verder zijn er nog tools zoals vzcalc waarmee je berekent hoeveel resources van de host een container gebruikt, vzcpucheck dat een algemeen overzicht geeft van het cpu-verbruik van de containers en vzquota om te controleren of een container niet boven zijn quota zit. De OpenVZ wiki bevat een heleboel informatie en tips. Met vragen kun je terecht op het OpenVZ forum.

Conclusie

Wie servers wil virtualiseren, hoeft niet onmiddellijk terug te grijpen naar volledige virtualisatie of paravirtualisatie. OpenVZ 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 CentOS-host draaien is echter perfect mogelijk. OpenVZ heeft bovendien uitgebreide documentatie en een actieve gebruikersgemeenschap.

Bron: Techworld