UML használata

A HupWiki-ből...

Tartalomjegyzék

Mit is jelent pontosan az User Mode Linux (UML)?

Az UML hasonlóan a VmWare-hez, egy "számítógép a számítógépben" dolgot biztosít a felhasználóinak. Segítségével több független Linux rendszert futtathatunk a gépünkön egy időben (a Linux rendszerünkön). A különbség a VmWare és az UML között az, hogy míg a VmWare több különböző OS futtatására is képes, addig az UML kizárólag a Linux kernel futtatását célozza meg.

Hogy miért User Mode Linux a neve? A név magáért beszél. A Linux kernelt az ún. "user space"-ben (felhasználói tér) futtatja. Az UML segítségével több Linux rendszer futhat a számítógépünkön, amelyek önálló filerendszerrel rendelkeznek, és a futtatáshoz nincs szükség "root" felhasználói fiókra. Az UML-ed egy saját világ lehet, konfigurálhatod a saját kerneled, beállíthatod a hálózatod, és minden egyéb dolgot művelhetsz, amit egyébként megtehetnél egy hagyományos módon futó Linux OS-sel. Tulajdonképpen úgy futtathatod az UML kernelt, mint bármely más parancsot, az UML kernel kommunikál a hoszt gép kernelével, módosított parancsokat küld a fő kernelnek. Egyedüli probléma a direkt hardver hozzáférés lehet, de erre is vannak megkerülő megoldások.

Az UML filerendszere jelenleg egy file formájában áll rendelkezésre (UML-enként egy, annyi ahány UML-t futtatsz). Mivel az UML filerendszere teljesen el van különítve a hoszt gép "éles" filerendszerétől, nem kell aggódnod attól, hogy a hoszt gép egészségében maradandó károkat okozol. Bármilyen hibát vétesz, az csak az UML-t érinti, és nem hat ki a hoszt gépre.

Mire is lehet felhasználni az UML-t?

Számos területen lehet használni az UML-t. Ha például programot fejlesztesz, és nem akarod a "beta" állapotú programodat az "éles" rendszeredbe telepíteni, akkor csak felhúzol egy UML-t, és futtatod azon. Szoftver fejlesztésénél nem kell több gépet használni, főleg otthon, nem kell több monitor, monitorswitch, nem fogyaszt a több gép több áramot, stb.

Esetleg FTP szervert futtatsz, és nem akarod, hogy a felhasználó elérje a fő gépet? Futtasd az FTP szervert UML-ben, és biztos lehetsz benne, hogy nem fogja elhasználni az összes merevlemez területedet. Félsz a BIND biztonsági hibáitól? Futtasd a BIND-et UML-ben, és nem kell aggódnod, hogy elérik a hoszt gép filerendszerét. Természetesen minél több UML-t futtatsz, annál nagyobb erőforrással kell rendelkezned. Minden egyes UML-lel futtatsz egy virtuális kernelt, plusz a gépednek meg kell hajtania a fő kernelt, programok futnak az UML-e(ke)n, és programok futnak a hoszt gépen is. Ezt nem szabad figyelmen kívül hagyni. A legfontosabb tényező az UML használata során a memória. "RAM-ból sohasem elég" - hangzik az örök mondás. Ez itt fokozottan igaz.

Azért, hogy a gép nem feküdjön ki a több UML használata esetén sem, be lehet korlátozni, hogy az UML szálak mennyi RAM-ot használatnak. Ezt célszerű körültekintően meghatározni. Szerencsére a fő kernel az UML dolgait ugyanúgy ki tudja lapozni, mint bármely memóriarészt, és ezen felül minden egyes UML-nek is be lehet állítani lapozó-területet. Itt is él az általános szabály: a swap területekre ne válaszzunk túl nagy területet, mert csak "teleszemeteli" a rendszer.

Hogyan lehet kipróbálni az UML-t?

Az UML egyelőre még nincs olyan állapotban, hogy komolyabb rendszereket rá lehessen bízni, de számos beta teszter nyúzza folyamatosan. Az UML egyelőre nem része a stabil kernelnek, csak a fejlesztői kernelben található meg (2.5.34-től). Szóval a beüzemeléséhez két lépésre van szükség. Először fel kell telepíteni az UML kernel részét (nem kell aggódni, nem érinti a géped fő kernelét), majd a második lépésben az UML filerendszere kerül telepítésre. A Debian felhasználók könnyű helyzetben vannak:

apt-get install user-mode-linux

(vele együtt telepítésre kerül a uml-utilities csomag is)

Ezzel kész is a kernel-rész telepítése. Amint a kernel telepítés megtörtént, fel kell telepíteni a filerendszer részt is. A filerendszer kiválasztása függhet a disztribúciódtól, számos előre elkészített filerendszert lehet letölteni az UML projekt honlapjáról: http://user-mode-linux.sourceforge.net/. A jelölések a letöltéseknél egyértelműek: "md" a Mandrake-et (www.mandrake.com), rh a Red Hat-et (www.redhat.com), toms a Tom's Linux-ot (www.toms.net/rb/), co a Conectiva-t (www.conectiva.com), és a debian a Debian-t (www.debian.org) jelöli.

A filerendszer snapshotok .bz2 formátumban vannak, ezért a

bunzip2 fileneve

paranccsal ki kell bontani őket. Alapban az UML feltételezi, hogy futtatsz X-et a gépeden. A legegyszerűbben itt tudod kipróbálni az UML-edet. Az indításához nem kell más, mint be kell gépelni az alábbit:


linux ubd0=/elérési/út/ahova/kibontottad/a/root/fst

Ezzel el is kell indulnia az UML-nek. Amint az UML elindul meg fog nyílni egy konzolpár, és az egyiken az üdvözlő képernyőt láthatod. Két login account engedélyezett alapból. Az egyik a "root" (jelszó: root), a másik pedig az "user" névre hallgat (jelszó: user). Ugye nem kell mondanom, hogy az első a password váltás ;-) ? Bár az első bejelentkezéskor a rendszer úgyis erőszakolni fogja a jelszó megváltoztatását, úgyhogy készülj fel. Egy ilyen linux rendszer egyenértékű egy újonnan telepített Linux géppel (kisebb megszorításokkal). Ha mondjuk szoftverfejlesztő vagy, és nincs szükséged a hálózatra, akkor ez pont az, amire szükséged van. Ha kell a hálózat, akkor kicsit többet kell olvasnod hozzá.

Ha a gépeden nincs telepítve X, akkor a futtatáshoz szükséges instrukciókat megtalálod itt. Például, ha az UML-t a hoszt géped első virtuális terminálján akarod futtatni akkor ilyesmit kell gépelned:

linux ubd0=/elérési/út/ahova/kibontottad/a/root/fst con=tty:/dev/tty1

Hogy is fut (látható, hogy nem kell hozzá "root" account)?

trey@sunshine:~$ linux ubd0=.uml/root_fs_debian2.2_small
Checking for the skas3 patch in the host...not found
Checking for /proc/mm...not found
tracing thread pid = 3962
Linux version 2.4.20-1um (mdz@mizar) (gcc version 3.2.3 20030221 (Debian prerelease)) #1 SMP Fri Feb 28 16:28:07 EST 2003
On node 0 totalpages: 8192
zone(0): 8192 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: ubd0=.uml/root_fs_debian2.2_small root=/dev/ubd0
Calibrating delay loop... 3469.77 BogoMIPS
Memory: 29104k available
[...]
(none):~# uname -a
Linux (none) 2.4.20-1um #1 SMP Fri Feb 28 16:28:07 EST 2003 i686 unknown

Hálózat kialakítása az UML és a hoszt gép között

Talán az első dolog, amit meg szeretnél valósítani az UML-eddel, hogy kapcsolatot alakíts ki a virtuálisan futó Linux-od, és a külvilág között. Ennek számos oka lehet. Az egyik, hogy rajta valamilyen izolált szervizt akarsz futtatni. Pl. BIND-et, ftp szervert, webszervert, vagy esetleg olyan veszélyes dolgot, mint a "freeshell" szolgáltatás. Azt szeretnéd, hogy a külvilágból a felhasználók elérjék a gépedet, oda mondjuk be tudjanak jelentkezni, azon dolgozhassanak, úgy mint az tennék egy hagyományosan telepített rendszeren, de még véletlenül se veszélyeztessék a fő rendszered biztonságát. Erre tökéletesen megfelel az UML. Ha esetleg valami nem várt dolog miatt az UML-rendszered elszáll, nem kell mást tenned, mint azt a filet, amely az UML filerendszerét adja (root fs - ha nem érted olvasd el az első részt!) visszamásolod egy backup-ból, és újra futhat a rendszered. Nem egész fél perc alatt újra működőképes rendszerrel indulhat a szolgáltatás.

Szóval kapcsolat. A modern Linux rendszereken (2.4-es kernel) az UML hálózati kapcsolathoz a az ún. TUN/TAP megoldást kell használni (ha régebbi kernelt futtatsz olvasd el a HOWTO ide vonatkozó részét. A 2.2-es kernelekhez az ethertap nevű megoldás kell). A TUN tulajdonképpen a TUNnelling-ből ered, a virtuális hálózat alapja, és a TCP/IP protokoll IP részét használja. A TAP az Ethernet része a dolognak, ha különböző hálózati csatolókat használsz, akkor különböző driverekre lesz szükséged. Az ezzel kapcsolatos információkat megtalálod itt.

Számos lehetőség van arra, hogy felállíts egy hálózatot az UML-ben. Az egyik biztonságosabb mint a többi, a másik kevésbé. Hogy neked melyik kell, azt neked kell eldöntened. Most nézzük a legegyszerűbbet. Ha úgy döntesz, hogy a rendszered komolyabb hosztolásra fogod használni, akkor olvasd el a HOWTO 6.7-es szekcióját a "TUN/TAP with a preconfigured TAP device" résznél. Ha Red Hat-ot használsz, akkor olvasd el ezt a levelet. Ezekben sokkal biztonságosabb módját mutatják be a hálózati konfigurációnak, mint amit most csinálunk.

Az első dolog amit ellenőrizned kell az a /dev/net/tun eszközön levő jogok. Alapból a jog 700, viszont ez azt jelenti, hogy csak a root tudja használni az eszközt. Meg kell változtatnod a jogokat az eszközön, vagy létre kell hoznod egy csoportot és abba beletenned azt a felhasználót, aki használhatja az UML hálózatát (és ennek a csoportnak a jogait beállítani természetesen).

Ha ezzel készen vagy, akkor be kell töltened a tun.o-t, amely nem más mint a TUN eszköz kernel modulja. Ezt legegyszerűbben az

insmod tun.o

parancs kiadásával teheted meg (vagy editálod a /etc/modules filet (debian) és beleírod kézzel, hogy minden boot-kor automatikusan töltődjön) vagy szerkeszted a /etc/modules.conf vagy /etc/conf.modules filet, ez disztribúció függő, neked kell megtalálni a megoldást (alias char-major-10-200 tun).

Eddig így indítottuk az UML-t:

linux ubd0=/elérési/út/ahova/kibontottad/a/root/fst

Most indítsuk el hálózati támogatással:

linux ubd0=/elérési/út/ahova/kibontottad/a/root/fst eth0=tuntap,,,10.0.0.5

Bootkor figyeljük az üzeneteket:

[...]
Initializing stdio console driver
Netdevice 0 : TUN/TAP backend - IP = 10.0.0.5
NET4: Linux TCP/IP 1.0 for NET4.0
[...]

Ha bebootolt az UML, nézd meg, hogy van-e loopback interfész

ifconfig

Ha nincs akkor húzd fel:

ifconfig lo 127.0.0.1 up
usermode:~# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0

Hasonlóképpen kell eljárnunk az eth0 interfésszel is:

(figyelj oda arra, hogy az eth0 IP címe nem lehet ugyanaz, mint a virtuális hoszt IP címe!)

ifconfig eth0 10.0.0.6 up

Az IP címet úgy válasszuk meg, hogy az kapcsolódhasson az átjáróhoz (jelen esetben a default gateway a 10.0.0.5)

Következhet a tesztelés:

  • pingeljük meg magunkat
  • pingeljük meg az átjárót
  • majd végül pingeljünk meg valakit az átjárón túl
  • majd ha működik az internet kapcsolatunk, akkor pingeljünk meg valakit az interneten IP cím alapján


A név szerinti hivatkozáshoz szükség van a névfeloldásra:

szerkesszük meg a /etc/resolv.conf filet, és írjunk bele egy valós névszervert.

Ha kész, akkor próbáljunk meg megpingelni valaki az interneten a neve alapján (pl. ping www.bme.hu)

Ezek után már nincs más dolgunk, mint szépen befejezni a beállításokat. Beállítani a "basic networking"-et, stb.

Ha ez kész, akkor mennie kell az APT-nak is.

Szerkesszük meg a /etc/apt/sources.list file-t, és már telepíthetünk is bármit a rendszerünkre. Tökéletes teszt platform.

Debian felhasználóknak: többen kérdezték levélben, hogy hol vannak a telepítés után az UML kernel moduljai. Ők valószínűleg nem olvasták el körültekintően a README fileokat.

trey@sunshine:/usr/share/doc/user-mode-linux$ cat README.Debian | less
[...]
Kernel modules
--------------
Modules are installed in /usr/lib/uml/modules/. The easiest way to
get to them from within UML is to use hostfs, e.g.:
mkdir -p /lib/modules/`uname -r`/kernel
mount -t hostfs -o /usr/lib/uml/modules/`uname -r`/kernel
hostfs /lib/modules/`uname -r`/kernel
depmod -a
or copy them into your root filesystem (rootstrap can do this automatically).
[...]

A modulokat értelemszerűen be kell másolni a root fs-be. A root fs elkészítéséhez használhatod a rootstrap (köszönjük meg balsa-nak az infót ;-)) nevű programot, vagy egyszerűen mount-olva a root fs-t, azt szerkesztheted:

(kernelbe legyen loopback eszköz támogatás)

mount -o loop root_fs /ahova
cd /ahova

itt szerkeszted ami kell, pl. bemásolhatod a kernel modulokat

umount /ahova

Az UML teljesítményének, hatékonyságának és biztonságának növelése

tempfs

Egyik módszer az UML sebességének növelésére, ha a host gépen a $TEMP (alapesetben /tmp) fájlrendszerben lévő fájlokat használ. Ha a $TEMP diszken van, ez nagyon lassú lehet. Célszerű ilyenkor a $TEMP -et tempfs -er tenni, ezáltal nagyban gyorsul majd az UML. A tempfs csak annyi memóriát foglal, amennyi szükséges, valamint a nem használt részei kitehetőek swap állományba.

A tempfs használatára egy példa az /etc/fstab -ból:

tmpfs  /var/run/uml  tmpfs  defaults,size=200M  0  0

Ezt a szkriptet érdemes lehet áttanulmányozni az UML futtatásához.

Hiányzó eszközök (devfs)

Előfordulhat, hogy az UML nem találja a devfs -t induláskor, ez miatt nem is tud elindulni. Ilyenkor (ha nem szeretnénk devfs -t használni), ezeket a parancsokat kell kiadni az UML -ben:

cd /dev
mkdir ubd
cd ubd
for i in 0 1 2 3 4 5 6 7; do mknod ubd$i b 98 $i; done

vagy pedig az UML indulásakor egy devfs=mount opciót kell megadni.

Több (vagy kevesebb) megnyíló konzol kellene

A megnyíló console-ok számát az /etc/inittab fájlban lehet szabályozni:

[...]
# Format:
# :::
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6
[...]

Így most kettő nyílik, de ha több kell akkor el kell távolítani a kommentet.

Host gép könyvtárának csatolasa UML-be

mount none /idemountold -t hostfs -o /egy/konyvtar/a/hostban

Teljesítményt növelő kernelpatch-ek

-skas3

Ezzel a patch -el az UML -t skas (Separate Kernel Address Space) módban lehet használni, amely nagyobb hatékonyságot nyújt. Ezt a patch -t a hoszt gép kernelébe érdemes belefordítani. Segítségével a hoszt gép kernelének semmiképpen sem kell foglalkoznia az UML processzeivel, az UML nem adja át a processz-adatokat. Ez nagyban megnöveli a teljesítményt. A -sysemu patch be lett olvasztva a -skas3 patch -ba.

Jelenlétét az UML indításakor a

Checking for the skas3 patch in the host...found
Checking for /proc/mm...found

sorok jelzik.

-sysemu

Ezt a patchet a -skas3 magába olvasztotta, a további teljesítménynöveléshez. A honlapjának tanulsága szerint a ptrace () rendszerhívás és a PTRACE_SYSCALL átvállalásával bizonyos esetekben jelentős sebességnövekedést lehetett vele elérni.

-devanon

Eredetileg a hoszt gép kernelét ezzel megpatch -elve, az UML csak annyi memóriát használ, amennyi feltétlenül szükséges neki. Azonban sajnos a patch jelenleg "broken" állapotban található, nee fejlesztik, így használata nem ajánlott.

-djc

Az UML-ben futó rendszer biztonságát növelte, hosszú ideje nem tartják karban. A használata nem ajánlott.

-um

Az UML kernelét lehet vele megpatch -elni, fokozott hatékonyságot nyújt. A mai kernelek (pl. 2.6.9) már alapból tartalmazzák, csak a következő módon kell konfigurálni és lefordítani:

make menuconfig ARCH=um
make linux modules ARCH=um

Az UML kernelének konfigurálásakor ne felejtsük engedélyezni a /proc/mm -et az UML specifikus lehetőségek kihasználásához, illetve engedélyezni a kernelben az SMP támogatást. További információhoz látogassuk meg Blaisorblade UML oldalát.

Backup készítés

Backup készítés mindig fontos. A legegyszerűbb, ha a képfájl átmásoljuk valahová. De problémáink lehetnek, ha egy működő UML root fájlrendszerével tesszük ezt, mert nem garantálható, hogy nem változik meg valami amíg másolunk. Csinálhatjuk, hogy másolás előtt leállítjuk az UML-t, másolás végeztével pedig újból indítjuk. Ez nem vészes, ha éjszaka történik a backup.

Az UML-ben implementálva van a ’stop’ és ’go’ parancs mconsole keresztül, hogy szüneteltessük és folyatassuk az UML futását. Csak simán sync-eljuk az UML-unket, majd stoppoljuk, ezután nyugodtan átmásolhatjuk a fájlrendszereket. Ha végeztünk csak továbbindítjuk az UML-t. Ime a parancsok:

$ uml_mconsole test stop
$ uml_mconsole test sysrq s
$ cp -fra --sparse=always rootfs /backup/rootfs.bak
$ uml_mconsole test go
$ nice 19 bzip2 /backup/rootfs.bak

Felhasznált irodalom, ajánlott források

Ajánlott források