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:
- Die Ressourcen des Host Rechners sind zu fast 100% vom V-Server nutzbar, also geringe "Verluste".
- Ein V-Server ist sehr schnell Installiert, also sehr einfach Umzusetzen.
negative Merkmale:
- Die Trennung der V-Server untereinander und vom Host ist nicht sehr groß. Gemeint ist hier auch die fehlende Privatsphäre, ein Host Admin kann jederzeit in einen V-Server wechseln. Ganz anders als bei User-Mode-Linux, hier ist die Trennung 100%'ig.
- Nicht alle Programme laufen 100% Problemfrei.
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:
- Der Symlink zum "run" File geändert werden.
- Der Hostname in "name" und "uts/nodename"
- Die Daten in Interfaces
- die Werte rlimit nach Bedarf
Im FS des V-Servers:
- IP wo der sshd apache usw gebunden ist.
- ssh keys
- /etc/hostname; /etc/mailname
- usw..
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
problematische Programme: http://linux-vserver.org/ProblematicPrograms
Tipps und Tricks: http://deb.riseup.net/vserver/usage/
Weiteres Howto: http://wiki.teuwen.org/LinuxVserver
