Dieser Artikel beschreibt wie man openVZ auf CentOS 5.x installiert (bei mir war es 5.4) sowie Container erstellt, einstellt und verwaltet und auch iptables konfiguriert damit private sowie externe IP Adressen funktionieren.

OpenVZ bietet die Möglichekeit auf einem Server mehrer virtuelle Contrainer aufzusetzten, die alle verschiedene Linux Distribution beinhalten können soch aber einen gemeinsamen Kernel teilen. Die Container sind völlig voneinder abgeschottet und erscheinen wie pysikalische Server.

Ich bin nach der Anleitung von PlanetAmon vorgegangen und werde diese hier um eineige Details erweitern. Aber auch der Quick Installation Guide von openVZ ist sehr hilfreich und detailiert.

Installieren von OpenVZ

Als ersters müssen wir die openVZ Repos zu zu unseren Quellen hinzufügen.

cd /etc/yum.repos.d
wget http://download.openvz.org/openvz.repo
rpm --import http://download.openvz.org/RPM-GPG-Key-OpenVZ

Es gibt verschiedene Arten von openVZ Kernel (dessen volle bedeutung mir nicht ganz klar ist), wichtig ist jedoch den richtigen Kernel für ein 32bit oder ein 64bit System auszuwählen.

yum install ovzkernel

Bei einem 64bit System werden beide Kernel angeboten deshalb hängen wir die genaue bezeichnung an unser Paket:

yum install ovzkernel.x86_64

Der Kernel ist nun installiert und kann gebootet werden. Dazu muss die Datei /boot/grub/grub.conf editiert werden. Falls nano nocht nicht installiert ist, hilft: yum install nano

nano /boot/grub/grub.conf

Der Kernel mit der Bezeichnung „CentOS (2.6.8-022stab029.1)“ oder einer anderen Versionsnummer ist der von openVZ (müsste als erster Eintrag stehen). Wir editieren nun die Konfig Datei um die openVZ Kernels gleich zu erkennen, ersetzen wir den Namen CentOS mit openVZ. Falls ein Fehler beim Booten auftritt (kernel Panic) soll der alte Kernel gebootet werden (hilfreich bei Servern auf die man keinen physikalischen Zugriff hat).

timeout 5
default saved # von 0 auf saved geändert
fallback 1 # hinzugefügt

title OpenVZ (2.6.18-164.10.1.el5.028stab067.4) # von CentOS auf OpenVZ geändert
root (hd0,1)
kernel /vmlinuz-2.6.18-164.10.1.el5.028stab067.4 ro root=/dev/md2 vga=0x317 panic=5 # panic=5 hinzugefügt
initrd /initrd-2.6.18-164.10.1.el5.028stab067.4.img
savedefault fallback # hinzugefügt

title CentOS (2.6.18-164.11.1.el5)
root (hd0,1)
kernel /vmlinuz-2.6.18-164.11.1.el5 ro root=/dev/md2 vga=0x317 panic=5
initrd /initrd-2.6.18-164.11.1.el5.img
savedefault # hinzugefügt

Hiermit wird der Eintrag 0 defaultmäßig gebootet und bei einer Kernelpanic wird auf den Eintrag 1 umgeschalten, damit das System automatisch wieder bootet. Das wird auch duch den Parameter panic=5 bewirkt der nach 5 Sekungen den Computer neustartet.

Damit das System nach einem erfolgreichen Boot wieder den Defaulteintrag 0 nimmt, wird in die Datei /etc/rc.local die Zeile „echo „savedefault –default=0 –once“ | /sbin/grub –batch“ hinzugefügt.

Konfiguration

Zuerst brauchen wir einige Admin Tools:

yum install vzctl vzquota

Damit das Netzwerk richtig funktioniert brauchen wir zusätzliche Zeilen in der Datei /etc/sysctl.conf

nano /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
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.default.forwarding=1

Nun starten wir unser System neu (mit reboot) und loggen uns wider ein. Um zu kontrollieren ob der richtige Kernel geladen wurde verwenen wir den Befehl:

uname -r
2.6.18-164.10.1.el5.028stab067.4

Anlegen eines Containers

Zuerst brauchen wir ein Template für einseren Container, das ist ein fertiges System, dass anschließend im Container ausgeführt wird und mit dem wir artbeiten können.

OpenVZ stellt einige Templates auf ihrer Seite zur verfügung. Das CentOS 5 Template laden wir mit folgenden Befehlen herunter.

cd /vz/template/cache
wget http://download.openvz.org/template/precreated/contrib/centos-5-i386-default.tar.gz

Um unsreren Container nun mit diesem Template zu erszeugen geben wir folgenden Befehl ein:

vzctl create 101 --ostemplate centos-5-i386-default --config vps.basic

Die Nummer 101 ist der Name unter der unser Container nun konfiguriert werden kann.

Um den Container nun zu konfiguriern wird das Programm vzctl benutzt:

vzctl set 101 --hostname webspace.die-lega.org --save

Damit wird der Hostname unseres Containers gesetzt

vzctl set 101 --diskspace $(( 1048576*50 )):$(( 1153434*50 )) --save

Hiermit stellen wir unsere Festplattengröße auf 50GB (Soft,Hardlimit)

vzctl set 101 --ipadd 192.168.11.101 --save

Damit setzten wir die IP Adresse (entweder eine öffentliche oder eine Private (nur interne), die dann mit iptables und NAT auf die öffentliche vom Server umgesetzt werden muss

vzctl set 101 --onboot yes --save

Soll der Container beim start mitgestartet werden

vzctl set 101 --nameserver 213.133.99.99 --nameserver 213.133.100.100 --nameserver 213.133.98.98 --save

Die Nameserver setzen

vzctl exec 101 passwd

Das root Passwort unseres Containers setzen

vzctl set 101 --vmguarpages $((256 * 512)) --save

Den Garantierten RAM setzen (mindestgröße)

vzctl set 101 --privvmpages $((256 * 2048)) --save

Den Maximalen RAM setzen (könnte bis auf mindesgröße verkleiner werden)

vzctl start 101

Hiermit starten wir die Maschine

Betrieb & Überwachung eines Containers

Hier einiege Befehle die für den Betrieb eines Containers wichtig sind:

Öffnen eines Containers:

/usr/sbin/vzctl enter 101

Verlassen eines Containers:

exit

Speicherverbrauch anzeigen:

vzcalc -v vpsid

Festplattenverbeuacht:

vzquota stat vpsid

Einschalten:

/usr/sbin/vzctl start 101

Ausschalten:

/usr/sbin/vzctl stop 101

Netzwerk konfiguration

Standardmäßig ist bei CentOS netfilter (iptables) aktiviert und lässt nur eingehende Verbindung auf bestimmten Ports zu (zB ssh).

Es wird auch empfohlen sich über iptables zu informieren, damit man weiß was man hier tut, sonst sperrt man sich sehr schnell aus seinem eigenen Server aus.

Um nun unseren Containern den Zugang zum Netz zu gewähren müssen einige Regeln hinzugefügt werden:

Wenn wir private IP auf unseren Container verwenden zB.: das Netz 192.168.11.0/24 also alle Adressen von 192.168.11.1 – 192.168.11.254 müssen wir NAT konfigurieren:

iptables -I POSTROUTING -s 192.168.11.0/255.255.255.0 -o eth0 -j SNAT --to-source X.X.X.X

Damit werden alle Pakete vom Netz 192.168.11.0/24 auf die Adresse x.x.x.x (die öffentliche Adresse des Servers) umgesetzt. Sollte der Server keine fixe IP Adresse haben, dann sollte statt SNAT MASQUERATE verwendet werden.

iptables -I POSTROUTING -s 192.168.11.0/255.255.255.0 -o eth0 -j MASQUERATE

Zusätzlich müssen aber noch die Pakete erlaubt werden:

iptables -I FORWARD -s 192.168.11.0/255.255.255.0 -j ACCEPT
iptables -I FORWARD -d 192.168.11.0/255.255.255.0 -j ACCEPT

Damit werden alle Pakte von und zu unserem Netz die geroutet werden (nicht zu unserem Server gehen) erlaubt.

Hat der Container eine öffentliche IP Adresse müssen nur die Paket von und zu dieser Adresse erlaubt werden:

iptables -I FORWARD -s X.X.X.X -j ACCEPT
iptables -I FORWARD -d X.X.X.X -j ACCEPT

Es können so auch in einem Container eine öffentliche Adresse und in anderen private Adressen verwendet werden.

Um die Konfiguration von iptables dauerthauft zu speichern führen wir folgenden Befehl aus:

/sbin/iptables-save > /etc/sysconfig/iptables

Damit sollte alles funktionieren und es können eine beligebe Anzahl von weiteren Containern angelegt werden.