Virtualizace

Antonín Víteček, xvitec at fi.muni.cz

Obsah

Virtualizace

Pod tímto pojmem se v počítačové terminologii rozumí přístupu, jež nám umožnuje pohlížet a přistupovat na dostupné zdroje trochu jinak než jaké je jejich skutečné fyzické uspořádání. Přeloženo do termonilogie lidské to zjednodušeně znamená, že na jednom fyzickém počítači jsme schopni provozovat i několik počítačů víceméně na sobě nezávislých.

Proč se virtualizací vůbec zabývat? Umožňuje efektivnější využití hardwaru, poskytuje vylepšení zabezpečení bežících aplikací, zjednodušuje správu více systémů, umožňuje testování rozličných verzí programů a systémů, load balancing.

Rozlišujeme různé úrovně virtualizace, v závislosti na míře a způsobu virtualizace fyzického počítače.

Kontejnery

Do této kategorie řadíme linuxový chroot a jail ze systému FreeBSD. Tato metoda virtualizace spočívá ve spuštění programu v tzv. kontejneru, což je adresář ve stávájící stromové struktuře hostitelského počítače a obsahuje všechny potřebné soubory pro běh určeného programu. Po přepnutí procesu do tohoto kontejneru je tento adresář zvolen jako nový kořenový adresář.

Případný útočník při úspěšném napadení služby běžící v kontejneru, získá přístup k souborům pouze v tomto adresáři a ne k souborům hostitelského počítače. Všechny takto virtualizované procesy však beží pod stejným jádrem.

Dalším rozšířením chrootu je Linux-Vserver, dostupný jako patch zde. Kontejnery jsou nazývány bezpečnostní kontexty a jsou spravovány pomocí balíčku vserver-utils. Kontejnerový, z chrootu vycházející, ale ne ho přímo využívajícím je OpenVZ, základ komerčního řešení Virtuozzo firmy SWsoft. Stejně jako Linux-Vserver je dostupný jako patch zde i s obslužnými utilitami. OpenVZ má díky férovějšímu rozdělování prostředků lepší odolnost proti DOS útokům z hostovaných systémů.

Emulace HW

Je nejpomalejší způsob virtualizace, neboť hostitelský systém musí dynamicky překládat instrukce pro emulovaný HW. Využívá se zejména v momentě, kdy není dostupný hardware pro který je software určen.

Zástupcem v této kategorii je QEMU, umí emulovat architektury x86, x86_64, SPARC, ARM, PowerPC, atd. Lze s ním pracovat ve dvou režimech. Plná emulace - v emulátoru nabootuje celý operační systém. Uživatelská emulace - lze spustit aplikaci pro jiný procesor.

Zrychlení emulace lze dosáhnout nainstalováním modulu kqemu, což je akcelerátor QEMU, údajné zrychlení by mělo dosahovat 90% nativní rychlosti hostitelského počítače.

Paravirtualizace

Tento způsob virtualizace umožňuje dosáhnout lepšího výkonu než u emulace hardwaru, přičemž hostované systémy již beží nezávisle na sobě a je to tedy i další stupeň nad kontejnerovou virtualizací.

Je využito protection modelu pro procesory Intel x86. Kdy s nejvyšším oprávněním, tzv. ring 0, beží upravené jádro, které spravuje hostované systémy.

UML - User-mode Linux je součástí standardního jádra 2.6, přeloženého pouze se speciální volbou. Jednotlivé hostované systémy pak běží jako procesy hostitelského počítače. Nabízí velkou flexibilitu a je výhodné použít ho i pro debugování jádra, neboť nám stačí pouze jeden počítač. Narozdíl od kgdb, kde jsou potřeba pro debugování jádra dva počítače propojene sériovým kabelem.

Zajímavým nástrojem pro paravirtualizaci je jaderný modul lguest, který byl začleněn do jádra řady 2.6.23. Překvapivá je jeho jednoduchost, obsahuje zhruba 5000 řádků kódu.

Dalšími zástupci jsou XEN, který umí jak paravirtualizovat tak plně virtualizovat a WMware. WMware je proprietární komerční produkt od firmy WMware, lze si ho však vyzkoušet na 30 dní zdarma.

Plná virtualizace

Pro plnou virtualizaci je potřeba podpora jak ze strany procesoru, tak ze strany základní desky a BIOSU. Nevýhodou plné virtualizace narozdíl od paravirtualizace je nedokonalé využítí prostředků hostitelského systému. Pamět totiž nelze dynamicky rozdělovat mezi hostovanými systémy a tak dochází k plýtvání.

Naopak nespornou výhodou takového řešení je, že jsme schopni spustit systém bez jakékoliv změny. Toto oceníme zejména v momentě kdy chceme virtualizovat systém s uzavřenými zdrojovými kody, jako například OS rodiny Windows.

Do této kategorie virtualizace spadá již výše zmíněný XEN, který nabootuje jako hypervizor a nepotřebuje k svému běhu žádný OS. Konkurentem je modul KVM - Kernel-based Virtual Machine. V linuxu je přítomen od verze 2.6.20. Stejně jako XEN využívá přímo hardwarových vlastností procesoru.

UML - příklad

Nejdříve stáhneme a rozbalíme jádro.

proto07:/usr/src# wget http://www.eu.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.3.tar.bz2
--07:03:16--  http://www.eu.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.3.tar.bz2
           => `linux-2.6.24.3.tar.bz2.1'
Resolving www.eu.kernel.org... 199.6.1.164, 130.239.17.4
Connecting to www.eu.kernel.org|199.6.1.164|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 46,741,533 (45M) [application/x-bzip2]

100%[====================================>] 46,741,533     8.33M/s    ETA 00:00

07:03:22 (7.30 MB/s) - `linux-2.6.24.3.tar.bz2.1' saved [46741533/46741533]

proto07:/usr/src# tar -xjvf linux-2.6.24.3.tar.bz2

proto07:/usr/src# cd linux-2.6.24.3

Jádro nakonfigurujeme a zkompilujeme. Je důležíté nevynechat volbu "ARCH=um", protože se jedná o oddělenou architekturu.

proto07:/usr/src/linux-2.6.24.3# make defconfig ARCH=um

proto07:/usr/src/linux-2.6.24.3# make menuconfig

proto07:/usr/src/linux-2.6.24.3# make menuconfig ARCH=um

proto07:/usr/src/linux-2.6.24.3# make ARCH=um

proto07:/usr/src/linux-2.6.24.3# cp linux /home/uml/

Nyní máme zkompilované jádro a přistoupíme k tvorbě souborového systému a swapu.

proto07:/usr/src# mkdir /home/uml && cd /home/uml/

proto07:/home/uml# cp /usr/src/linux .

proto07:/home/uml# dd if=/dev/zero of=uml.rootfs bs=1M seek=4096 count=1

proto07:/home/uml# mkfs.ext2 -F uml.rootfs

proto07:/home/uml# dd if=/dev/zero of=uml.swapfs bs=1M count=512

proto07:/home/uml# mkswap uml.swapfs

Připojíme vytvořený obraz disku a nainstalujeme na něj Debian.

proto07:/home/uml# mkdir /mnt/uml

proto07:/home/uml# mount -o loop uml.rootfs /mnt/uml/

proto07:/home/uml# debootstrap --include=ssh,udev lenny /mnt/uml/ http://ftp.cz.debian.org/debian/

Máme nainstalovaný základní systém, nezbývá už nic menšího než ho nakonfigurovat.

proto07:/home/uml# chroot /mnt/uml/

proto07:/# cat /etc/hostname
proto07-beta

proto07:/# cat /etc/fstab 
/dev/ubda   /       ext2    defaults    0   1
/dev/ubdb   none    swap    sw          0   0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0

proto07:/# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth1
iface eth1 inet static
        address 10.0.70.2
        netmask 255.255.255.0
        broadcast 10.0.70.255
        gateway 10.0.70.1

Nyní bychom měli mít připravený funkční systém, který spustíme.

proto07:/home/uml# ./linux ubd0=uml.rootfs ubd1=uml.swapfs mem=128M con=pty con0=fd:0,fd:1 eth1=tuntap,,,10.0.70.2 umid=uml

Literatura