UML
Converted with HTML::WikiConverter::MediaWiki from my old phpwiki site
Comment utiliser UML
- The User-mode Linux Kernel Home Page
- User-mode Linux Community Site
- Debian Installation Inside UML HOWTO
- User Mode Linux .co.uk
apt-get install rootstrap uml-utilities user-mode-linux user-mode-linux-doc kernel-patch-skas kernel-patch-uml umlrun
- La doc locale sera alors accessible via file:///usr/share/doc/user-mode-linux-doc/html/UserModeLinux-HOWTO.html
Ajouter l'utilisateur au groupe uml-net
rootstrap permet de créer très facilement une image:
- cd <working dir>
- cp /etc/rootstrap/rootstrap.conf .
- Editer rootstrap.conf et changer les points suivants:
fstype=ext3 interface=eth0 transport=tuntap host=10.x.x.x uml=10.1.2.3 netmask=255.0.0.0 gateway=10.0.0.8 nameserver=10.0.0.8 dist=sarge mirror=http://ftp.kulnet.kuleuven.ac.be/debian
- rootstrap <uml-rootfs>
- Si cela plante:
- Pour dépanner, éditer /usr/lib/rootstrap/modules/debian et ajouter un appel à bash avant l'exécution de debootstrap.
- S'il y a un problème de dépendance comme je l'ai déjà eu (apt-utils requires libdb4.2) alors l'ajouter à la section [debian] de rootstrap.conf, par ex. ici: include=libdb4.2
Une fois l'image faite:
- Le système de base (sarge) fait 93Mb
- Ne pas hésiter à faire des copies de l'image avant d'y chipoter ou de planter le kernel UML et devoir faire un fsck dessus :-p
Booter l'image
- linux ubd0=<uml-rootfs> eth0=tuntap,,,10.x.x.x (IP de l'hôte)
- le passwd root par défaut est paraît-il rootstrap, chez moi il n'y en avait tout simplement pas!
- uml: passwd (pour assigner un password à root)
- uml: shadowconfig on (pour utiliser /etc/shadow)
- uml: apt-get update
- uml: apt-get install umlrun-uml
Virtual hosting
- http://usermodelinux.org/modules.php?name=News&file=categories&op=newindex&catid=7
- User-Mode Linux Co-op
- UML-based pseudo-dedicated hosting service
- kernels, filesystems,...:
Divers
- Pour créer des sparse-files pour les fs: par ex. 200M
- host: dd if=/dev/zero of=sparse_file bs=1k count=1 seek=$$[200*1024]
- Pour copier un fichier et rendre sparse toute suite de zéros:
- cp -p --sparse=always <source> <dest>
- Pour ajouter de la swap:
- host: dd if=/dev/zero of=swap_file bs=1M count=1 seek=128
- Formater la swap: mkswap swap_file
- Booter l'UML avec ubd1=swap_file
- uml: swapon /dev/ubdb (et pas ubd1?!)
- Pour l'automatiser: éditer /etc/fstab et ajouter "/dev/ubdb swap swap defaults 0 0"
- l'UML créé par rootstrap utilise par défaut des xterms (il en ouvre 6)
Sur une machine ne disposant pas de X, pour pouvoir déporter les xterms via ssh -X il faut au minimum:- host: apt-get install xterm xbase-clients
- *; Pour voir la taille réelle occuppée par les sparse-files
- ls -lhs
total 220M
219M -rw-r--r-- 1 phil phil 1,0G 2004-05-25 19:13 root_fs
1,1M -rw-r--r-- 1 phil phil 129M 2004-05-05 00:08 swap_file
- ls -lhs
- *; Pour copier un rootfs à travers le réseau sans perdre le caractère "sparse" du fichier
- tar czSf root_fs.tgz root_fs
...
tar xzf root_fs.tgz
- tar czSf root_fs.tgz root_fs
- Pour partager un rootfs entre plusieurs UMLs
- On lance l'UML avec un COW (copy-on-write) ainsi le rootfs est intact et les différences sont écrites dans un fichier séparé.
- Comment "tuer" proprement un UML depuis le host?? (càd exécuter un halt dans l'UML)
- Via la Management Console
- Exemple: si on lance l'UML avec "umid=testuml"
uml_mconsole testuml halt - Ou apparemment plus propre: via "cad" (ctrl-alt-delete) après avoir modifié /etc/inittab pour transformer le reboot en shutdown:
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now -> ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now
uml_mconsole testuml cad
- UMLazy
Paramètres courants au boot de l'UML
#!/bin/bash
####### GENERAL #######
PARAMS="$PARAMS $*"
#PARAMS="$PARAMS 5" # runlevel 5
PARAMS="$PARAMS mem=32M"
PARAMS="$PARAMS umid=testuml"
#PARAMS="$PARAMS devfs=mount"
## Bizarre j'ai des probs avec les consoles si je mets devfs
## Mais c'est ptêt parce que le host n'est pas en devfs...
####### FILESYSTEM #######
#PARAMS="$PARAMS ubd0=root_fs" # This is the default
PARAMS="$PARAMS ubd1=swap_file"
#PARAMS="$PARAMS root=/dev/ubd0" # This is the default
#PARAMS="$PARAMS root=/dev/root rootflags=/ rootfstype=hostfs" # To mount directly the host /
####### CONSOLES #######
####### Default choice: "con="
####### On Debian rootstrap, 6+1 consoles for init 2 & 3, 1+1 consoles for init 4 & 5
#PARAMS="$PARAMS con=pts" # We can access pts via "screen /dev/pts/<N>" (look bootup msgs)
PARAMS="$PARAMS con=none" # Just discard all consoles
#PARAMS="$PARAMS con=xterm" # Standard way: open xterms
####### Particular choices (overwrite the default)
PARAMS="$PARAMS con0=fd:0,fd:1" # Keep main console attached to the current one (default behaviour)
#PARAMS="$PARAMS con0=xterm" # Put main console in a xterm
#PARAMS="$PARAMS con1=tty:/dev/tty8" # Redirect a login console to a regular tty (>7)
#PARAMS="$PARAMS con1=port:9000" # Redirect a login console to a TCP port
PARAMS="$PARAMS con1=pty" # look for "Virtual console N assigned device '/dev/ptypX'"
# -> screen /dev/ttypX (and NOT ptypX!!)
####### NETWORK #######
PARAMS="$PARAMS eth0=tuntap,,,10.9.160.0" # Use only TUN/TAP for host communication
# Second argument is to hook on an existing tapN
# Third argument is to assign a specific MAC address (otherwise based on the IP)
# Fourth argument is the *host* tuntap IP, if the same as eth, then it'll ARPproxy the UML
# Use switch "daemon" for purely virtual network (or "mcast" but not so good), can act as a hub also
####### SECURITY #######
# Read 6.7, not yet tried
#PARAMS="$PARAMS fake_ide"
#PARAMS="$PARAMS fakehd"
####### STARTING #######
echo "Starting: linux $PARAMS"
####### To start as user umltest in a screen session
#screen -S testuml -d -m su - umltest -c "cd /home/umltest ; linux $PARAMS"
####### To start in a screen session, detach immediately (and hook later via "screen -r testuml")
screen -S testuml -d -m linux $PARAMS
####### To start directly from where you are
#linux $PARAMS
Virtual hosting:
En bref, on peut démarrer un UML par exemple ainsi:
- screen -S testuml -d -m linux mem=32M umid=testuml ubd1=swap_file con=none con0=fd:0,fd:1 con1=pty con2=pty eth0=tuntap,,,10.9.160.0
Puis on peut s'accrocher à la console de boot ainsi:
- screen -r testuml
Ou à une des 2 consoles activées:
- screen /dev/ttyp0
- screen /dev/ttyp1
Et on peut arrêter l'UML de l'extérieur ainsi:
- uml_mconsole testuml cad
Depuis l'UML
On peut "monter" n'importe quel répertoire (/ par défaut) du host pour autant que le noyau UML ait été compilé avec CONFIG_HOSTFS=y/m:
- mount none /mnt/home -t hostfs -o /home
Honeypot
Si on veut que qqs devenu root dans l'UML ne puisse faire des dégâts sur l'hôte, il faut veiller à qqs points:
- recompiler l'UML sans hostfs
- ôter tout ce qui n'est pas strictement nécessaire au bon fonctionnement de l'UML.
- activer le log tty:
compiler l'UML avec CONFIG_TTY_LOG=y
ajouter aux params de l'UML:
tty_log_fd=3 3>log-testuml.txt
Si on veut cacher le fait que notre UML est un UML il faut veiller à qqs points:
- cat /etc/mtab -> oups!
Créer un /dev/hda1 et éditer /etc/fstab et /etc/mtab - cat /proc/cmdline -> oups!
Lancer honeypot.pl dans le rép de l'UML (depuis le host)
mount none /proc -t hppfs - ôter mount, dmesg, etc
- etc etc, il y a encore plein d'indices subtils qui permettent de détecter que l'on est dans un UML
Apache-SSL
Pour installer Apache SSL dans l'UML:
- apt-get install apache-ssl
Mais lors de mon essai l'installation échoua apparemment car il faut absolument un mot de passe pour le CAcert.
J'utilise alors d'autres scripts pour générer les certificats nécessaires et les place dans /etc/apache-ssl/ssl.
Je modifie httpd.conf:
- ServerName www.teuwen.org
- SSLCACertificateFile /etc/apache-ssl/ssl/cacert.pem
- SSLCertificateFile /etc/apache-ssl/ssl/wildcard_teuwen_org.crt
- SSLCertificateKeyFile /etc/apache-ssl/ssl/wildcard_teuwen_org.key
J'essaye de lancer à la main apache-ssl et je contrôle si tout va bien (/etc/init.d/apache-ssl start)
J'arrête apache-ssl puis poursuis l'installation:
- apt-get -f install
Lorsqu'il veut générer un nouveau certificat, cancel.
Pour activer le module proxy:
- modules-config apache-ssl enable libproxy
Pour activer le module alias (pour les redirect):
- modules-config apache-ssl enable mod_alias
Personnalisation:
- Changer de hostname:
Editer /etc/hostname, /etc/hosts et /etc/mailname - Penser à mettre un passwd à root
Pour enlever exim:
- apt-get remove exim4-base exim4-config exim4-daemon-light
Kernel 2.6?
Apparemment si on a une distro dans l'UML qui fait usage des nouveaux threads posix, il faut enlever les librairies.
Et ça a l'air d'être le cas avec Sarge.
[ -d /lib/tls ] && mv /lib/tls /lib/tls.disable
Après ça on peut booter un 2.6. Il risaue d'y avoir aussi aas probs de mem avec hostfs si on l'utilise intensivement.
Pour régler l'heure:
- apt-get install timezoneconf
- dpkg-reconfigure -p low timezoneconf
- apt-get install ntpdate
- ntpdate ntp.ulg.ac.be
Pour configurer le réseau avec le démon switch
cf /usr/share/doc/uml-utilities/README.Debian
- Ajouter à /etc/network/interfaces:
auto tap0 iface tap0 inet static address 192.168.1.1 netmask 255.255.255.0 tunctl_user uml-net
- Configurer uml_switch pour qu'il utilise cette interface
- éditer /etc/default/uml-utilities et activer
UML_SWITCH_OPTIONS="-tap tap0"
- éditer /etc/default/uml-utilities et activer
- Pour ne pas rebooter: ifup tap0;/etc/init.d/uml-utilities restart