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