Niveau :      
Résumé : linux

Imaginez que vous soyez un simple utilisateur (un compte dans une université par exemple), alors les joies de l'administration système vous sont interdites. Heureusement une bande de jeunes hippies a décidé de faire quelque chose contre nature, essayer de transformer le noyau en simple application qui tournerait dans l'espace utilisateur. Et ça a marché, le noyau est maintenant un processus comme les autres.

On peut donc faire tourner linux sur un système existant, théoriquement un bsd ou un solaris peut même faire l'affaire, on a même trouvé des fous pour porter linux sous windows (cherchez colinux, vous trouverez).

Le noyau

Si vous êtes sous debian prenez le paquet user-mode-linux, et si vous êtes fans de la compilation de noyau :

$ make menuconfig ARCH=um
$ make ARCH=um

Et voila, il suffit de lancer linux :

$ linux

Le système

Bon, tout n'est pas si simple, il faudra bien que vous ayez un système de fichier pour ce linux. Si vous n'êtes pas root, vous devrez le préparer sur une autre machine. Il vous faut faire une image disque, soit à partir d'une installation existante, soit une nouvelle installation (par exemple avec debootstrap) :

# récupérer un disque existant
$ dd if=/dev/sda1 of=/data/image.dd

# créer un nouveau disque
$ dd if=/dev/zero of=/data/image.dd bs=1M count=512
$ mke2fs -j /data/image.dd
$ mount -o loop /data/image.dd /mnt
$ debootstrap etch /mnt
$ umount /mnt

Maintenant que nous avons notre image, c'est parti :

$ linux ubd0=/data/image.dd

Les options

Vos pouvez saupoudrer de quelques options, la liste est disponible avec la commande :

$ linux --help

Auxquelles ils faut ajouter les commandes habituelles qu'il est possible de passer au noyau à travers le bootloader. Les commandes intéressantes sont :

  • mem=64M : pour allouer une certaine quantité de mémoire au noyau, c'est toujours une bonne idée de le préciser
  • hostfs=/home/user : pour autoriser l'accès au système de fichier de la machine hôte dans l'uml, il se monte avec la commande suivante :
mount -t hostfs none /host

Le réseau pour un utilisateur

Ensuite vous voudrez sûrement le réseau, et là, beaucoup solutions pour beaucoup de problèmes différents. Commençons pas le cas où vous êtes simple utilisateur (pas root). Vous avez le choix entre utiliser la connexion de la machine hôte ou faire un tunnel vers une machine (où vous êtes root) qui vous laissera accès à une ip et un accès complet.

Prenons le premier cas, vous n'aurez le droit qu'à ce qui est autorisé à un simple utilisateur c'est-à-dire des connexions TCP et UDP (avec une sorte de nat), pas de ping (/bin/ping est suid). Si slirp n'est pas installé, vous devrez le compiler :

# réseau hôte avec slirp
$ linux ubd0=/data/image.dd eth0=slirp,,~/bin/slirp
# le réseau reste à configurer dans l'uml

Dans le cas d'un tunnel. Si vde n'est pas installé, vous devrez le compiler :

# Un switch virtuel
$ vde_switch -s /tmp/switch1
# on y connecte notre nouveau noyau
$ linux ubd0=/data/image.dd eth0=vde,/tmp/switch1
# le réseau reste à configurer dans l'uml

# Sur la machine distante où vous êtes root, l'autre bout du switch
$ vde_switch -tap
# et là nat (vous pouvez aussi faire un bridge si vous voulez)
$ iptables -t nat -A POSTROUTING -s 10.0.0.1/24 -o eth0 -j MASQUERADE

# Et on connecte les 2 switchs virtuels
# à faire dans le sens qui vous intéresse
$ dpipe vde_plug = ssh remote.machine.org vde_plug

Si vous voulez seulement faire des réseaux d'uml local, vous pouvez aussi les brancher entre eux sans accès à l'extérieur :

# Un switch virtuel connecte 3 linux
$ vde_switch -s /tmp/switch1
$ linux ubd0=/data/image1.dd eth0=vde,/tmp/switch1
$ linux ubd0=/data/image2.dd eth0=vde,/tmp/switch1
$ linux ubd0=/data/image3.dd eth0=vde,/tmp/switch1

# ou si vous ne voulez pas installer vde, uml_switch est fourni directement avec uml
$ uml_switch -s /tmp/switch1
$ linux ubd0=/data/image1.dd eth0=daemon,,,/tmp/switch1
$ linux ubd0=/data/image2.dd eth0=daemon,,,/tmp/switch1
$ linux ubd0=/data/image3.dd eth0=daemon,,,/tmp/switch1

Le réseau pour root

Si vous êtes root vous aurez plus de facilité. Vous avez le choix (en plus des 2 précédents) entre vous attribuer une ip interne et faire du nat ou vous brancher directement sur le réseau de l'hôte (bridge).

Dans tous les cas vous allez faire une interface virtuelle qui apparaîtra sur la machine hôte :

# 10.0.0.1 est l'ip de l'interface virtuelle côté hôte 
$ linux ubd0=/data/image.dd eth0=tuntap,,,10.0.0.1
# À vous de configurer l'interface dans l'uml (par exemple avec l'ip 10.0.0.2)

Je vous laisse faire le reste comme un grand.

Plus

  • Un howto plus détaillé
  • man uml_mconsole vous aidera à manipuler l'uml pendant qu'il tourne
  • Le wiki peut vous aider