OpenVZ virtualizace

Nedávno jsme s kamarádem rešili umístění serveru do housingu a možnosti, jak ušetřit náklady za umístění více počítačů. Dostali jsme se proto k možnosti hardware virtualizovat a vytvořit tak několik virtuálních strojů na jednom fyzickém. Vybírali jsme z těchto možností:

Po delším rozhodování a testování vlastností jednotlivých virtualizačních technologií jsme se nakonec rozhodli pro OpenVZ především díky velice nízkému “vyhození” systémových prostředku na samotnou virtualizaci, dostatečnému oddělení jednotlivých zón a jednoduchosti administrace. Zde je několik postřehů, které by se mohly hodit.

Kompilace kernelu

Prvním krokem k rozchození OpenVZ je kompilace modifikovaného kernelu. Pokud nechcete použít některý z předpřipravených binárních balíčků pro některé distribuce, je třeba stáhnout patch pro Vanilla kernel + příslušnou verzi linuxového kernelu z kernel.org. Po opatchování je třeba vzít .config z předchozí verze kernelu a spustit make oldconfig. Dále už stačí kernel zkompilovat a nabootovat.

Administrační nástroje

Pokusy jsem prováděl na Debian Linuxu, uvedu proto postup, jak vytvořit potřebné balíčky a ty nainstalovat. Nejprve je třeba stáhnout programy vzctl a vzquota ze stránky OpenVZ Utilities. Oba balíky rozbalit a za pomoci příkazu dpkg-buildpackage -rfakeroot -b vytvořit potřebné balíčky. Ty pak následně nainstalovat za pomoci:

dpkg -i vzquota_3.0.0.7-1_i386.deb
dpkg -i vzctl_3.0.0.8-1_i386.deb

Pokud kernel neinstalujete za pomoci balíku, ale ručně kompilujete a kopírujete patřičné soubory, je vhodné odstranit dependenci na vzkernel v souboru vzctl-3.0.10/debian/control v balíku vzctl-3.0.10.tar.bz2. To je třeba provést ještě před vytvořením výsledného balíku. Jde o následující změnu:

Depends: vzkernel, vzquota, iproute, gawk, tar, ${shlibs:Depends}, ${misc:Depends}

Nahradit za:

Depends: vzquota, iproute, gawk, tar, ${shlibs:Depends}, ${misc:Depends}

Instalace templatu pro zónu

Před vytvořením zóny je třeba mít šablonu, ze které bude zóna vytvořena. Pro vyzkoušení doporučuju stáhout např. hotovou šablonu pro Debian/Sarge (debian-3.1-i386-minimal.tar.gz, příp. debian-3.1-x86_64-minimal.tar.gz) ze stránek OpenVZ. Tu pak nahrát do /var/lib/vz/template/cache a vytvořit symlink /var/lib/vz/template/cache/debian.tar.gz ukazující na stažený soubor. Postup pro vytvoření vlastní šablony s Debian Linuxem je možné najít na Wiki OpenVZ.

Vytváření zóny

Novou zónu vytvoříme za pomoci přikazu vzctl create 101 –ostemplate debian. Přiřadíme jí IP adresu za pomoci vzctl set 101 –ipadd x.x.x.x –save a následně spustíme - vzctl start 101. Zóna by měla naběhnout a měla by být vidět za pomoci příkazu vzlist.

main:~# vzlist -a
VPSID NPROC STATUS IP_ADDR HOSTNAME
101 4 running x.x.x.x zone1

Změnu rootovského hesla provedeme za pomoci vzctl exec 101 bash a následně příkazem passwd (pozor na zapnuté local echo). Přes exit/logout/CTRL+D se vrátíme zpět na hlavní stroj:

main:~# vzctl exec 101 bash
passwd
Enter new UNIX password: test
Retype new UNIX password: test
passwd: password updated successfully
exit

Nyní zbýva počítači přiřadit vlastní hostname přes vzctl set 101 –hostname xxx –save a zóna je připravena k použití:

zone1:~# uname -a
Linux zone1 2.6.16-026test014 #2 Tue Jun 27 13:50:19 CEST 2006 i686 GNU/Linux

zone1:~# mount
simfs on / type simfs (rw)
proc on /proc type proc (rw)
devpts on /dev/pts type devpts (rw)
tmpfs on /dev/shm type tmpfs (rw)

zone1:~# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jun27 ? 00:00:00 init [2]
root 15378 1 0 Jun27 ? 00:00:00 /sbin/syslogd
root 15385 1 0 Jun27 ? 00:00:00 /usr/sbin/sshd
root 15390 1 0 Jun27 ? 00:00:00 /usr/sbin/cron
root 26266 15385 0 12:39 ? 00:00:00 sshd: root@pts/0
root 26270 26266 0 12:40 pts/0 00:00:00 -bash
root 26374 26270 0 12:50 pts/0 00:00:00 ps -ef

Jednotlivé zóny je pak možné omezovat (využití procesoru, paměť, disková kvota, ..) patřičným nastavením konfiguračních souborů. Před použitím určitě doporučují přečíst dokumentaci, která je velice přehledně zpracováná a doplněná aktuálními informacemi na Wiki. Pokud plánujete propojit zónu přes síť s okolním světem za pomoci venet interfacu, nezapomente povolit ip_forward.

echo 1 > /proc/sys/net/ipv4/ip_forward
Written on June 29, 2006