Virtualisation uml rootfs
From UnixWiki
Pour utiliser votre noyau, vous aurez besoin d'un système sur lequel démarrer. Il faudra donc installer un système, le support étant un fichier contenant l'image d'une partition. Nous allons donc préparer un fichier, le formater, y extraire un système, et l'adapter pour que le noyau UML fonctionne correctement.
Contents |
[edit] Préparation du fichier
Nous devrons choisir la taille de la partition virtuelle. Dans cet exemple, nous prendrons 1500 Mo:
dd if=/dev/zero of=umlrootfs count=1500 bs=1M
Nous allons formater cette partition avec mkreiserfs, car ce système a l'avantage d'être rapide, économique en place, mais vous pouvez naturellement choisir d'utiliser un autre système de fichiers. Dans ce cas, vous devrez penser à adapter le fichier /etc/fstab par la suite:
mkreiserfs -f umlrootfs
Pour accéder au système de fichiers, nous allons le monter:
mkdir -p /mnt/umlfs mount -o loop umlrootfs /mnt/umlfs
[edit] Extraction du système
Nous allons copier tous les fichiers qui composent un système linux. Dans cet exemple, nous avons choisi d'utiliser un système minimal qui sert de base à l'installation d'un système Gentoo. Vous pouvez le télécharger depuis un Miroir Gentoo. Il existe des versions de ce système pour différents processeurs. a l'heure ou cet article est écrit, la dernière version pour les processeurs de type x86 est distribuée dans le fichier releases/x86/2005.1-r1/stages/x86/stage3-x86-2005.1-r1.tar.bz2.
Il va donc falloir extraire ce système:
tar xfjp stage3-x86-2005.1-r1.tar.bz2 -C /mnt/umlfs
Vérifiez que le système se trouve bien à la racine du dossier /mnt/umlfs, sinon déplacez les fichiers de la façon suivante:
mv /mnt/umlfs/mnt/gentoo/* /mnt/umlfs
Si le noyau UML que vous avez compilé s'accompagne de modules, vous devrez à votre système, en les copiant dans le dossier /lib/modules:
cp -a /lib/modules/2.6.15.1-fduml03 /mnt/umlfs/lib/modules/
Vous pouvez utiliser la commande chroot pour travailler sur ce système de façon naturelle, comme si vous aviez démarré dessus:
chroot /mnt/umlfs /bin/bash
Rappelons que chroot, qui agit uniquement sur le shell dans lequel vous vous trouvez demande au noyau de considérer que la racine du système est /mnt/umlfs. Ainsi, quand vous demandez le fichier /bin/ls, le noyau ira en réalité lire /mnt/umlfs/bin/bash. C'est un moyen simple et très puissant d'unix pour travailler sur un système que l'on veut mettre au point, mais qui sert aussi à sécuriser des programmes en réduisant le périmètre d'action d'un programme.
Une fois que vous êtes entré dans l'environnement chrooté, n'oubliez pas de lancer la commande passwd pour définir le mot de passe du compte root du système invité.
[edit] Adaptation du système
Le système que nous avons extrait a été préparé pour fonctionner normalement, et pose quelques problèmes si on l'utilise directement avec un noyau UML. Voici quelques modifications que vous devrez effectuer pour qu'il fonctionne correctement. Attention, toutes ces opérations sont à effectuer sur le système accessible via /mnt/umlfs, et non pas sur votre système principal.
Commencez par éditer le fichier /etc/fstab, avec des commandes telles que "nano /etc/fstab" ou "vim /etc/fstab". La partition principale du système est accessible par le périphérique /dev/ubda". Modifiez la ligne correspondant à la racine du système, ce qui donnera par exemple ceci:
/dev/ubda / reiserfs noatime 0 1 proc /proc proc defaults 0 0 shm /dev/shm tmpfs nodev,nosuid,noexec 0 0
Dans le cas ou vous auriez besoin d'autres partitions, vous pouvez y accéder par les périphériques /dev/ubdb, /dev/ubdc, etc.... Voici par exemple la ligne à ajouter pour avoir une partition de swap:
/dev/ubdb swap swap defaults 0 0
Ensuite, éditez le fichier /etc/inittab pour supprimer les accès inutiles à certains terminaux. Dans le groupe de lignes qui commencent par c1, c2, ... c6, ne laissez que la première entrée (c1), et ajoutez un dièze devant les autres lignes pour les désactiver:
c1:12345:respawn:/sbin/agetty 38400 tty1 linux #c2:2345:respawn:/sbin/agetty 38400 tty2 linux #c3:2345:respawn:/sbin/agetty 38400 tty3 linux #c4:2345:respawn:/sbin/agetty 38400 tty4 linux #c5:2345:respawn:/sbin/agetty 38400 tty5 linux #c6:2345:respawn:/sbin/agetty 38400 tty6 linux
Supprimez certains services qui peuvent produire des plantages au démarrage, et qui sont inutiles dans le cas d'un système UML. C'est la cas des services consolefont et keymaps avec la gentoo:
rc-update del consolefont default rc-update del keymaps default
Enfin, désactivez l'accès à la bibliothèque tls qui pose problème. Cela n'empêchera naturellement pas le système de fonctionner normalement:
mv /lib/tls /lib/tls.disabled
[edit] Optimisations du système
Un script d'initialisation ralentit considérablement le démarrage du système. Pour éviter ce problème, éditez le fichier /etc/init.d/modules, et faites le remplacement suivant:
Remplacez ceci:
ebegin "Calculating module dependencies"
/sbin/modules-update &>/dev/null
eend $? "Failed to calculate dependencies"
par cela:
if [ /etc/modules.d -nt /etc/modules.conf ]
then
ebegin "Calculating module dependencies"
/sbin/modules-update &>/dev/null
eend $? "Failed to calculate dependencies"
else
einfo "Module dependencies are up-to-date"
fi
