UserModeLinux
Compilation du noyau utilisateur
C'est très simple: on compile le noyau Linux avec le paramètre ARCH=um
pour chaque commande.
wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2 tar xjf linux-2.6.17.13.tar.bz2 cd linux-2.6.17.13
make defconfig ARCH=um make xconfig ARCH=um # facultatif; pensez à activer HOSTFS si besoin make ARCH=um strip linux make modules_install ARCH=um INSTALL_MOD_PATH=uml-modules/
Cf. Building from source chez UML.
Des options que j'active:
- MAGIC_SYSRQ: active l'équivalent de Alt+ImprÉcr, utilisable depuis uml_mconsole
- HOST_2G_2G: contourne un problème de certains noyaux hôte (cf. plus bas)
- HOSTFS: possibilité de monter des répertoires de la machine hôte - attention à la sécurité)
- STATIC_LINK: compiler le noyau en statique (pas de dépendance sur des bibliothèques partagées .so)
Il y a également des patches à essayer [1]:
- hôte/host:
- skas3 - meilleures performances (dossier skas3-2.6)
- invité/guest:
- exec support: permet de lancer des commandes shell avec uml_mconsole (ex: [2])
Construction du système de base
On se propose de construire et de lancer un système UML sans aucun accès root.
Vraisemblablement, ce n'est pas possible facilement. Cela est dû au manque d'outil en mode utilisateur pour travailler directement sur des systèmes de fichiers ext3.
Tentative 1
Essayons de créer un système complet, sans faire d'image, et en possédant tous les fichiers:
La dernière version de debootstrap propose une variante fakechroot qui permet de l'utiliser sans accès root:
export PATH=/usr/local/sbin:/usr/sbin:/sbin:$PATH # pour trouver la commande 'chroot' fakechroot /usr/sbin/debootstrap --variant=fakechroot sarge sarge-uml/ http://localhost/mirrors/debian /usr/src/linux-2.6.17.13/linux root=/dev/root rootflags=/home/sylvain/tests/uml/debian/sarge-uml/ rootfstype=hostfs
Résultat: cela ne fonctionne pas, à mon avis parce que dans ce cas précis sarge-uml/dev est un lien symbolique vers /dev.
Tentative 2
Essayons à partir d'une image UML déjà opérationnelle. Le principe est de monter le système de fichier hôte avec hostfs, puis de faire un mount -o loop
depuis le UML sur l'image disque à bootstrap-per. Cela permet de monter l'image sans avoir de privilèges super-utilisateur.
mount none host/ -t hostfs -o /home/sylvain/tests/uml/debian cd host/ mkdir loop/ mount image -o loop loop/ ls loop/ # -> bin boot dev etc ...
rootstrap fonctionne apparemment sur ce principe. Je n'ai pas réussi mais je n'ai pas beaucoup cherché.
En mode root
Faute de mieux, utilisons sudo:
mkdir loop/ # image de 1Go, à trous (espace disque progressif) dd if=/dev/null of=image count=0 bs=1G seek=1 # on formatte en ext3 /sbin/mkfs.ext3 -F image sudo mount image loop/ -o loop sudo debootstrap sarge loop/ http://192.168.1.60/mirrors/debian # configuration de la console: sudo grep -v tty loop/etc/inittab > inittab.work sudo echo "1:2345:respawn:/sbin/getty 38400 console linux" >> inittab.work sudo mv inittab.work loop/etc/inittab # configuration réseau: cat <<'EOF' > interfaces.work auto lo iface lo inet loopback EOF sudo mv interfaces.work loop/etc/network/interfaces # fake mtab and fstab cat <<'EOF' > fstab.work proc /proc proc defaults 0 0 /dev/ubda / auto defaults,errors=remount-ro 0 1 EOF sudo mv fstab.work loop/etc/fstab sudo umount loop/
Optimiser la taille de l'image pour la distribuer
Une image UML contient souvent des zones vides, où il n'y a pas encore de fichiers.
L'image ci-dessus réserve 1Go mais n'en occupe que 230Mo grâce à la création d'image "à trous" (sparse en anglais).
$ ls -lh image -rw-r--r-- 1 sylvain sylvain 1,0G 2006-09-18 15:55 image $ du -sh image 234M image
df -h
dans UML indique une utilisation de 178Mo, donc on doit pouvoir encore améliorer (comment?). Éviter e2defrag
, qui est obsolète et corrompt les systèmes de fichier. Piste: copier les fichiers dans une nouvelle image et supprimer l'ancienne - défragmentation à la volée.
D'autres méthodes (dd sur /dev/zero par exemple) n'en tiennent pas compte.
Pour optimiser une image "pleine":
cp --sparse=always image image.sparse
Pour envoyer une image par le réseau en respectant les trous:
tar cSf image.tar image # S pour "sparse"
Réseau
Imaginez un câble virtuel qui relie la machine hôte et la machine UML, une carte carte réseau virtuelle à chaque bout. Chaque carte a une adresse IP, mais comme sur un réseau classique, les deux cartes ne doivent pas avoir la même adresse.
Mode root avec tuntap
host# sudo /usr/src/linux ubda=sarge-debootstrap eth0=tuntap,,,192.168.1.101
Notez les messages d'UML indiquant la mise en place d'une interface tuntap tap0
, une route pour accéder à la machine virtuelle, et un partage de connexion pour que la machine virtuelle puisse accéder au réseau extérieur.
Puis dans UML:
uml# ifconfig eth0 192.168.1.201
Mode semi-root avec tuntap
Pour utiliser tuntap, il faut créer à l'avance (et en mode root) une interface tap0 et lui assigner une adresse IP.
# tunctl -u sylvain Set 'tap0' persistent and owned by uid 1000
Puis il faut donner des droits aux utilisateurs non-privilégiés d'utiliser tuntap (en mode root aussi):
chmod 666 /dev/net/tun
C'est une solution efficace mais qui nécessite plusieurs étapes de préconfiguration en mode root, accompagné de permissions lâches sur tuntap.
Mode semi-root avec tuntap (2)
Mettre l'utilisateur concerné dans le groupe uml-net
. Ce groupe a accès au programme setuid /usr/lib/uml/uml_net
, qui peut lancer et configurer des interfaces tuntap. La sécurité du procédé n'est pas grande (l'utilisateur peut créer de nouvelles interfaces réseau et perturber iptables par exemple), mais est facile à mettre en place.
host# /usr/src/linux ubda=sarge-debootstrap umid=deb eth0=tuntap,,,10.10.10.10 uml# ifconfig eth0 10.10.10.11 uml# route add default gw 10.10.10.10
Note: la configuration automatique côté hôte nécessite uml_net (partage de connexion, route vers la machine UML...).
Mode utilisateur avec slirp
Lancer UML avec une interface slirp, en utilisant le binaire 'fullbolt' (qui s'affranchit de la limitation débit de 10ko/s dans slirp 'classique'):
host# /usr/src/linux ubda=sarge-debootstrap umid=deb eth0=slirp,,/usr/bin/slirp-fullbolt
Dans UML, quelques étapes spécifiques à slirp sont nécessaires:
# Configurer l'interface sur 10.2.0.15 (IP de choix pour slirp) ifconfig eth0 10.2.0.15 # Utiliser la redirection DNS 10.0.2.3 echo "nameserver 10.0.2.3" > /etc/resolv.conf # Ajouter une route par défaut vers eth0: route add default dev eth0
Note: ping
ne fonctionne pas, car il nécessite un accès root (sur l'hôte, ping est d'ailleurs souvent setuid).
/etc/network/interfaces
Voici comment configurer automatiquement le réseau au démarrage d'UML, dans son fichier interfaces
:
auto lo iface lo inet loopback auto eth0 iface eth0 inet static # eth0=tuntap,,,10.10.10.1 # address 10.10.10.10 # netmask 255.0.0.0 # gateway 10.10.10.1 # eth0=slirp,,/usr/bin/slirp-fullbolt address 10.2.0.15 netmask 255.0.0.0 dns-nameservers 10.0.2.3 up route add default eth0
(dns-nameservers nécessite le paquet resolvconf)
Autre solution pour gérer automatiquement les DNS: installez un serveur DNS dans l'UML, et évitez ainsi de vous faire suer à déterminer ceux de l'hôte. In-dé-pen-dan-ce ;) À moins que vous n'ayez besoin du serveur DNS de votre réseau interne.
Lancer un UML en tâche fond
./linux ubda=... con=null &
Liens
- The User-mode Linux Kernel Home Page: lien direct vers la nouvelle version du site - on s'y retrouve mieux
- Running Debian inside of Debian with User-Mode Linux
- Tutoriel User Mode Linux: avec introduction à SKAS et réseau
- Slirp dans le UML HOWTO.
- Livre officiel: écrit par l'auteur, ce livre est sous licence 'Open Publication' et n'en utilise visiblement aucune des options non-libres. C'est donc un livre libre que l'on peut recommander d'acheter :) La page de présentation indique que les livres de la série "Bruce Perens' Open Source" sont tous sous cette licence et sont publiés au format électronique au bout de 6 mois. J'ai personnellement récupéré un exemplaire au format .chm mais je ne connais pas son origine. J'en dirai plus sur le contenu quand je l'aurai parcouru ;)
- WebTTY: lancez une instance UML sur le serveur distant et tapez du Bash intéractivement dans un navigateur web :)
- Émulation sur doc.cliss21.com
Dépannage
Kernel panic - not syncing: start_userspace : expected SIGSTOP, got status = 256
Cf. http://www.mail-archive.com/user-mode-linux-devel@lists.sourceforge.net/msg03414.html
Votre noyau (hôte) est, si j'ai bien compris, mal configuré. Recompilez-le ou utilisez-en un autre.
Vous pouvez également activer CONFIG_HOST_2G_2G dans la configuration du noyau UM.