Pour la première utilisation d'UML, nous allons installer quelques outils et utiliser des briques existantes (noyaux UML et systèmes de fichiers).
Ajoutez à vos favoris un lien vers The User-mode Linux Kernel Home Page. Le présent tutoriel en fait essentiellement un résumé et une traduction de ce site de référence (que j'appelerai UMLKHP par la suite). N'hésitez pas à le consulter pour aller plus loin !
Créez un répertoire UML
.
Téléchargez uml_utilities_20040406.tar.bz2 depuis UMLKHP (ou ma copie locale) et décompressez dans UML
.
En root, dans le répertoire UML/tools
créé, tapez 'make all
' puis 'make install DESTDIR=/
'.
Les outils uml_moo, uml_mconsole, uml_switch (et d'autres) sont maintenant installés dans le répertoire /usr/bin
; nous découvrirons peu à peu leur utilité.
Créez un répertoire UML/Noyaux
.
Téléchargez linux-2.4.27.bz2, décompressez-le dans UML/Noyaux
et rendez-le exécutable ('chmod +x linux-2.4.27
').
Note :
des noyaux déjà compilés sont également disponibles sur le site UMLKHP mais ils sont relativement vieux et lorsqu'on tente de les faire tourner sur RedHat 9 (entre autres), l'erreur suivante apparait : Kernel panic: outer trampoline didn't exit with SIGKILL
. Ce bug d'UML a été corrigé à partir du patch 2.4.20-4. (source : FAQ d'usermodelinux.org). Vous découvrirez dans une autre section comment construire vos propres noyaux UML.
Créez un répertoire UML/SysFich
.
Téléchargez root_fs_slack8.1.bz2 depuis UMLKHP (ou cliquez ici pour télécharger ma version locale) et décompressez-le dans le répertoire UML/SysFich
.
Placez-vous dans le répertoire UML/
et tapez 'Noyaux/linux-2.4.27 ubd0=SysFich/root_fs_slack8.1
'. La machine UML démarre et 3 fenetres correspondant à 3 consoles supplémentaires de l'UML s'ouvrent. Choisissez une des fenetres et connectez-vous comme root (pas de mot de passe) et explorez quelques instants votre machine virtuelle.
Arretez proprement la machine UML en tapant 'shutdown -h now
' (dans la fenetre où vous vous etes connecté à l'UML bien sur).
Note : si le noyau de votre hote a été patché pour supporter le mode SKAS, faire 2 "Crtl-C" dans le shell depuis lequel la machine UML a été démarrée pour récupérer la main après l'affichage du "Power down." de la machine UML.
Une manière simple pour la machine UML de partager des fichiers avec l'hote est d'utiliser le système de fichiers virtuel hostfs pour monter depuis la machine UML un répertoire de l'hote.
Démarrez une machine UML. Dans la machine UML, créez un répertoire /mnt/hote
puis tapez 'mount none /mnt/hote -t hostfs
'. Le répertoire /mnt/hote
de la machine UML correspond maintenant au répertoire racine (/
) de l'hote.
Pour en savoir plus sur les options disponibles et sur la manière de construire un noyau disposant d'hostfs, voir user-mode-linux.sourceforge.net/hostfs.html
Il est bien sur possible de faire tourner plusieurs UMLs en meme temps. Mais on ne peut pas les démarrer sur le meme système de fichiers, car celà le corromprerait (d'ailleurs, avec l'UML précédente en fonctionnement, la tentative de lancement un 'Noyaux/linux-2.4.27 ubd0=SysFich/root_fs_slack8.1
' supplémentaire se solde par un échec accompagné d'un message
VFS: Cannot open root device "ubd0" or 62:00 Please append a correct "root=" boot option Kernel panic: VFS: Unable to mount root fs on 62:00)
La première solution consiste à faire une copie du fichier root_fs_slack8.1
et de fournir cette copie pour le démarrage de la nouvelle machine UML. L'inconvénient est que si le système de fichiers est gros et que l'on doit démarrer beaucoup de machines UML, cela va prendre un espace disque considérable.
Le pilote du bloc UBD offre une autre solution : il permet d'enregistrer les écritures normalement faites sur le bloc dans un bloc séparé. Il suffit donc de partager en lecture seulement entre les différentes machines UML le système de fichiers initial et de munir chaque machine UML d'un fichier COW (Copy On Write) dans lequel elle enregistrera ses écritures. De cette manière, les données inchangées (la majorité) seront partagées et chaque UML n'aura qu'un petit fichier supplémentaire contenant ses changements. Au lancement de la machine UML, il suffit de faire précéder le nom du système de fichiers par le nom du fichier COW (si ce fichier n'existe pas dans le répertoire, il sera créé) et d'une virgule : linux ubd0=fichierCOW,systemedefichiers
Travaux pratiques :
Noyaux/linux-2.4.27 ubd0=cow01,SysFich/root_fs_slack8.1 Noyaux/linux-2.4.27 ubd0=cow02,SysFich/root_fs_slack8.1
echo "hello" > toto
').-s
de la commande ls
car un fichier COW est un vrai gruyère !)Noyaux/linux-2.4.27 ubd0=cow01,SysFich/root_fs_slack8.1
'. Le fichier toto est toujours là. Arretez la machine UML.cow01
.Attention : une fois qu'un fichier COW est créé par rapport à un système de fichiers, il ne faut plus toucher au système de fichiers (ne plus démarrer directement avec ce système de fichiers, ne pas le modifier, ne pas le déplacer).
Il est possible de fusionner les modifications enregistrées dans un fichier COW avec le système de fichiers initial en utilisant l'utilitaire uml_moo : uml_moo fichier_COW systeme_fichiers_fusion
.
Travaux pratiques :
Noyaux/linux-2.4.27 ubd0=cowA,SysFich/root_fs_slack8.1
'echo "hello" > toto
').uml_moo cowA nouveauSF
'Noyaux/linux-2.4.27 ubd0=nouveauFS
'. Le fichier toto existe.Pour plus de détails, voir la page de référence Sharing Filesystems between Virtual Machines.
Lorsqu'on lance plusieurs machines UML, il peut être pratique de leur donner un identifiant à chacune (par exemple de manière à distinguer les fenêtres qui se sont ouvertes pour la première de celles qui se sont ouvertes pour la suivante). Pour cela, il suffit ajouter une clause umid=nom_de_l-UML
au lancement.
Essayez par exemple 'Noyaux/linux-2.4.27 umid=ordi1 ubd0=nouveauSF
', vous verrez apparaître "(ordi1)" dans la barre de titre des consoles virtuelles.
Il existe un outil de gestion des machines UML, l'UML management console, permettant de piloter partiellement de l'extérieur une machine UML lancée.
Au démarrage d'une machine UML, vous voyez une ligne
mconsole (version 2) initialized on /home/galtier/.uml/oIm6Lc/mconsoleDémarrez la console de management en précisant le nom de socket qui a été créée pour communiquer avec l'UML :
uml_mconsole oIm6Lc
Note : si un identifiant a été donné au lancement de la machine UML grace à l'option umid, il suffit de préciser cet identifiant, par exemple uml_mconsole ordi1
.
Essayez les commandes suivantes (depuis la console de gestion) :
version
'proc stat
' : affiche le contenu du fichier /proc/stat
de l'UML.quit
'.
Cet outil sera surtout utile plus tard, pour ajouter une carte réseau par exemple.
Cet aspect sera couvert après les explications concernant la mise en réseau d'une machine UML.