Virtuelle Server sind eine elegante Möglichkeit, einen Rootserver besser auszunutzen. Durch Aufteilung des Servers in virtuelle Server ist es möglich, weitere Anwendungen auf derselben Hardware zu installieren, ohne dass diese sich gegenseitig behindern (im Rahmen der vorhandenen CPU-Leistung und RAM-Speicherplatzes natürlich). Man hat die Möglichkeit, mehrere vserver einzurichten, die sich nur unwesentlich von einem "echten" Root-Server unterscheiden. Dieser Artikel erklärt, wie man den Linux-VServer-Kernel erstellt und installiert, welche Utility-Programme man braucht und wie man die virtuellen Server erstellt und konfiguriert.

Software

Um Linux-VServer zu nutzen, braucht man folgendes:

Die Webseite des VServer Projekts http://linux-vserver.org stellt die nötige Software sowie zahlreiche Informationen und Tutorials zur Verfügung.

In der Debian Etch Distribution gibt es bereits die VServer Tools in der (z.Zt.) neuesten Version. Es ist daher nicht nötig, diese selbst zu kompilieren. Auch verschiedene Kernels mit dem VServer-Patch stehen zur Verfügung. Da ich jedoch für einen Root-Server einen möglichst schlanken Kernel haben möchte, kompiliere ich mir lieber selbst einen.

Die VServer Tools installiert man wie folgt:

apt-get install vserver-debiantools vlan

Kernel

Die wichtigste Eigenschaft eines Root-Servers ist die Sicherheit. Je mehr Features in einem Kernel (oder in der ganzen Distribution) enthalten sind, desto mehr potentielle Angriffspunkte gibt es. Deswegen empfiehlt es sich, auf einem Root-Server nur die minimal erforderlichen Kernel-Funktionen und nur die nötigsten Programme zu installieren. Da sich die Hardware eines Root-Servers nicht ändert, kann man auch ruhig einen Kernel ohne dynamische Module verwenden. Die gewünschten Kernel-Features werden über die .config-Datei eingestellt.
Hier sind zwei Beispielkonfigurationen, die mit den aktuellen (Juni 2008) Root-Server von Hetzner funktionieren. In beiden Kernels ist der Support für sowohl VIA- als auch ATI-Chipsätze aktiviert, ebenso für die Realtek 8139 und 8169 Netzwerkkarten. Die SMP Variante ist für die aktuellen AMD 64 X2 Dual Core Prozessor Systeme gedacht, die ohne SMP kann auf den älteren AMD 64 Systemen (ohne Dual Core CPU) verwendet werden und bringt dort eine etwas bessere Performance als die SMP Variante.

Konfiguration

.config

Kernel

  • AMD 64 X2 CPU
  • > 4 GByte RAM
  • VIA oder AMD Chipsatz
  • SATA Festplatten
  • Realtek 8139 oder 8169 Netzwerkkarte

config-2.6.22.19-vs2.2.0.7-20080607-SMP

vmlinuz-2.6.22.19-vs2.2.0.7-20080607-SMP

  • AMD 64 CPU
  • max. 4 GByte RAM
  • VIA oder AMD Chipsatz
  • SATA Festplatten
  • Realtek 8139 oder 8169 Netzwerkkarte

config-2.6.22.19-vs2.2.0.7-20080607

vmlinuz-2.6.22.19-vs2.2.0.7-20080607

Ältere Kernel und Konfigurationen siehe Attachments.

Ob diese Konfiguration zur eigenen Hardware passt, muss man gegebenenfalls selbst herausfinden. Auch verschiedene DS5000 haben durchaus unterschiedliche Hardware, z.B. andere Netzwerkkarten. Am einfachsten ist es, das Rescue-System zu starten, das dmesg und das lspci Kommando auszuführen und die Ausgabe genau zu analysieren. Man sieht meistens sehr schnell, welche CPU, welcher Chipsatz und welche Netzwerkkarte verwendet wird. Falls die Konfiguration nicht zur Hardware passt, löscht man einfach die entsprechenden Zeilen aus der Config-Datei heraus, und zwar sowohl den aktiven Eintrag (weil er ja nicht passt) als auch den zur vorhandenen Hardware gehörende, aber auskommentierten Eintrag (man kann ihn dann bei der Konfiguration explizit auswählen).

Nach Änderung der Konfigurationsdatei, oder wenn man einen aktuelleren Kernel mit einer älteren Config-Datei verwendet, immer "make oldconfig" ausführen. Man bekommt so die Möglichkeit, alle neuen Konfigurationsmöglichkeiten bzw. die gelöschten Einträge erneut zu konfigurieren. Falls man sämtliche Optionen neu setzen will, empfiehlt sich ein "make menuconfig".

Die VServer Funktionen werden über einen Patch im Kernel aktiviert. Den Patch kann man sich von der Linux-VServer Website downloaden.

Die neuen VServer-Kernelfunktionen haben ebenfalls etliche Konfigurationsmöglichkeiten in der Config-Datei. In der verwendeten Konfiguration wurden nur die Default-Optionen verwendet.

Hier ein Beispiel, wie man sich aus den Kernel-Sourcen, dem VServer Patch sowie einer vorhandenen config-Datei einen neuen Kernel baut. Die angegebenen Versionen sind allerdings inzwischen obsolet.

server00:/# bzcat linux-2.6.20.4.tar.bz2 | tar xf -
server00:/# cp config-2.6.20.4 linux-2.6.20.4/.config
server00:/# cd linux-2.6.20.4
server00:/# patch -p1 < ../patch-2.6.20.4-vs2.2.0.diff
patching file Documentation/vserver/debug.txt
patching file Makefile
...
server00:/# make oldconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/kconfig/conf.o
...
server00:/# make bzImage
scripts/kconfig/conf -s arch/i386/Kconfig
  CHK     include/linux/version.h
  UPD     include/linux/version.h
...
  HOSTCC  arch/i386/boot/tools/build
  BUILD   arch/i386/boot/bzImage
Root device is (8, 6)
Boot sector 512 bytes.
Setup is 4650 bytes.
System is 1248 kB
Kernel: arch/i386/boot/bzImage is ready  (#1)
server00:/#  cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.20.4-vserver
server00:/#  lilo
...

VServer Netzwerkkonfiguration

Jeder VServer benötigt eine separate IP-Adresse, da viele Dienste, z.B. http, https, sshd, mail usw. immer denselben Port benutzen müssen. Bei der Konfiguration des Servers ist daher darauf zu achten, dass dem Server mehrere IP-Adressen zur Verfügung stehen und dass diese richtig konfiguriert sind. Die zusätzlichen IP-Adressen müssen meistens beim Anbieter des Root-Servers explizit bestellt und von diesem in dessen Routern konfiguriert werden; zusätzlich muss man dann die IP-Adressen auf dem Server selbst aktivieren.

Hetzner bietet z.B. Server mit insgesamt 6 IP-Adressen an. Diese sind wie folgt verteilt:

Eine schöne Erläuterung des Subnetting findet sich hier.

Die zusätzlichen IP-Adressen müssen in der /etc/network/interfaces Datei eingetragen und das Interface muss aktiviert werden. (Die angegebenen IP-Adressen sind erfunden.)

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 123.123.97.87
broadcast 123.123.97.95
netmask 255.255.255.224
gateway 123.123.97.65


auto eth0:1
iface eth0:1 inet static
address 234.234.255.2
broadcast 234.234.255.7
netmask 255.255.255.248
gateway 234.234.255.1

auto eth0:2
iface eth0:2 inet static
address 234.234.255.3
broadcast 234.234.255.7
netmask 255.255.255.248
gateway 234.234.255.1

auto eth0:3
iface eth0:3 inet static
address 234.234.255.4
broadcast 234.234.255.7
netmask 255.255.255.248
gateway 234.234.255.1

auto eth0:4
iface eth0:4 inet static
address 234.234.255.5
broadcast 234.234.255.7
netmask 255.255.255.248
gateway 234.234.255.1

auto eth0:5
iface eth0:5 inet static
address 234.234.255.6
broadcast 234.234.255.7
netmask 255.255.255.248
gateway 234.234.255.1

Die Aktivierung erfolgt durch den Befehl "ifup -a".

Einige Programme binden sich an sämtliche Interfaces und IP-Adressen, die zur Verfügung stehen. Das führt dazu, dass die VServer diese IP-Adresse nicht mehr nutzen können, da sie bereits durch den Host Server belegt ist.
Abhilfe: In der Programmkonfiguration die zu verwendende IP-Adresse explizit angeben.

In dieser Beispielkonfiguration trifft dies z.B. für den sshd des Host Servers zu. In der /etc/ssh/sshd_config Datei ist daher folgende Einstellung vorzunehmen:

...
ListenAddress 123.123.97.87
...

Ähnliches gilt für bind, httpd, mysqld usw., falls man diese Programme auf dem Host Server nutzen will.

VServer anlegen

Ein neues Debian Etch System wird dann so erstellt:

newvserver --hostname <servername> --domain <domainname> \
                --ip 234.234.255.2/29 --interface eth0 --context 2 \
                --dist etch --mirror ftp://sunsite.informatik.rwth-aachen.de/pub/Linux/debian

Für <servername> trägt man den gewünschten Servername ein. Dies ist gleichzeitig der Directoryname, in welchem die Distribution angelegt wird. 

Der Parameter <domainname> enthält die Domain, oder auch z.B. einfach nur "local".

Die IP-Adresse ist die IP-Adresse des neuen VServers. Der Parameter /29 ist eine Kurzschreibweise für die Netmask und bedeutet, dass die Netzmaske aus 29 1er-Bits und 3 0er-Bits besteht (man könnte auch 255.255.255.248 schreiben).

Der Context Parameter gibt den VServer Context an. Man muss für jeden VServer einen anderen wählen, und "1" ist schon belegt.

Die restlichen Parameter definieren, welche Distribution von welchem Mirror Server installiert werden soll. Man kann natürlich auch diverse andere Distributionen benutzen, z.B. SuSE, RedHat, Fedora usw. Wie das geht, ist allerdings nicht Thema dieses Artikels und ich habe es auch noch nicht getestet.

VServer konfigurieren

Nun muss der neue VServer gestartet werden, danach kann man ihn direkt vom Host aus "betreten". Als erstes sollte man SSH installieren, damit man sich auch direkt auf den neuen Server einloggen kann (gleich testen).

server03:~# vserver v0300 start
Starting system log daemon: syslogd.
Not starting internet superserver: no services enabled.
Starting periodic command scheduler: crond.
server03:~# vserver v0300 enter
v0300:/# apt-get install ssh
v0300:~# apt-get install ssh
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
  ssh
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0B/1054B of archives.
After unpacking 32.8kB of additional disk space will be used.
Selecting previously deselected package ssh.
(Reading database ... 7090 files and directories currently installed.)
Unpacking ssh (from .../ssh_1%3a4.3p2-9_all.deb) ...
Setting up ssh (4.3p2-9) ...

v0300:~#

VServer automatisch beim Reboot starten

Um einen VServer automatisch beim Reboot des Host Servers zu starten, erstellt man folgende Datei im Konfigurationsdirectory jedes VServers und schreibt die Zeile "default" rein:

server03:~# echo default > /etc/vservers/v0300/apps/init/mark

Status-Informationen

Mit dem Befehl "vserver-stat" erhält man einige nützliche Informationen über die aktiven VServer:

server03:~# vserver-stat
CTX   PROC    VSZ    RSS  userTIME   sysTIME    UPTIME NAME
0       36 165.5M  46.5M  18h53m45   1d21h27   8d13h17 root server
2        8  20.5M   5.3M   0m00s00   0m00s00  28m14s74 v0300
3        3   8.5M   2.3M   0m00s00   0m00s00   4m52s60 v0301
4        3   8.5M   2.3M   0m00s00   0m00s00   4m52s60 v0302
5        3   8.5M   2.3M   0m00s00   0m00s00   4m51s96 v0303
6        4   1.7G 666.4M   9m53s40   0m59s25   5d10h23 v0304

Bugs und Probleme

Die installierte VServer Software hat im Moment noch ein Problem:

Gelegentlich verabschiedet sich der "vcontext" Prozess ab und verbraucht 100% CPU. Das scheint meistens dann zu passieren, wenn man den virtuellen Server mit "vserver [vserver-name] enter" betritt und die Konsole schließt, ohne den virtuellen Server mit "exit" wieder zu verlassen. Passiert häufig, wenn man die Konsole eine Weile offen lässt und die DSL-Verbindung in der Zwischenzeit resettet.

Man kann den "vcontext" Prozess ohne Probleme mit "kill [pid]" abschießen.

Weitere Informationen zu diesem Problem:

"vserver enter" eating cpu and vkill problem

Diskussion

Fragen, Kommentare? Einfach hier hinterlassen.