Linuxhotel Wiki

Wie ging das nochmal?

Benutzer-Werkzeuge

Webseiten-Werkzeuge


fortgeschrittene:user-mode-linux

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 1) ist das nicht mehr nötig, der Host-Kernel muß nicht mehr angepasst werden 2). 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 3) auf den default-Werten gelassen. Für Athlon 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 <<FSTAB > etc/fstab
# <file system> <mount point>   <type>  <options>               <dump>  <pass>
/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 4) Probleme 5) 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 6) 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

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 gast_system_bauen erzeugte debian-sarge-root.img

Einmalige Schritte mit root-Rechten

Das Netzwerk wird wie unter 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 <<START > $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

1)
getestet mit 2.6.14
3)
mit Ausnahme von Processor family erst ab Kernel Versionen höher 2.6.15, die aber die oben erwähnten anderen Probleme machen
4)
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
6)
selbst die braucht man nicht, man kann den Kernel ja auch ohne Module nutzen
fortgeschrittene/user-mode-linux.txt · Zuletzt geändert: 2007/06/15 10:55 (Externe Bearbeitung)