====== 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