UML

From YobiWiki
Jump to navigation Jump to search

Converted with HTML::WikiConverter::MediaWiki from my old phpwiki site


Comment utiliser UML

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

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
  • *; 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
  • 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"
  • Pour ne pas rebooter: ifup tap0;/etc/init.d/uml-utilities restart