Semestrální projekt

do SPS

User Mode Linux (UML) 

Využití pro virtuální laboratoř 

Autoři 

Jiří Mikošek, mik343

Tomáš Kučera, kuc274

Úvod

UML je jedna varianta překladu jádra Linuxu, která ho umožňuje spouštět jako normální program z již běžícího systému, a to i vícekrát. UML se mohou spouštět pod neprivilegovaným uživatelem a ze strany hostitelského systému se tváří jako "normální" procesy. Uvnitř UML vidíme pouze své procesy, jsme v něm uzavřeni a prakticky neexistuje cesta ven do hostitelského systému. Samozřejmě poznáme, že se jedná o UML, protože jsou některé výpisy z adresáře /proc trochu jiné. Velkou výhodou je, že můžeme dát například uživateli práva root, ale ta jsou platná pouze uvnitř UML.

K čemu je možné UML využít

  1. Ladění procesů
  2. Bezpečné zkoušení nového jádra systému, i jeho překlad a ladění
  3. Odzkoušení nových distribucí linuxu
  4. Výukové účely
  5. Je možné simulovat jiný hardware, než na počítači fyzicky máme. Můžeme používat buď pouze něco nebo naopak i virtuální zařízení.

Cíl tohoto projektu

V tomto projektu máme za úkol připravit UML tak, aby jej bylo možno použít ve virtuální laboratoři. Ta slouží studentům VŠB-TUO k procvičování konfigurace síťových prvků prostřednictvím sítě internet.

V laboratoři by bylo nutné mít kromě routerů a switchů také mnoho pracovních stanic pro úplné odzkoušení konfigurace studentem. Tato varianta řešení je ale zbytečně nákladná. Proto bude použit jen jeden fyzický stroj, na kterém poběží více virtuálních UML najednou. Počítač bude mít několik síťových karet, přičemž každá instance UML má mít přístup právě k jedné z nich. Správa virtuální stanice UML bude probíhat pomocí další síťové karty (v obrázku označena eth10).

Obr. 1: Ilustrační obrázek

(Bude podrobně popsán v následujícím textu - kapitola Síťování.)

uml

Příprava UML

Máme několik možností - můžeme použít již přeložené a připravené jádro, které je dostupné na internetu, nebo si můžeme jádro zkompilovat sami. Pak jej samozřejmě lépe přizpůsobíme svým požadavkům. Podobně je tomu i se souborovým systémem. Ten můžeme rovněž získat například z internetu, nebo si jej sestavit sami.

V dalším textu budeme popisovat druhý postup, tedy kompilaci vlastního jádra a přípravu vlastního souborového systému.

Nejprve potřebujeme zdrojové soubory jádra. Ty se dají stáhnout ze stránek www.kernel.org

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.13.tar.bz2

Zkoušeli jsme i verzi 2.4, ale ta nemá podporu pro UML. Toto jádro bychom museli patchovat. Většina novějších jader má však již podporu UML v sobě.

Velikost zdrojových souborů komprimovaných v tomto archivu je zhruba 50 MB. Ne všechno ale budeme v UML potřebovat.

Ty rozbalíme a dostaneme adresářovou strukturu, začínající například linux-2.6.16.13

bunzip2 -d linux-2.6.16.13.tar.bz2

tar -xvf linux-2.6.16.13.tar

Teď můžeme začít s přípravou na kompilaci jádra.

Kompilace jádra 

Na začátku jsme vytvořili symbolický odkaz - softlink na adresář linux-2.6.16.13 se jménem linux.

Příkaz je tento:

ln -s linux-2.6.16.13 linux

Pak přejdeme pomocí vytvořeného softlinku do daného adresáře:

cd linux

Použijeme příkaz make menuconfig ARCH=um, který umožňuje vybrat, co se má do jádra kompilovat, jak má být jádro kompilováno, pro který typ procesoru a další. Tím se vygeneruje soubor .config (je přiložen k tomuto projektu), který je pak základním konfiguračním souborem pro kompilaci.

Co jsme vybrali: 

Nechali jsme vše, co jsme považovali za nutné, či využitelné pro podporu sítě. Jádro jsme kompilovali do jednoho souboru, nepoužívali jsme moduly. Bylo by to složitější a v tomto případě by to asi nemělo smysl.

Kompilace začne po zadání příkazu

make vmlinux ARCH=um

Tento proces trvá asi deset minut a může se téměř kdykoli vyskytnout chyba. Některé součásti jádra vyžadují totiž přítomnost jiných. Proto je vhodné mít jasno v tom, co do konfiguračního souboru dáváme. (To je ovšem dost problém.) My jsme jádro z důvodů chyb museli kompilovat mnohokrát.

Sestavení a úprava souborového systému pro UML

Pro souborový systém instance UML potřebujeme 4GB místa na disku.

Nejprve potřebujeme image soubor. Ten sestavíme příkazem

dd if=/dev/zero of=/uml/ubuntu.img bs=1M count=1 seek=4096

V příkazu jsme uvedli, že bude mít velikost 4 GB a bude se jmenovat ubuntu.img.

Teď prázdný image soubor připravíme pro instalaci souborového systému (určíme typ - ext3).

mkfs.ext3 -c /uml/ubuntu.img

Pak image soubor připojíme do adresáře /mnt a následně do něj nainstalujeme souborový systém Ubuntu pomocí příkazu debootstrap.

mount /uml/debian.img /mnt -o loop

debootstrap --arch i386 breezy /mnt/ http://archive.ubuntulinux.org/ubuntu

Jde pouze o minimální základ systému, který příkaz debootstrap stáhl z internetu a nainstaloval do adresáře /mnt, kde máme připojen image soubor. Protože nemá téměř nic nastaveno, přepneme se do něj pomocí příkazu

chroot /mnt

Dále použijeme příkaz mount -n /proc , který přípojí adresář bez zápisu do /etc/mtab. Je vlastně vytvořen pouze „pro jedno použití“. Neuloží se do souborového systému a po spuštění v UML bude jeho obsah nahrazen odpovídajícími soubory systému UML.

V souborovém systému je nutné upravit hlavně soubor /etc/fstab, aby obsahoval toto:

/dev/ubd/0   /    xfs     defaults 0 0

/dev/ubd/1  none  swap    defaults 0 0

/proc       none  proc    defaults 0 0

/dev/pts    none  devpts           0 0

/dev/shm    none  shmfs            0 0

/sys        none  sysfs            0 0

V UML také vytvoříme virtuální zařízení, která slouží k emulaci pevného disku a jeho jednotlivých partition.

mkdir /dev/ubd

cd /dev/ubd

for i in 0 1 2 3 4 5 6 7; do mknod $i b 98 $[ $i * 16 ]; done

Pak ještě upravíme práva pro celý nově vytvořený adresář:

chmod 777 -R /dev/ubd

Jakmile jsme hotovi s úpravami, použijeme opět chroot a pak odpojíme systém z mnt.

Spuštění UML instance

Pro spuštění musíme mít nainstalovány UML utility. Ty je možno najít na stránkách user-mode-linux.sourceforge.net/dl-vd-server.html. Dále potřebujeme na hostitelském systému funkční telnet server.

UML instance spouštíme jako běžný proces, udáváme parametry, které určují chování UML systému. Důležitý parametr je číslo portu, na kterém bude poslouchat telnet pro zpřístupnění konzoly dané instance.

Volitelně můžeme zadat soubor na swapování a případně soubor pro ukládání uživatelských změn a nastavení. Pak se původní image souborového systému nezmění a může být používán více UML stroji současně.

Příkaz na spuštění může vypadat třeba takto:

/home/uml/vmlinux mem=64M \
udb0=/home/uml/debian_cow.img,/home/uml/debian.img \
ubd1=/home/uml/uml_swap.img con1=pty con2=port:9001 \
eth0=tuntap,,,10.0.1.1

/home/uml/vmlinux - cesta ke spustitelnému UML jádru
mem=64M - velikost paměti, kterou přidělím UML
udb0=/home/uml/debian_cow.img,/home/uml/debian.img - cesta k souborovým systémům, debian_cow.img je souborem, do kterého se ukládají pouze změny, debian.img je image celého souborového systému
ubd1=/home/uml/uml_swap.img - souborový systém swap
con1=pty con2=port:9001 - tímto řekneme, na kterém portu bude naslouchat telnet server
eth0=tuntap,,,10.0.1.1 - používáme tuntap rozhraní. Tomuto virtuálnímu rozhraní v hostitelském systému přidělíme IP adresu. Rozhraní bude svázáno s virtuálním rozhraním eth0 v UML.

Do UML se tedy dá přihlásit pomocí telnetu (IP adresa je v našem příkladu adresa eth10 - obr. 2). Další možnost, jak spravovat instanci UML přímo ze stroje, na kterém běží, je pomocí konzoly, která se otevře při startu UML (Jen v případě, že je k dispozici XServer). Pro každou instanci můžeme mít otevřeno současně více takovýchto konzol. Jejich počet je definován v souboru /etc/inittab v UML.

 

Pomocí předchozího příkazu pro spuštění se vytvoří virtuální rozhraní tap s číslem, které nemůžeme přesně ovlivnit. Je závislé na tom, zda už nějaké tap rozhraní existuje a jaké je jeho nejvyšší číslo. Takovéto rozhraní vzniklo díky parametru "eth0=tuntap,,,10.0.1.1". Pro praktické využití se nám může hodit definovat číslo tap rozhraní přesně. Toho docílíme změnou popisovaného parametru následujícím způsobem (čísla rozhraní můžeme vybrat libovolně, v dalším textu však budou používána právě tyto):

eth0=tuntap,tap2001,,

Jak je vidět, sami určujeme, které tap rozhraní má být s danou UML instancí spojeno. Tady narozdíl od předchozího způsobu ani nemusíme uvádět IP adresu a dané tap rozhraní se vytvoří bez problémů.

Zbývá vyřešit ještě jeden problém: Jak již bylo zmíněno, je tap2001 rozhraní svázáno s odpovídajícím eth rozhraním v UML. A to dokonce tak, že pokud je virtuální eth0 ve stavu down, není tap2001 vůbec dostupné. Vytvoří se až poté, co v UML nastavíme rozhraní eth0 do stavu up. Jakmile v UML rozhraní eth0 opět deaktivujeme, tap2001 bude zrušeno. (Po spuštění UML instance je její virtuální rozhraní eth0 ve stavu down a nemá nastavenou IP adresu.) To by nám dělalo problém při použití bridge.

Nejdříve tedy použijeme příkaz:

tunctl -t tap2001

Pak rozhraní ještě aktivujeme:

ifconfig tap2001 up

Tímto rozhraní sami připravíme a UML už jej bude jen používat. Tzn. nebude nic vytvářet ani rušit. Když teď spustíme UML s parametrem tap2001, budeme mít možnost pracovat s tímto tap rozhraním nezávisle na uživateli UML.

Pro použití ve virtuální laboratoři potřebujeme, aby uživatel, který je připojen pomocí telnetu k UML, jej mohl konfigurovat (pro použití v síti) stejným způsobem, jako skutečný počítač. Toho se dá dosáhnout, jestliže v hostitelském systému vytvoříme bridge a do něj umístíme zařízení tap2001 a vybranou fyzickou síťovou kartu (např. eth0). Bridge může dostat novou IP adresu, tu ovšem z UML nevidíme a pro naše účely ani není nutná. Jsme schopni se přímo připojit k ostatním prvkům sítě pouze pomocí IP adresy nastavené v UML (obr. 2).

Postup:

Nejprve vytvoříme nový bridge s názvem br0

brctl addbr br0

Pak bridge "nastartujeme".

ifconfig br0 up

Na tomto bridge dále můžeme vypnout protokol Spanning Tree.

brctl stp br0 off

A poslední důležitou věcí je přidání vybraných rozhraní do právě vytvořeného bridge.

brctl addif br0 eth0

brctl addif br0 tap2001

Obr. 2: Podrobné znázornění systému s jedním UML

fyzicke a virtulani zarizeni

Popis

vysvetlivky

Závěr

Tento text je pouze krátký návod, jak použít UML pro simulaci více nezávislých počítačů s vlastní síťovou kartou. Je určen pro použití ve virtuální laboratoři. Na tuto práci bude navazovat diplomová práce Jiřího Mikoška.

Pro další informace doporučujeme například následující odkazy:

user-mode-linux.sourceforge.net/uses.html

www.abclinuxu.cz/clanky/recenze/virtualni-linuxovy-server-user-mode-linux

abclinuxu.cz