NetBSD-3 & XEN Hypervisor

30.06.2006 00:46

NetBSD-3 & XEN virtualization Hypervisor

Virtualizacia v Operacnom systeme Netbsd na architekture x86.

V sucastnosti je mojou srdcovou zalezitostou xen ,instaloval som zopar serverou s nim a tak som sa
rozhodol napisat o nom najeky serial.

Uvod)
Najprv si objasnime nejake pojmy aby sme kazdy vedeli o com sa bavime a mozme sa puztit do toho.

Virtualizacia Co to je ??
Je to velmi stara technologia ,ktorej princip spociva v behu roznych operacnych systemov na jednom
zeleze paralelne.Prvy krat pokial viem ju zacala pouzivat firma IBM na svojej rade Mainframe
v sucastnosti zSeries.Prava virtualizacia nevyzaduje ziadne zasahy do virtualizovaneho OS.
XEN ako technologia umoznuje v sucastnosti oba typy virtualizacie ja klasicku(treba na nu
specialny CPU ktory ma podporu technologie IntelVT) aj paravitualizacie.
Prikladom pravej virtualizacie je napr. Vmware,Bochs,Qemu.

Paravirtualizacia je sposob virtualizacie OS v ktorom je nutne modifikovat beziaci OS tak aby
bol schopny behu.Tento sposob pouziva xen v pripade ze nemate to stastie a nieste vlastnikom CPU,
ktory ma podporu IntelVT.

Ring je uroven opravnenia na ktorej bezi dany kod,resp ktoru ma nastavena dana stranka v pamati.
od procesora 80386(nie som si isty), su podporovane 4 urovne ochrany ring0-ring3.Normalne bezi
kernel v ring0 a userspace v ring3.V pripade pouzitia xen enabled kernelu a hypervisoraktory bezi
v ring 0 sa kernel aj hlavnej dom(tvz Dom0) aj virtualizovanej domeny (tvz. DomU)posuva do ring1.
Userspace opat bezi v ring3

Domena(DomU) virtualizovany Operacny system.
V sucastnosti je to pre verziu xen2 (netbsd,freebsd,linux2.4,linux2.6,plan9)
xen3 (solaris,netbsd,linux2.4,linux2.6)
Ak to nie je nutne nema realnu predstavu o HW ktory bezi na masine pozna len zariadenia ktore jej
exportuje Hypervisor cez Dom0.

Hypervisor je velmi maly kod ,ktory vlastne umoznuje celu tu srandu s virtualizaciou.
Hypervisor sa loadne do pamate ako prvy a nasled zavedie do pamate aj kernel prislusnej Dom0.
Hyp. sa stara o odchytavanie preruseni ich spravne spracovanie,o vypadky a mapovanie stranok
pamati(treba si uvedomit ze kazdy DomU OS ma svoju pamat zacinajucu na addrese 0 ),exportovanie
zariadeni ako su sietova karta a disk.Takztiez umoznuje vybrat jednotlive PCI zariadenia a tie
pridavat jednotlivym domenam.

Dom0 je operacny system ktory do kory natiahne do pamati hypervisor a ten umoznuje nasledovne
spustanie DomU a ich managovanie.Dom0 ma vsetky potrebne ovladace na HW pocitaca.
Exportuje zariadenia ako disky,sietove karty operacnym systemom ktore bezia v rezime DomU.

Instalacia
V Operacnom systeme NetBSD je instalacia XENu velmi jednoducha,ako prvu vec potrebujeme zdrojaky
kernulu a xen Dom0 enabled kernel.
Pokial mame stiahnute zdrojaky konfigurak najdeme v /usr/src/sys/arch/i386/conf/XEN2_DOM0 tento si
skompilujeme a nainstalujeme standardnym sposobom[1].

Dalej potrebujem pkgsrc(co je framework velmi podobny portom v Fbsd a portage v Gentoo).
Z neho si nainstalujeme sysutils/xenkernel20 , sysutils/xentools20 a ako posledne sysutils/grub.
Grub nainstalujeme do MBR a jeho kofigurak okrem standardnych veci nastavime takto:

title Xen 2.0 / NetBSD (hda0, vga)
root(hd0,0)
kernel (hd0,a)/xen.gz dom0_mem=65536
module (hd0,a)/netbsd root=/dev/hda1 ro console=tty0

pricom dom0_mem=65536 predstavuje velkost pamate pridelenej Dom0 ktora sa stara o DomU.

Po skopirovani spustacich skriptov pre xend a xendomains do /etc/rc.d/
Do /etc/rc.conf napiseme xend=YES a
xendomains="mena domen ktorych configuraky chcem startovat automaticky po boote Dom0"
configuraky najdem v /usr/pkg/etc/xen/.

Na spustenie xend taktiez potrebujem zariadenia v /dev ktore nie suv defaultnej instalacii
pritomne. Preto spravime cd /dev && sh MAKEDEV xen .

Nasledne uz mozme xend nastartovat.

prikazom xm list si mozme skontrolovat ci nam xend bezi ako ci nam bezia vsetky virtualne masiny
a ked ano ako su na tom.

#xm list
Name Id Mem(MB) CPU State Time(s) Console
Domain-0 0 64 0 r---- 58.1

Vytvorenie DomU
na vytvorenie DomU namtreba jej konfigurak ktory najjednoduchsie spravime tak ,ze upravime
xmexample1 ktory je dodavany s instalaciou na nase potreby.

kernel = "/netbsd-XEN2_DOMU"
#kernel = "/netbsd-INSTALL_XEN2_DOMU"
#kernel = "/netbsd-INSTALL_XENU" # in NetBSD 3.0

# Memory allocation (in megabytes) for the new domain.
memory = 128

# A handy name for your new domain. This will appear in 'xm list',
# and you can use this as parameters for xm in place of the domain
# number. All domains must have different names.
#
name = "NetBSD"

# Which CPU to start domain on (only relevant for SMP hardware). CPUs
# numbered starting from ``0''.
#
cpu = -1 # leave to Xen to pick

#----------------------------------------------------------------------------
# Define network interfaces for the new domain.

# Number of network interfaces (must be at least 1). Default is 1.
nics = 1

# Define MAC and/or bridge for the network interfaces.
#
# The MAC address specified in ``mac'' is the one used for the interface
# in the new domain. The interface in domain0 will use this address XOR'd
# The MAC address specified in ``mac'' is the one used for the interface
# in the new domain. The interface in domain0 will use this address XOR'd
# with 00:00:00:01:00:00 (i.e. aa:00:00:51:02:f0 in our example). Random
# MACs are assigned if not given.
#
# ``bridge'' is a required parameter, which will be passed to the
# vif-script called by xend(8) when a new domain is created to configure
# the new xvif interface in domain0.
#
# In this example, the xvif is added to bridge0, which should have been
# set up prior to the new domain being created -- either in the
# ``network'' script or using a /etc/ifconfig.bridge0 file.
#
vif = [ 'mac=aa:00:00:50:02:f0, bridge=bridge0' ]

#----------------------------------------------------------------------------
# Define the disk devices you want the domain to have access to, and
# what you want them accessible as.
#
# Each disk entry is of the form:
#
# phy:DEV,VDEV,MODE
#
# where DEV is the device, VDEV is the device name the domain will see,
# and MODE is r for read-only, w for read-write. You can also create
# file-backed domains using disk entries of the form:
#
# file:PATH,VDEV,MODE
#
# where PATH is the path to the file used as the virtual disk, and VDEV
#
# where PATH is the path to the file used as the virtual disk, and VDEV
# and MODE have the same meaning as for ``phy'' devices.
#
# VDEV doesn't really matter for a NetBSD guest OS, but it does for Linux.
# Worse, the device has to exists in /dev/ of domain0, because xm will
# try to stat() it. This means that in order to load a Linux guest OS
# from a NetBSD domain0, you'll have to create /dev/hda1, /dev/hda2, ...
# on domain0, with the major/minor from Linux :(

disk = [ 'phy:/dev/wd0e,wd0d,w' ]
#disk = [ 'file:/var/xen/nbsd-disk,wd0d,w' ]

#----------------------------------------------------------------------------
# Set the kernel command line for the new domain.

# Set root device. This one does matter for NetBSD
root = "/dev/wd0d"
# extra parameters passed to the kernel
#extra = ""

#----------------------------------------------------------------------------
# Set according to whether you want the domain restarted when it exits.
# The default is False.
#autorestart = True

NetBSD sa dodava spolu so specialnym kernelom, ktory je schopny nabootovat a spustit
instalaciu OS na virtualny disk.Takto najlahsie nainstalujete NetBSD na virtualny disk a mozete ho
zacat pouzivat.

instalaciu OS na virtualny disk.Takto najlahsie nainstalujete NetBSD na virtualny disk a mozete ho \
zacat pouzivat.
Tento kernel sa vola netbsd-INSTALL_XENU a normalny kernel pre domU ma nazov netbsd-XENU
Tieto kernely sa daju stiahnut z oficialneho ftp servera ftp.netbsd.org alebo samostatne
skompilovat.

Virtualny network interface definujeme v DomU konfiguraku takto:
vif = [ 'mac=aa:00:00:50:02:f0, bridge=bridge0' ]

pricom ak prvu cast kde je mac nechame prazdnu pri kazdom boote sa nam vygeneruje nova MAC adresa.
bridge je nazov bridgu ku ktoremu sa nasa virtualne sietovka pripoji aby mohla komunikovat s
okolim.

Virtualny disk sa definuje takto:
disk = [ 'phy:/dev/wd0e,wd0d,w' ]
#disk = [ 'file:/var/xen/nbsd-disk,wd0d,w' ]

pricom phy znamena ze sa bavime o fyzickom zariadeni teda reaknej particii na disku a file ze sa ba\
vime o file v suborovom systeme na Dom0.wd0d je meno pod ktorym sa zobrazi DomU kernelu
pri bootovani a 'w' je write mod ktory hovori ze na disk sa da aj zapisovat.

Ak mame konfigurak spraveny horsa do virtualizacie.

Running

prikazom xm create {meno konfiguraku} vytvorime virtualnu domenu.
xm create xmexample1 vytvori domenu podla konfiguraku v /usr/pkg/etc/xen/xmexample1

ak dame po uspesnom vytvoreni xm list uvidime
Name Id Mem(MB) CPU State Time(s) Console
Domain-0 0 63 0 r---- 25086.1
NetBSD 2 128 0 -b--- 9014.0 9602

Vela zdaru vam pri uspesnom virtualizovani zelam :).

[1]http://www.netbsd.org/guide/en/chap-kernel.html
[2]http://www.netbsd.org/Ports/xen/howto.html
[3]www.xensource.com

    • nice 02.07.2006 | 11:31
      Avatar blackhole_ventYl   Používateľ

      nice, netbsd sice velmi nepoznam do takych podrobnosti, ale xen si urcite raz vyskusam na linuxe...

      poopravim technicky detail, ktory je tam uvedeny nepresne (moja pedancia mi nedovoli tak neucinit):
      urovne behu sa oznacuju PL0-PL3 (ring0-ring3 je oznacenie windows NT), tieto urovne behu existuju v rade intel x86 pocnuc procesorom i80286, ktory zaviedol 24bitovy adresny priestor, memory managment unit a chraneny rezim procesora. strankovanie pamate a 32bitovy adresny priestor boli implementovane v i80386. nie som si celkom isty, ci v sa page directory, alebo page table udava priviledge level, alebo nie, ale povedal by som, ze nie, kedze page directory je alokovany deskriptorom v GDT (global descriptor table) alebo LDT (local descriptor table). To, aky priviledge level treba mat na uspesny pristup k page directory sa urcuje v RPL poli deskriptora segmentu v [G|L]DT. Cisto z tohto hladiska je virtualizacia mozna aj na procesore i80286.
      Druhym hladiskom je pristup k I/O. Existuje sada instrukcii (rodina in a out instrukcii, instrukcie na manipulaciu so systemovymi registrami MSR atd.), ktore je mozne spustit len pokial proces bezi v PL0. Co sa tyka instrukcii IN*, OUT*, v ich pripade je mozne do procesora natiahnut tzv port bitmap, ktora pre kazdy jeden I/O port procesora (ma ich 65536) obsahuje jeden bit, ktory urcuje, ci ma, alebo nema proces pravo k pristupu nan.

      Pri virtualizacii sa vyuzije faktu, ze kernel je posunuty z PL0 na PL1 (ktory byva vo vacsine OS nevyuzity - vyuziva sa PL0 na beh jadra a PL3 na beh aplikacii) a nasledne vynimky, ktore vzniknu pri behu PL0 kodu na urovni PL1 (pokus o naloadovanie GDTR, LDTR a podobne), emuluje softwarovo k spokojnosti svojej a virtualizovaneho operacneho systemu.

      Je to sice trocha odbocene od NetBSD, ale s virtualizaciou to aspon trocha suvisi ;))))
      ---
      Cuchat s nadchou, to je ako sniffovat bez promiscu.

      --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
      • re: 02.07.2006 | 12:52
        disorder   Návštevník

        1) ring nie je len oznacenie windowsom (myslim, ze je to skor zargon)
        2) kazda stranka sa da oznacit ako pristupna z PL3
        3) page directory nie je alokovany ziadnym deskriptorom

        btw rotfl, signature
        ---
        Ale je to smutná epocha, keď je ľahšie rozbiť atóm ako predsudky. Einstein.

        • 1) moze byt, RINGx som 02.07.2006 | 13:45
          Avatar blackhole_ventYl   Používateľ

          1) moze byt, RINGx som vidaval hlavne pri programovani NT kodu...
          2) Figure 5-10. Format of a Page Table Entry
          zrejme si mylis segmenty a stranky. Na urovni stranok sa uz ziadna ochrana v zmysle priviledge levelov nevykonava, pretoze je to zbytocne a kontraproduktivne - to, ku ktorej stranke ma procesor pristupovat sa dozvie z bazovej adresy segment descriptora pridanim offsetu a naslednym prehnanim cez mechanizmus pagingu. Tudiz ked sa jedna o to, ci moze, alebo nemoze proces pristupit k pamati, tak to sa riesi pri loadovani segment descriptora do procesora, so strankami to nema nic spolocne (bolo by to pomale).
          3) pre potreby systemu sice page directory nie je urceny ziadnym deskriptorom, pretoze jeho fyzicka adresa je loadnuta do CR3, to je pravda, ale ked v page directory, alebo page table chces nieco robit, musis ich mat naalokovane niekde ako segmenty ;-) a ked si tento segment poznacis ako pristupny pre PL1, tak ho budes mat pristupny ako PL1... nothing more, nothing less... procesoru je sum a fuk, aka uroven privilegii je pre dany deskriptor nastavena...

          ---
          Cuchat s nadchou, to je ako sniffovat bez promiscu.

          --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
          • re: 02.07.2006 | 14:04
            disorder   Návštevník

            2) pokial si si nevsimol: U/S - USER/SUPERVISOR
            3) ale to je obycajne namapovanie stranky do page directory nejakemu procesu - je uplne jedno co je v nej. nepotrebujes ziaden specialny deskriptor, staci pouzit stale ten na 4GB.

            ---
            Ale je to smutná epocha, keď je ľahšie rozbiť atóm ako predsudky. Einstein.

            • 2) moj chyba - nepochopil 02.07.2006 | 14:12
              Avatar blackhole_ventYl   Používateľ

              2) moj chyba - nepochopil som spravne vyklad, myslel som, ze sa jedna o znacenie pre potreby operacneho systemu, ale ako vidim, nejedna
              3) no sak mozes, ale stale to ako take nema co robit s pagingom
              ---
              Cuchat s nadchou, to je ako sniffovat bez promiscu.

              --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
              • re: 02.07.2006 | 14:26
                disorder   Návštevník

                3) aha, som nechapal co si tym myslel. uz mi je to (dufam) jasne

                ---
                Ale je to smutná epocha, keď je ľahšie rozbiť atóm ako predsudky. Einstein.