Openlab 01 - Workshop Virtualisierung/UML
< Openlab 01 - Workshop Virtualisierung
Inhaltsverzeichnis |
UML - Usermode Linux
Hostsystem
Am Hostsystem muss man keine Aenderungen vornehmen. Aber es gibts zwei Punkte die man erwaehnen sollte.
SKAS-Patch
Der SKAS3-Patch wird auf den Kernel des Hostsystems angewant und bringt eine deutlich Geschwindigkeitssteigerung.
# wget http://www.finnie.org/software/uml/2.6.28-skas3.patch # patch -p0 < 2.6.28-skas3.patch
TUN-Device
Damit sich das UML-System auch mit der Aussenwelt unterhalten kann, bietet sich eine Anbindung per TAP-Device an. Falls Euer Kernel keine TUN/TAP-Devices unterstuetzt, kann dies unter:
- Device Drivers -> Network device support -> Universal TUN/TAP device driver support
aktiviert werden.
Guestsystem
Das Gastsystem besteht aus zwei Teilen, dem UML-Kernel und einem Dateisystem. UML wird in Linux als eigenstaendige Architektur gehandelt und so ist dies beim compilen mit zu uebergeben.
Kernel
Den Kernel fuer das Guestsystem kann man aus den gleichen Quellen bauen, wie auch fuer das Hostsystem. Wichtig ist das Parameter "ARCH=um" beim compilen.
Kernel downloaden
# wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2
Archiv entpacken
# tar xvfj linux-2.6.28.tar.bz2
evtl. vorhandene vorherige Compilereste loeschen
# make mrproper ARCH=um
ncurses-menu zur Konfiguration
# make menuconfig ARCH=um
Den Kernel compilen
# make linux ARCH=um
Module compilen
# make modules ARCH=um
Kernel "strippen", 25M -> 2M
# strip vmlinux
Module in "root_fs" installieren
# make modules_install ARCH=um INSTALL_MOD_PATH=../root_fs
Filesystem
Als Dateisystem kommt der Einfach halt wegen ext2 zum Einsatz. Mit entsprechendem Support im Kernel kann man natuerlich auch ein anderes FS nehmen. Statt ext2 bietet sich auch ext3 an, um das Dateisystem bei einem Absturz nicht zu gefaehrden.
Wir erzeugen eine Datei "disk.img" mit der Groesse von 1GB.
# dd if=dev/zero of=disk.img bs=1024 count=$[1024 * 1024]
Darauf legen wir ein Ext2-Dateisystem an
# mke2fs -Fq disk.img
Ein Ordner zum FS mounten
# mkdir root_fs
"disk.img" nach "root_fs" mounten
# mount -o loop disk.img root_fs
debootstrap erzeugt in "root_fs" eine Installation von Debian etch
# debootstrap etch root_fs
Die fstab editieren und die entsprechenden Dateisysteme mit mountpoints eintragen
# vi root_fs/etc/fstab # /dev/ubd0 / ext2 defaults 0 0 # proc /proc proc defaults 0 0
Falls nicht vorhanden, die "source.list" erzeugen
# touch /etc/apt/source.list
SWAP
Eine Swappartition ist optional, muss aber nicht sein.
swap-Datei erzeugen (doppelte RAM-Groesse)
# dd if=/dev/zero of=swap bs=1024 count=$[2 * 256 * 1024]
In UML:
# mkswap /dev/ubdb # swapon /dev/ubdb
Falls es das ubdb-Device nicht gibt:
# mknod /dev/ubdb b 98 16
COW - Copy-On-Write
COW ist eine Technik, mit der ein einziges UML-Image von mehreren Instanzen benutzt werden kann. Aenderungen werden dann in eine separate Datei geschrieben.
# ./vmlinux ubd0=<cow-file>,<rootfs-file> ...
Damit kann man zum Beispiel Aenderungen am System vornehmen, um ihre Auswirkungen zu testen. Wuenscht man spaeter, die Aenderungen aus der cow-file in das rootfs-Image zu uebernehmen, dann steht dazu "uml_moo" aus den "uml-utilities" bereit:
# uml_moo <cow-file> <new-rootfs-file>
Es wird also ein neues Image angelegt. Sollte man die beiden Dateien einfach so kombinieren wollen, dann reicht ein:
# uml_moo -d <cow-file>
Die Datei mit dem rootfs braucht nicht angegeben werden, da alle relevanten Daten im Header der cow-Datei vorliegen.
Beim Arbeiten mit cow-Datei muss man sehr vorsichtig sein. Kopieren darf man die Datei mit dem rootfs nur, wenn man den Zeitstempel beibehaelt (zb. mit -p).
Host-FS
Um auf das Host-FS zuzugreifen kann innerhalb von UML folgendes benutzt werden:
# mount none /host -t hostfs
oder ein einzelnes Verzeichnis (eg. /home/user):
# mount none /host -t hostfs -o /home/user
UML starten
UML wird wie ein normales Program aufgerufen.
# ./vmlinux mem=256M ubd0=disk.img ubdb=swap eth0=tuntap,,,IP
Network
Zum Netzwerken kommt TUN/TAP zu Einsatz
Hostsystem
Auf dem Hostsystem sicherstellen, dass TUN/TAP-Support vorhanden ist.
Das TAP-Device dem Nutzer <uml-user> zuweisen
# tunctl -u <uml-user>
UML im nachhinein (hotplug) eine Netzwerkkarte unterschieben
# uml_mconsole UMID config eth0=tuntap,,,IP
Wenn UML als non-root gestartet wird, muessen die Netzwerkeinstellungen per Hand gemacht werden:
# ifconfig tap0 192.168.1.16 netmask 255.255.255.255 up # bash -c echo 1 > /proc/sys/net/ipv4/ip_forward # route add -host 192.168.1.17 dev tap0 # bash -c echo 1 > /proc/sys/net/ipv4/conf/tap0/proxy_arp # arp -Ds 192.168.1.17 eth2 pub
Guestsystem
eth0 mit einer IP im Netzwerk hochfahren
# ifconfig eth0 IP+1 up
Defaultroute eintragen
# route add default gw IP
UML-Switch
Das Paket "uml-utilities" enthaelt ein Tool uml-switch, mit dem ein virtueller Switch erzeugt wird.
# uml-switch -tap <tap-device> [-hup] [-unix <file>]
Das Parameter "-hup" verwandelt den Switch in einen Hub und mit "-unix" kann man die Datei angeben, die der uml-switch benutzen soll, was sinnvoll ist, wenn man mehrere Instanzen startet.
Dem Switch wird im Hostsystem eine IP aus dem gewuenschten Bereich zugewiesen und kann so auch per NAT ein Weg ins reale Netz bieten.