====== User-Mode-Linux Installation ====== ===== Linuxhotel UMLs für Debian ===== Linuxhotel UML-Images unter Debian Sarge oder Etch nutzen ==== Benötigte Pakete ==== Debian Sarge: aptitude install uml-utilities screen xterm Debian Etch: aptitude install uml-utilities screen xterm user-mode-linux Leider fehlt bei Debian Sarge (3.1) das Paket 'user-mode-linux'. Aber in Debian Etch (4.0) ist das Paket enthalten, und läßt sich auch problemlos in Debian Sarge einbinden: === Paket 'user-mode-linux' aus Debian Sarge unter Debian Etch installieren === ''/etc/apt/sources.list'': deb http://debian/debian etch main contrib non-free deb http://debian/debian-security etch/updates main contrib non-free ''/etc/apt/preferences'': Package: user-mode-linux Pin: release a=testing Pin-Priority: 500 Package: * Pin: release a=testing Pin-Priority: 40 aptitude update aptitude install user-mode-linux ==== Image runterladen ==== Im Linuxhotel erstellte tgz-Datei im Verzeichnis /srv auspacken oder: Verzeichnis für UML erstellen und für eigenen Nutzer vorbereiten mkdir /srv/uml cd /srv/uml chown nutzer /srv/uml Innerhalb des Linuxhotel Netzwerks Debian-Sarge UML Image und Skript laden wget http://debian/uml/debian-sarge-root.img.gz wget http://debian/uml/copy-uml.sh chmod +x copy-uml.sh Auspacken: gunzip debian-sarge-root.img.gz Wie man ein solches Image selbst erstellt ist grob unten unter der Überschrift gast_system_bauen beschrieben ==== Netzwerk einrichten ==== ''/etc/network/interfaces'': auto tap0 iface tap0 inet static address 10.0.0.1 netmask 255.255.255.0 network 10.0.0.0 broadcast 10.0.0.255 pre-up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE tunctl_user uml-net ''/etc/network/options'': ip_forward=yes Virtuelles tap0 Interface starten: sysctl -w 'net.ipv4.ip_forward=1' ifup tap0 ''/etc/default/uml-utilities'': UML_SWITCH_OPTIONS="-tap tap0" UML_SWITCH_USER="uml-net" uml-switch neu starten: /etc/init.d/uml-utilities restart //Achtung: Die Reihenfolge ist wichtig. Erst das tap-device starten, dann den uml-switch neu starten// ==== starten ==== Als normaler Nutzer virtuelle Maschiene ''ldap1'' erzeugen und starten: cd /srv/uml ./copy-uml ldap1 ./ldap1.sh ===== Linuxhotel UMLs für SuSE ===== Linuxhotel UML-Images unter SuSE nutzen, getestet unter SuSE 10.2 ( 10.0 und 10.1 liefen auch ) // Vorsicht Baustelle: Anleitung für SuSE noch nicht reboot-fest ;-( // ==== Benötigte Pakete ==== uml-utilities yast2-uml === SuSE 10.1 und 10.2 === Unter openSuSE 10.1 und 10.2 ist uml_switch kaputt ( keine TUNTAP Unterstützung einkompiliert ). Daher habe ich nicht das Orginal genommen, sondern gebastelt: erst das Paket aus den Quellen neu gebaut, installiert, dann das binary uml_switch noch mal erzeugt und damit das bestehende aus dem Paket überschrieben: Als root: Pakete installiert: ncurses-devel readline-devel glibc-devel gcc Als nutzer: cd mkdir -p $HOME/rpm/{BUILD,RPMS,SOURCES,SPECS,SRPMS} echo "%_topdir $HOME/rpm" >> $HOME/.rpmmacros wget http://download.opensuse.org/distribution/SL-10.1/inst-source/suse/src/uml-utilities-20040406-11.src.rpm rpm -ihv uml-utilities-20040406-11.src.rpm cd rpm/SPECS rpmbuild -ba uml-utilities.spec cd ../SOURCES tar xjf uml_utilities_20040406.tar.bz2 cd tools/uml_router/ make clean make Als root: rpm -e uml-utilities rpm -ihv /home/xxx/rpm/RPMS/i586/uml-utilities-20040406-11.i586.rpm cp -p /home/xxx/rpm/SOURCES/tools/uml_router/uml_switch /usr/bin/uml_switch Entscheidend ist, daß beim Bauen die Datei ''/usr/include/linux/if_tun.h'' existiert und benutzt wird. Wahrscheinlich ist es gar nicht nötig, das Paket neu zu bauen, das uml_switch Binary reicht ... ==== Image runterladen ==== Im Linuxhotel erstellte tgz-Datei im Verzeichnis /srv auspacken oder: Verzeichnis für UML erstellen und für eigenen Nutzer vorbereiten mkdir /srv/uml cd /srv/uml chown nutzer /srv/uml Innerhalb des Linuxhotel Netzwerks Debian-Sarge UML Image und Skript laden wget http://debian/uml/debian-sarge-root.img.gz wget http://debian/uml/copy-uml.sh chmod +x copy-uml.sh Auspacken: gunzip debian-sarge-root.img.gz ==== Netzwerk einrichten ==== useradd uml-net tunctl -u uml-net -t tap0 ifconfig tap0 10.0.0.1 broadcast 10.0.0.255 netmask 255.255.255.0 test -e /etc/sysconfig/SuSEfirewall2.pre-uml || perl -pi.pre-uml -e ' s/^\s* FW_DEV_DMZ="[^"]*" /FW_DEV_DMZ="tap0"/x s/^\s* FW_ROUTE="[^"]*" /FW_ROUTE="yes"/x s/^\s* FW_MASQUERADE="[^"]*" /FW_MASQUERADE="yes"/x ' /etc/sysconfig/SuSEfirewall2 rcSuSEfirewall2 restart mkdir -p /var/run/uml-utilities/ startproc -g users /usr/bin/uml_switch -tap tap0 -unix /var/run/uml-utilities/uml_switch.ctl chown uml-net:users /dev/net/tun chown uml-net /var/run/uml-utilities/ chmod ug+rw /dev/net/tun chmod ug+rw /var/run/uml-utilities/uml_switch.ctl ==== Passenden Kernel besorgen ==== Unter http://packages.debian.org/testing/misc/user-mode-linux i386-Paket runterladen alien --to-tgz user-mode-linux_2.6.18-1um-1_i386.deb tar xzf user-mode-linux-2.6.18-1um.tgz ./usr/bin/linux.uml mv usr/bin/linux.uml /srv/uml/ oder per 'mount -o loop' aus dem Image rauskopieren ==== xterm passend hinbiegen ==== ln -s /usr/bin/xterm /usr/local/bin/x-terminal-emulator ==== starten ==== Als normaler Nutzer virtuelle Maschiene ''ldap1'' erzeugen und starten: cd /srv/uml ./copy-uml ldap1 In der neuen Datei ''ldap1.sh'' ''linux'' durch ''./linux.uml'' ersetzen. vi ldap1.sh Und los: ./ldap1.sh screen -x ldap1 //Viel Glück ...// ====== Host Kernel bauen ====== Benötigte Pakete: kernel-patch-skas kernel-package kernel-source-2.6.8 libncurses5-dev cpp cpp-3.3 dpkg-dev gcc gcc-3.3 patch libc6-dev libncurses5-dev linux-kernel-headers make fakeroot Aktueller Kernel von http://www.kernel.org Mit einem modernem Gast-Kernel (( getestet mit 2.6.14 )) ist das nicht mehr nötig, der Host-Kernel muß nicht mehr angepasst werden (( http://lwn.net/Articles/142494 )). Wer es trotzdem machen möchte: So wird in einen ganz normalen Debian Kernel der bei Debian Sarge mitgelieferte skas-patch integriert: tar xjf kernel-source-2.6.8.tar.bz2 cd kernel-source-2.6.8 make oldconfig make-kpkg --rootcmd fakeroot --initrd --append_to_version -3-k7-skas --revision iw1 --added-patches skas buildpackage Heraus kommen .deb-Pakete, die man einfach installieren kann: dpkg -i ../kernel-source-2.6.8-3-k7-skas_iw1_all.deb Evtl. muß man sich jetzt noch um dem Bootloader kümmern. Dann neu booten. update-grub bzw. lilo ====== Gast Kernel bauen ====== Es ist zu empfehlen, einen Debian Mirror oder einen apt-proxy zu Nutzen, sonst muß man neben den genannten Paketen auch noch das komplette Gast-System aus dem Netz laden. Für debian sarge und etch empfehle ich den fertigen User Mode Linux Kernel aus debian etch ( z.Zt: testing http://packages.debian.org/testing/misc/user-mode-linux ) Selber bauen: cd /usr/src wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.7.tar.bz2 tar xjf linux-2.6.14.7.tar.bz2 cd linux-2.6.14.7 make-kpkg clean make mrproper ARCH=um cp arch/um/defconfig .config vi .config CONFIG_HOSTFS=m CONFIG_MAGIC_SYSRQ=y An dieser Stelle könnte man hostfs auch rauslassen, damit es nicht ganz so einfach ist aus dem UML-Käfig auszubrechen. Trotzdem sollte UML im produktivem Einsatz nur in einer chroot-Umgebung laufen. make oldconfig ARCH=um Die hier auftauchenden Fragen habe ich (( mit Ausnahme von //Processor family// erst ab Kernel Versionen höher 2.6.15, die aber die oben erwähnten anderen Probleme machen )) auf den default-Werten gelassen. Für Athlon [[ http://comments.gmane.org/gmane.linux.uml.devel/7793?set_cite=hide | geht es wohl grade nicht]] make-kpkg --rootcmd fakeroot --arch um --append_to_version -k7 --revision iw1 buildpackage dpkg -i ../kernel-uml-2.6.14.7_iw1_i386.deb ====== Gast System bauen ====== ===== Debian ===== Eigentlich gibt es dafür den Befehl rootstrap. Ich habe mit der Version aus Debian Sarge aber vor einiger Zeit keine gute Erfahrung gemacht, daher hier die Anletung wie man das selbst macht: Beim nachfolgenden debootstrap sollte man einen geeigneten Debian-Mirror oder apt-proxy angeben. ==== Dateisystem und swap anlegen ==== mkdir /var/lib/uml cd /var/lib/uml dd if=/dev/zero of=debian-sarge-root.img bs=1M count=0 seek=1024 dd if=/dev/zero of=swap.img bs=1M count=0 seek=256 /sbin/mkfs.ext3 -F debian-sarge-root.img /sbin/mkswap swap.img mkdir /mnt/uml mount -o loop debian-sarge-root.img /mnt/uml ==== Debian System installieren und vorkonfigurieren ==== cd /mnt/uml debootstrap sarge . http://debian/debian cd dev mknod ubd0 b 98 0 mknod ubd1 b 98 16 mknod ubd2 b 98 32 mknod ubd3 b 98 48 mknod ubd4 b 98 64 mknod ubd5 b 98 80 mknod ubd6 b 98 96 mknod ubd7 b 98 112 cd .. cat < etc/fstab # /dev/ubd0 / ext3 defaults 1 1 proc /proc proc defaults 0 0 none /dev/pts devpts gid=5,mode=620 0 0 /dev/ubd1 swap swap defaults 0 0 FSTAB perl -i -p -e 's/(ca:\d+:ctrlaltdel:\/sbin\/shutdown.*)-r/$1-h/' etc/inittab perl -i -p -e 's/^(([3456]):\d+:respawn:.*tty\2$)/#$1/' etc/inittab cp /etc/apt/sources.list etc/apt chroot /mnt/uml mount /proc base-config ==== Thread Local Storage Problem ( gelöst ) ==== In User-Mode-Linux gab es bis Kernel 2.6.14 (( In der Kombination Gastkernel 2.6.14.7, Hostkernel //mit Skas// gab es keine Probleme, //ohne Skas// schon. Ab Kernel 2.6.15 scheint das Problem gelöst zu sein: ftp://ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.15 //[PATCH] uml: maintain own LDT entries// )) Probleme (( siehe http://user-mode-linux.sourceforge.net/faq.html )) mit dem Thread Local Storage (TLS) . Lösung: ausschalten. Entweder in dem man das Verzeichnis ''/lib/tls'' umbenennt und für spätere Software-Upgrades sperrt: export LD_ASSUME_KERNEL=2.4.1 mkdir /lib/tls.off cd /lib/tls for f in *; do dpkg-divert --rename --local --divert /lib/tls.off/$f --add /lib/tls/$f; done unset LD_ASSUME_KERNEL ==== Kernel ==== Kernel im Gastsystem installieren: eigentlich braucht (( selbst die //braucht// man nicht, man kann den Kernel ja auch ohne Module nutzen )) man nur die Module. Will man die aber ordentlich über die Paketverwaltung bekommen, muß man das ganze UML-Kernel-Paket installieren. aptitude install module-init-tools user-mode-linux Leider liegen die Kernel-Module jetzt im Verzeichnis ''/usr/lib/uml/modules''. Ich verschiebe sie auf Debian-Art nach ''/lib/modules'': cd /usr/lib/uml/modules for i in `find 2.6.18 -type d`; do mkdir -p /lib/modules/${i#./} ; done for i in `find 2.6.18 -type f`; do dpkg-divert --rename --local --divert /lib/modules/${i#./} --add /usr/lib/uml/modules/${i#./} ; done ==== aufräumen ==== Nun kann man noch weitere Konfigurationen in der chroot-Umgebung vornehmen, und sie dann verlassen: umount /proc logout umount /mnt/uml ==== Netzwerk ==== ''/etc/network/interfaces'': auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 10.0.0.2 netmask 255.255.255.0 network 10.0.0.0 broadcast 10.0.0.255 gateway 10.0.0.1 ''/etc/hostname'': uml ''/etc/resolv.conf'': search villa.local linuxhotel.de nameserver 192.168.1.7 nameserver 192.168.1.1 ===== Fedora ===== http://toast.debian.net/~may/umlproject/install.html ====== Erster Test ====== linux umid=uml mem=64M ubd0=debian-sarge-root.img ubd1=swap.img con0=fd:0,fd:1 con=pts eth0=daemon,,unix,/var/run/uml-utilities/uml_switch.ctl Wichtige Meldungen: Checking for the skas3 patch in the host...found oder UML running in SKAS0 mode .. Netdevice 0 : daemon backend (uml_switch version 3) - unix:/var/run/uml-utilities/uml_switch.ctl .. Virtual console 1 assigned device '/dev/pts/4' .. Man kann sich nun mit dem Befehl screen /dev/pts/4 am User-Mode-Linux als root anmelden Mit dem Befehl ''uml_mconsole uml cad'' kann man den UML-Rechner herunterfahren ====== UML als Testumgebung einrichten ====== ===== Benötigte Pakete ===== Debian: uml-utilities screen xterm Außerdem braucht man die folgenden, wie oben erzeugten Pakete ... kernel-image-2.6.8-3-k7-skas_iw1_i386.deb kernel-uml-2.6.14.7-uml_iw1_i386.deb ... und ein Dateissystemimage, z.B. das unter [[user-mode-linux#gast_system_bauen]] erzeugte ''debian-sarge-root.img'' ===== Einmalige Schritte mit root-Rechten ===== Das Netzwerk wird wie unter [[user-mode-linux#netzwerk_einrichten]] beschrieben eingerichtet. Weiterhin benötigt man ein Verzeichnis in einer Partition mit ausreichend Platz für mehrere Kopien der Dateisystemimages. cd /var/lib/uml dd if=/dev/zero of=swap.img bs=1M count=0 seek=256 mkswap swap.img Das Dateisystemimage sollte man vor Veränderungen schützen. Änderungen werden im Betrieb nur an cow-Dateien vorgenommen. chgrp uml-net . chmod g+w . chown root:uml-net debian-sarge-root.img swap.img chattr +i debian-sarge-root.img usermod -aG uml-net nutzerxy ===== Testumgebung starten ===== Jetzt kann man als normaler Benutzer cow-Dateien vom root-Image und Kopien von der swap-Datei anlegen. Das folgende Skript ''copy-uml.sh'' dient dem Anlegen eines neuen Satzes dieser Dateien ( root-Image, swap-Datei und start-skript ): #!/bin/bash ORIGROOT=debian-sarge-root.img ORIGSWAP=swap.img if test -z "$1"; then echo usage: $0 uml-name exit 1 fi if test ! -r $ORIGROOT then echo Datei $ORIGROOT fehlt exit 1 fi if test ! -r $ORIGSWAP then echo Datei $ORIGSWAP fehlt exit 1 fi uml_mkcow $1.cow $ORIGROOT cp --sparse=always $ORIGSWAP $1.swap cat < $1.sh #!/bin/bash BASENAME=\`basename \$0\` UML=\${BASENAME%%.sh} screen -S \$UML -d -m linux umid=\$UML mem=64M ubd0=\$UML.cow ubd1=\$UML.swap con0=fd:0,fd:1 con=xterm eth0=daemon,,unix,/var/run/uml-utilities/uml_switch.ctl START chmod +x $1.sh Testsystem erzeugen: chmod +x copy-uml.sh ./copy-uml.sh uml Testsystem starten: ./uml.sh ====== Tips & Tricks ====== ===== Image vergrößern ===== z.B. auf 2GB: resize2fs -p vishnu-ubd2.img 2G ===== Image unter SuSE starten ===== Image und kernel-binary in ein Verzeichnis kopieren yast -i uml-utilities ./linux-2.6.14.7 ubd0=vishnu-ubd0.img con=xterm ====== Links ====== * http://www.q-vadis.net/index.php?mID=stories&lng=de&art=14 * http://www.q-vadis.net/index.php?mID=stories&lng=de&art=13 * http://uml.openconsultancy.com/umld/ * http://uml.harlowhill.com/index.php/Chroot * http://www.math.ucla.edu/~jimc/documents/uml-install-suse.html