Co s Xenem?
V prvním dílu miniseriálu jsme si ukázali, jak nainstalovat dom0, čili vrstvu, která umožňuje virtualizaci, a jak na ní nainstalovat virtuální stroj s NetBSD v režimu paravirtualizace.
Takový typ virtualizace má tak nízký overhead, že výkonově se to dá spíše nazvat izolací procesů, než skutečnou virtualizací. Co ale s ostatními systémy? Linux, OpenBSD, nebo Windows? To je téma dneška.
Není paravirtualizace jako paravirtualizace
Linux se dá spustit klasicky paravirtualizovaně, úplně stejně jako NetBSD. Dodáme externí modifikovaný kernel, který umístíme v prostoru dom0 a ve virtuálním stroji rozběhneme systém. Jako příklad použijeme široce rozšířený CentOS 7.
Kromě toho ale lze Linux spustit se speciálním loaderem nazvaným pygrub a jeho bezpečnější variantou pv-grub. Systém funguje tak, že pygrub začne bootovat a načte si kernel z domU a ten pak zavede. Znamená to, že i v tomto případě je nutné, aby kernel v domU měl podporu pro Xen.
Jedná se tedy stále o PV, nejde o HVM ani o PHVM (o tom více v příštím díle). Tady jsou dva příklady, jeden s kernelem v úložné prostoru domO a druhý s pygrubem a kernelem v prostoru domU.
CentOS 7 s kernelem v dom0
Předpokládáme, že dom0 a síťový bridge máme nastaveno dle prvního dílu. Podobně jako v případě s NetBSD potřebujeme pro Linux dom0, prázdnou image, externí kernel + initrd a konfigurační soubor.
Prázdnou 20G image disku vytvoříme příkazem:
# cd /var/xen # dd if=/dev/zero of=centos.img bs=1m count=20480
Image kernelu a initrd si stáhneme ze stejného umístění, jaké nastavíme do konfiguračního souboru v příkazu extra
, aby nám odpovídala verze kernelu a balíků, jinak instalace selže.
# mkdir -p /var/xen/boot/centos # cd /var/xen/boot/centos # wget http://ftp.ciril.fr/pub/linux/centos/7/os/x86_64/images/pxeboot/initrd.img # wget http://ftp.ciril.fr/pub/linux/centos/7/os/x86_64/images/pxeboot/vmlinuz
Při vytváření konfiguračního souboru, musíme zvláště pozorně vyplnit sekci extra
, kde nastavujeme instalační repozitář a následně dočasnou adresu virtuálu::adresu výchozí brány:masku sítě a také nameserver.
# vim /usr/pkg/etc/xen/centos.cfg name = "CentOS" memory = "3800" xen_platform_pci=1 extra = "xencons=tty1" extra = "ksdevice= inst.repo=http://ftp.ciril.fr/pub/linux/centos/7/os/x86_64 ip=192.168.1.222::192.168.1.1:255.255.255.0:cento7:eth0:none nameserver=8.8.8.8" vcpus=1 acpi=1 apic=1 vif = [ 'ip=192.168.1.222, mac=00:12:3e:03:9c:56, bridge=bridge0' ] disk = [ 'file:/var/xen/centos.img,xvda,w' ] kernel="/var/xen/boot/centos/vmlinuz" ramdisk="/var/xen/boot/centos/initrd.img" usbdevice = 'tablet' sdl=0 opengl=1 vnc=1 stdvga=0 on_reboot = 'restart' on_crash = 'destroy'
Nyní máme připravený stroj k instalaci a můžeme zatáhnout za páky:
# xl create /usr/pkg/etc/xen/centos.cfg Parsing config from /usr/pkg/etc/xen/centos.cfg # xl console CentOS
Následně sledujeme v konzoli start systému, až se nás zeptá, zda zvolíme instalaci textovou nebo grafickou. Pokud zvolíme textovou, můžeme vesele pokračovat v konzoli. Pokud zvolíme grafickou, je třeba připojit se k VNC serveru, který Xen pro náš virtuál spustil
# vncviewer localhost:5900
Pokud potřebujeme přistoupit z jiné stanice, můžeme použít ssh tunel, nebo forwardované X ssh -Y
, případně upravit IP, na kterých naslouchá XEN přes /usr/pkg/etc/xen/xend-config.sxp
. Pokud máme více strojů se spuštěnou grafikou vnc=1
, budou mít port podle pořadí spuštění 5900+N.
Když dokončíme instalaci (v našem případě síťovou, adresa se načte z konfigu), máme plnohodnotný CentOS. Než ho spustíme, musíme změnit konfiguraci. Na rozdíl od NetBSD neměníme kernel (instalační/běhový), ale vše změníme v konfiguračním souboru. Vyhodíme cestu s instalací a přidáme direktivu root=
. Při výchozí instalaci bez LVM nalezneme root na /dev/xvda3
. Dále je při DHCP lepší vyhodit adresu z vif=
.
# vim /usr/pkg/etc/xen/centos.cfg name = "CentOS" memory = "3800" xen_platform_pci=1 extra = "xencons=tty1" #extra = "ksdevice= inst.repo=http://ftp.ciril.fr/pub/linux/centos/7/os/x86_64 ip=192.168.1.222::192.168.1.1:255.255.255.0:cento7:eth0:none nameserver=8.8.8.8" root="/dev/xvda3" vcpus=1 acpi=1 apic=1 vif = [ 'mac=00:12:3e:03:9c:21, bridge=bridge0' ] disk = [ 'file:/var/xen/centos.img,xvda,w' ] kernel="/var/xen/boot/centos/vmlinuz" ramdisk="/var/xen/boot/centos/initrd.img" usbdevice = 'tablet' sdl=0 opengl=1 vnc=1 stdvga=0 on_reboot = 'restart' on_crash = 'destroy
Nyní můžete systém bezpečně zavést a začít vesele pracovat s virtuálem.
# xl create /usr/pkg/etc/xen/centos.cfg Parsing config from /usr/pkg/etc/xen/centos.cfg
OpenSUSE Leap s kernelem uvnitř domU
K instalaci si zvolíme Suse Leap 15, který má v jádru dobrou podporu ovladačů pro Xen domU. Nepotřebujeme nic jiného, než instalační CD-ROM image, neboli ISO, které si můžeme stáhnout ze kteréhokoli zrcadla OpenSUSE.
Pro instalaci si napíšeme čistě HVM config, který nám pomůže projít rutinní instalační procedurou. V konfiguračním souboru narazíme na některé věci zřetelně jinak než v PV. Nepoužíváme například vůbec instalační kernel z prostoru dom0 a k pevnému disku přibyla image instalačního CD.
Dále tu tentokrát nemáme konsoli, budeme instalovat přes VNC. Přibyla direktiva boot="d"
, která znamená, že systém má spustit zaváděcí bloky z CD-ROM. (V podstatě je to stejný systém, jakým vidí písmena disků systém Windows.) A pro start použijeme HVM builder.
# vim /usr/pkg/etc/xen/suse-inst.cfg builder = "hvm" name = "suse-inst" memory = "2048" vcpus = 1 disk = [ 'file:/var/xen/suse.img,xvda,w', 'file:/var/xen/boot/suse.iso,hdc:cdrom,r' ] vif = [ 'mac=00:01:3e:03:8a:55,bridge=bridge0,model=e1000' ] vnc = 1 boot="d"
Poznámka: Kdybyste v konfiguračním souboru jen změnili boot=„d“ na boot=„c“, měli byste konfigurační soubor pro běh HVM, či v případě dobrého kernelu PVHVM, pokud by vám Linux správně nastartoval. Ale nás teď zajímá PV.
Nyní tedy spustíme stroj a připojíme se k němu pomocí VNC forwardovaného přes ssh.
Pokud jsme připojeni přes SSH na dom0, ujistíme se, že v konfiguračním souboru /etc/ssh/sshd.conf
máme nastaveno X11Forwarding yes
. Počítám pochopitelně s tím, že se nacházíme za firewallem v nějaké DMZ.
Instalaci spustíme následovně:
# xl create /usr/pkg/etc/xen/suse.cfg Parsing config from /usr/pkg/etc/xen/suse.cfg # vncviewer :5900
A otevře se nám grafické okno ve VNC, v němž provedeme klasickou instalaci. Po úspěšné instalaci je třeba vytvořit nový konfigurační soubor pro PV spuštění.
# vim /usr/pkg/etc/xen/suse.cfg < name = "suse" memory = "2048" bootloader = '/usr/pkg/bin/pygrub' xen_platform_pci=1 extra = "xencons=tty1" vcpus=1 acpi=1 apic=1 vif = [ 'mac=00:01:3e:03:8a:55,bridge=bridge0,model=e1000' ] disk = [ 'file:/var/xen/suse.img,xvda,w' ] sdl=0 opengl=1 vnc=1 stdvga=0 on_reboot = 'restart' on_crash = 'destroy'
Spustíme
# xl create /usr/pkg/etc/xen/suse.cfg Parsing config from /usr/pkg/etc/xen/suse.cfg # vncviewer :5900
Poznámky
Spoustu akcí a nastavení, která dělám pro ilustraci by bylo možné řešit jinak, možností jsou opravdu spousty. Např. v případě první instalace by také bylo možné přidat instalační CD a při instalaci zvolit zdroj balíčků: CD-ROM, netřeba dělat jen primární pevné partice atd.
Neudělal jsem to spíše kvůli jednoduchosti. Jen pro zajímavost: pokud se rozhodnete nasadit jako Xen dom0 jiný operační systém, například Linux, bude konfigurace domU a instalační postup velmi podobný, ale musíte počítat s tím, že některá specifika se budou na bázi OS lišit, např. jména disků, nebo specifické direktivy typu zapnutí konzole atd.
Závěr
Ukázali jsme si jak nainstalovat a nastavit a spustit dvě linuxové distribuce v PV modu různým způsobem, jak přidat CD-ROM, nebo další disky. Nejsou to teoretické příklady, oběma způsoby paravirtualizuji už několik let. Běžně instaluji tím prvním, protože někdy bývá s pygrubem/pvgrubem problém.
Příklad s pygrubem se hodí, pokud máte systém nainstalovaný např. v KVM nebo VirtualBoxu a chcete ho, přesně tak jak je, spustit v Xenu (stačí překonvertovat image disku na RAW, a zadat UID v konfiguračním souboru), také má jednodušší upgrade. Navíc různé distribuce mají v kernelu zakompilované různé druhy podpory a úrovně podpory pro Xen, takže je možné, že některá půjde spustit jen jedním z uvedených dvou způsobů.
Co dále?
Čeká nás OpenBSD jako PVHVM a Windows jako HVM. A také si něco řekneme o porovnání výkonu PV/PVHM/HVM, které bude v některých ohledech velmi překvapivé.