Virtuelle Server mit dem Linux-VServer Projekt

Virtuelle Server werden immer beliebter, kaum einer kann sich dieser Technik entziehen. In Zeiten wo dedizierte Server Speicher in GigaByte Regionen besitzen und Prozessorleistung kein Thema mehr ist, liegt es nahe einen physikalischen Server für mehrere Aufgaben zu unterteilen.

Da es mehrere Möglichkeiten gibt dieses zu tun, sollte man sich Zeit lassen bei der Auswahl der Technik. Helfen könnte dabei z.B.: http://de.wikipedia.org/wiki/Virtueller_Server

Grundsätzlich gibt es keine Technik die nur Vorteile bietet. Die virtuellen Server welche mit dem Linux-VServer Projekt erstellt werden haben vier Markante Merkmale:

positive Merkmale:

negative Merkmale:

Zudem wird hier für alle V-Server der Host Kernel verwendet, klar was passiert wenn ein Programm eine Kernel-Panik auslöst.

Dennoch kann es die Richtige Lösung sein und hier ein Schritt für Schritt Howto zum nachmachen.

Mei Howto bassiert auf diesen beiden Howto's, die sicher auch funktionieren. Wie auch sei, ich habe versucht aus beiden das beste zu einem zu verbinden. Es wird hier ein V-Server mit Debian GNU/Linux Sarge und der "Linux-VServer branch" 2.0 aufgebaut. Das funktioniert so auch mit der aktuellen Version 2.2 und Debian Etch, beachten Sie aber hierzu die Hinweise am Ende.

http://www.5dollarwhitebox.org/wiki/index.php/Howtos_Linux-Vserver_Debian_Sarge

http://oldwiki.linux-vserver.org/Step-by-Step+Guide+2.6

Basisinstallation

Debian Basisinstallation, dabei sollen folgende Pakete installiert sein:

util-vserver, ssh, ncurses-base, libncurses5-dev, mc, kernel-package, fakeroot, bzip2, patch, make, debootstrap

Ok, über mc kann man streiten, aber mcedit ist mein Lieblingseditor.

Nach erfolgreicher Debian GNU/Linux Installation wird nun der Kernel so angepasst das er V-Server betreiben kann. Sehen Sie bei http://www.kernel.org/ und http://linux-vserver.org/ nach, was der aktuelle Kernel und VServer-patch ist und ersetzen Sie die Links unten mit diesen.

Damit die Hard-Limits später auch funktionieren, sollte bei "make menuconfig" die Option "Enable Hard CPU Limits" aktiviert werden.

cd /usr/src/
wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2
wget http://ftp.linux-vserver.org/pub/kernel/vs2.0/patch-2.6.17.13-vs2.0.2.1.diff.bz2
tar -xjvf linux-2.6.17.13.tar.bz2
bunzip2 patch-2.6.17.13-vs2.0.2.1.diff.bz2
cp patch-2.6.17.13-vs2.0.2.1.diff linux-2.6.17.13/.
cd linux-2.6.17.13
cat patch-2.6.17.13-vs2.0.2.1.diff | patch -p1
cp /boot/config-2.6.8-2-386 .config
make menuconfig
make
make modules_install
cp .config /boot/config-2.6.17.13-vs
cp System.map /boot/System.map-2.6.17.13-vs
cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.17.13-vs
mkinitrd -o /boot/initrd.img-2.6.17.13-vs 2.6.17.13-vs2.0.2.1

Nun muss der neue Kernel noch dem Bootloader mitgeteilt werden.

mcedit /boot/grub/menu.lst

  folgendes einfühgen (erst die richtige Stelle suchen klar):

  title           Vanilla 2.6.17.13-vs
  root            (hd0,0)
  kernel          /boot/vmlinuz-2.6.17.13-vs root=/dev/hda1 ro
  initrd          /boot/initrd.img-2.6.17.13-vs
  savedefault
  boot

reboot

Wer nicht sicher ist ob der richtige Kernel gebootet hat (entfernter Server usw.) kann das nun mit "uname -r" prüfen.

V-Server erstellen

Da bei mir die größte Partition immer /home ist, möchte ich diese auch als V-Server Home-Dir nutzen. Dieses kann nun angepasst werden:

mkdir /home/vservers/
rm /etc/vservers/.defaults/vdirbase
ln -s /home/vservers /etc/vservers/.defaults/vdirbase
setattr --barrier /home/vservers/

Den ersten V-Server erstellen, das kann je nach Internet-Verbindung lange dauern, da eine komplette Basisinstallation vom Debian Server gezogen wird. Aus diesem Grund ist es auch ratsam, einen Server nur zum Zweck aufzusetzen andere Server durch kopieren daraus zu erstellen. Das geht dann in wenigen Minuten.

Hinweis: <name>, <name1> oder <name2> sind die V-Server Name, diese müssen durch Ihre Namen ersetzt werden.

vserver <name> build -n <name> \
  --hostname <name>.meinedomain.de \
  --interface eth0:192.168.0.111/24 \
  -m debootstrap -- -d sarge

Alles was in diesem Server mit mount/umount, network, nodes usw zu tun hat wird aus den start/stop Skripten gelöscht. Das ist nicht unbedingt notwendig, erspart aber eine Menge Fehlermeldungen beim starten und stoppen der V-Server, da diese solche Dinge sowieso nicht tun dürfen/können.

cd /home/vservers/<name>/etc/rc0.d/
rm K20makedev K25hwclock.sh S30urandom \
  S31umountnfs.sh  S35networking S36ifupdown \
  S40umountfs S90halt K89klogd
cd ../rc6.d/
rm K20makedev K25hwclock.sh S30urandom \
  S31umountnfs.sh S35networking S36ifupdown \
  S40umountfs S90reboot K89klogd
cd ../rcS.d/
rm S05keymap.sh S48console-screen.sh S50hwclock.sh \
  S40networking  S45mountnfs.sh S10checkroot.sh S02mountvirtfs
rm S30procps.sh S35mountall.sh S36mountvirtfs S39ifupdown \
  S30checkfs.sh S18ifupdown-clean S18hwclockfirst.sh
cd ../rc2.d/
rm S20makedev S11klogd

Nun kann man den Server das erste mal starten:

vserver <name> start

Wichtig ist nun die Debian Basisinstallation gebrauchsfertig zu machen.

vserver <name> enter

Wichtig, hier nun "base-config" ausführen! Danach die Datei /etc/apt/sources.list nach eigenen Wünschen anpassen und das System aktualisieren, sowie die gewünschte Software installieren.

Um einen Server anzuhalten:

vserver <name> stop

Probleme und Limits setzen

SSHD Problem:

Da der SSH Dienst an allen Port hört, muss er auf dem Host und auf den V-Servern so eingerichtet sein, das dieser nur auf einer IP Adresse hört.

Dazu muss nun in der Datei /etc/ssh/sshd_config der Teil "#ListenAddress 0.0.0.0" aktiviert und so verändert werden das nur die eigene IP verwendet wird: z.B.: ListenAddress 192.168.0.111

Das gleiche wie beim sshd gilt natürlich auch für andere Server Software. Beim Apache Dienst ist zum Beispiel ebenfalls eine Anpassung notwendig.

Es gibt Möglichkeiten diese Probleme zu Umgehen, aber das erkauft man sich dann mit fehlender Einfachheit der Installation und das ist immerhin einer Gründe die für den Linux-VServer sprechen.

Limits für V-Server setzen:

Das wichtigste Limit für einen V-Server ist der Arbeitsspeicher. Hier muss man zunächst die Größe der Seiten kennen, in der der V-Server Host rechnet. Bei i386 Systemen ist das 4096Byte.

Ein Directory rlimits erzeugen

mkdir /etc/vservers/<name>/rlimits

Je Wert eine Datei mit dem Limit darin ablegen. Für das Speicher Limit benötigen wir rss und as. Mehr Infos dazu auch unter http://linux-vserver.org/Memory_Limits und http://oldwiki.linux-vserver.org/Resource+Limits

Ein sicherer Weg den Server benutzbar zu halten, ist den Wert für das rss hart Limit in Summe unter dem Wert des tatsächlich verfügbaren Virtuellen Speicher (Swap + RAM) zu halten. Bei einem Server mit 1,0 GByte RAM und 2,0 GByte Swap als etwas kleiner als 3,0 GByte. Praktisch wird es nie passieren das alle V-Server gleichzeitig 100% Ihres Speicher benötigen. Aus diesem Grund ist ein Wert rss = physikalischem RAM für V-Server welche in eigener Nutzung laufen sicher OK.

Für jeden V-Server daher diese Dateien vor dem ersten Start erzeugen:

echo "100000" > /etc/vservers/<name>/rlimits/as.hard
echo "100000" > /etc/vservers/<name>/rlimits/rss.hard

Diese Werte können mir folgendem Befehl abgefragt werden.

vserver-stat

  oder

cat /proc/virtual/`cat /var/run/vservers/<name>`/limit

Disk-Quota für einen V-Server einstellen:

Um jedem V-Server ein Disk-Quota zuzuweisen muss folgendes Verzeichnis und Datei vorhanden sein. Wenn nicht zunächst erstellen.

/etc/vservers/name3/scripts/post-start

Um ein Disk-Quota zuzuweisen (im Beispiel hier 4GByte) muss diese Datei so aussehen:

/usr/sbin/vdlimit --xid 101 \
    --set space_total=4000000 \
    --set space_used=`du -s /home/vservers/name3/ | awk '{print $1}'` \
    --set inodes_total=4000000 \
    --set inodes_used=`ls -1aRi /home/vservers/name3/ | awk '/^[0-9]+ / { print $1 }' | sort -u | wc -l` \
    --set reserved=5 /home/vservers/name3/

Einen V-Server kopieren:

Einfachster Weg ist das Verzeichnis des Servers zu kopieren und alle die Konfiguration betreffenden Files dann in der Kopie anpassen. Natürlich sollte der V-Server dabei nicht laufen.

mkdir /home/vservers/<name2>
cp -a /home/vservers/<name1>/* /home/vservers/<name2>
mkdir /etc/vservers/<name1>/
cp -a /etc/vservers/<name1>/* /etc/vservers/<name2>
echo "49155" > /var/run/vservers/<name2>

=> natürlich hier eine neue Nummer nehmen!

Nun anpassen:

Am Host:

Im FS des V-Servers:

Hinweise für Debian Etch und V-Server 2.2

Nach einem Update 2.0 auf 2.2

Startet man einen neu erstellten V-Server das erste mal, so wird dieses mit einer Meldung ähnlich wie dieser hier fehlschlagen:

ncontext: vc_net_create(): Invalid argument
 ...
Failed to start vserver 'name2'

Lösung:

echo 100 > /etc/vservers/name2/context

Die Zahl 100 ist ein "static context". Ein gültiger "static context" muss zwischen 2 und 49151 liegen.

Beim V-Server erstellen

Beim erstellen der V-Server gibt es kein base-config mehr, wie in Sarge. Um die Grundeinstellungen unter Etch zu tätigen kann man folgende Befehle nacheinander eingeben:

dpkg-reconfigure passwd
apt-get install locales
dpkg-reconfigure locales
tzconfig

Danach ist es noch angebracht die Datei /etc/apt/sources.list in dem neuen V-Server zu erweitern.

Nützliche Links

howto linux-vserver (last edited 2008-05-15 11:54:13 by Martin)