<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [

  <!ENTITY title "Guide simplifié pour QEMU">
  <!ENTITY kernelversion "2.6.16.5">
  <!ENTITY qemuversion "0.8.0">
  <!ENTITY kqemuversion "0.7.2">
  <!ENTITY qemuctlversion "2006042300">
  <!ENTITY qemuifupversion "2006041700">
  
]>

<book lang="fr">
<bookinfo>
  <title>&title;</title>
  <author>
    <firstname>Emmanuel</firstname>
    <surname>Saracco</surname>
    <affiliation>
      <address>
        <email>esaracco@free.fr</email>
        <email>esaracco@users.labs.libre-entreprise.org</email>
        <email>esaracco@easter-eggs.com</email>
      </address>
    </affiliation>
  </author>
  <revhistory>
    <revision>
      <revnumber>1.1</revnumber>
      <date>2006-04-22</date>
      <authorinitials>es</authorinitials>
      <revremark>
        Ajout d'une partie sur le partage d'un même réseau virtuel entre plusieurs images. Remplacement de l'exemple de création d'image pour gentoo par un exemple pour FreeBSD.
      </revremark>
    </revision>
    <revision>
      <revnumber>1.0</revnumber>
      <date>2006-04-17</date>
      <authorinitials>es</authorinitials>
      <revremark>Version initiale.</revremark>
    </revision>
  </revhistory>
  <legalnotice>
    <para>
      <citetitle>&title;</citetitle>
    </para>
    <para>
      Permission is granted to copy, distribute and/or modify this document
      under the terms of the GNU Free Documentation License, Version 1.2
      or any later version published by the Free Software Foundation;
      with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
      Texts.
    </para>
    <para>
      A copy of the license is available on the World Wide Web at 
      <ulink url="http://www.gnu.org/licenses/fdl.html">http://www.gnu.org/licenses/fdl.html</ulink>.
    </para>
  </legalnotice>
  <copyright>
    <year>2006</year>
    <holder>Emmanuel Saracco</holder>
  </copyright>
</bookinfo>

<preface id="introduction">
  <title>Introduction</title>
  <para>
    Malgré toutes les documentations déjà écrites à propos de QEMU, beaucoup d'utilisateurs ont encore du mal à le manipuler correctement, notamment lorsqu'il s'agit d'en configurer la couche réseau. C'est pourquoi j'ai décidé d'écrire ce tutoriel, en espérant qu'il éclairera un peu plus l'utilisation de ce fabuleux outil.
  </para>
  <para>
    <variablelist>
      <varlistentry>
        <term>Définition <ulink url="http://fr.wikipedia.org/wiki/QEMU">Wikipédia</ulink></term>
        <listitem><para><emphasis>QEMU est un « émulateur de système » : c'est un logiciel qui permet de faire tourner un ou plusieurs systèmes d'exploitation (ou seulement des processus) sur un système d'exploitation déjà installé sur la machine.</emphasis></para></listitem>
      </varlistentry>
    </variablelist>
  </para>
  <para>
    QEMU peut être utilisé un peu à toutes les sauces. Que ce soit pour tester un système, une distribution, expérimenter la programmation noyau, faire des tests de sécurité sans mettre en péril votre environnement de travail, adapter vos développements à d'autres environnements etc.
  </para>
  <para>
    Ce tutoriel se veut être un guide <emphasis>pratique</emphasis>, donc si vous cherchez des explications techniques et théoriques sur QEMU, le mieux est dans un premier temps de vous référer aux documentations rédigées par Fabrice Bellard, son auteur. Reportez vous également vers <xref linkend="liens-utiles" /> pour plus d'informations.
  </para>
  <para>
    Nous traiterons ici de la création et de la gestion de l'image d'une distribution Debian de GNU/Linux.
  </para>
</preface>

<chapter id="configuration-du-noyau">
  <title>Configuration du noyau</title>
  <para>
    Afin de pouvoir configurer correctement le réseau pour les images QEMU nous avons besoin d'une configuration noyau particulière. En plus de votre configuration habituelle, les éléments importants sont les suivants <footnote><para>Nous utilisons ici un noyau &kernelversion;.</para></footnote>:
  </para>
  <para>
   <screen><computeroutput>
Networking  ---&gt;
  Networking options  ---&gt;
    &lt;*> Packet socket
    [*] TCP/IP networking
    [*]   IP: advanced router
    [*] Network packet filtering (replaces ipchains)  ---&gt;
      Core Netfilter Configuration  ---&gt;
        &lt;*&gt; Netfilter netlink interface
        &lt;M&gt;   "conntrack" connection tracking match support
      IP: Netfilter Configuration  ---&gt;
        &lt;*&gt; Connection tracking (required for masq/NAT)
        &lt;M&gt;   Connection tracking netlink interface (EXPERIMENTAL)
        &lt;M&gt;   FTP protocol support
        &lt;M&gt;   IRC protocol support
        &lt;M&gt;   NetBIOS name service protocol support (EXPERIMENTAL)
        &lt;M&gt; IP tables support (required for filtering/masq/NAT)
Network device support  ---&gt;
  [*] Network device support
  &lt;M&gt; Universal TUN/TAP device driver support
   </computeroutput></screen>
  </para>
  <para>
    Une fois la configuration modifiée, recompilez le noyau et redémarrez dessus.
  </para>
</chapter>

<chapter id="installation">
  <title>Installation</title>
  <para>
    QEMU est un logiciel sous licence Libre (<ulink url="http://www.gnu.org/licenses/licenses.html">GPL and LGPL</ulink>). Il peut très bien être utilisé tel quel. Néanmoins la vitesse d'exécution des systèmes et applications sur les composants émulés est lente et vous en viendrez rapidement à vous demander s'il n'existe pas un moyen d'accélérer un peu tout ça.
  </para>
  <para>
    Il existe effectivement un moyen, mais il faut en passer par un brique propriétaire. Il s'agit d'un module noyau à charger avant le lancement de QEMU. Cet accélérateur est développé par Fabrice Bellard lui-même et permet un réel gain au niveau des performances. Nous l'utiliserons donc dans ce tutoriel.
  </para>
  <sect1 id="kqemu-l-accelerateur">
    <title>KQEMU - L'accélérateur</title>
    
    <warning>
      <para>
        Si vous décidez d'utiliser l'accélérateur, toutes les opérations de compilation doivent se faire avec une version de GCC inférieure à 4. Ceci vaut également pour votre noyau.
      </para>
    </warning>

    <para>
      L'émulateur peut être téléchargé à partir de <ulink url="http://fabrice.bellard.free.fr/qemu/download.html">cette page</ulink>. N'hésitez pas à prendre la toute dernière version disponible.
    </para>
    <para>
      L'installation de se module est on ne peut plus simple. Il suffit de télécharger l'archive et de la décompresser sous le répertoire de QEMU. Pour la suite, reportez vous vers <xref linkend="qemu-l-emulateur" />.
    </para>
    <para>
      <screen><userinput>
$ cd /usr/src/qemu-&qemuversion;/
$ wget http://fabrice.bellard.free.fr/qemu/kqemu-&kqemuversion;.tar.gz
$ tar zxvf kqemu-&kqemuversion;.tar.gz
      </userinput></screen>
    </para>
    <para>
      Une fois que le module a été compilé et installé avec QEMU il est nécessaire d'effectuer quelques changements dans la configuration de <literal>udev</literal> afin que le device <filename class="devicefile">/dev/kqemu</filename> soit créé avec les droits nécessaires. Sur un système Debian, éditez le fichier <filename>/etc/udev/permissions.rules</filename> et y ajouter les lignes suivantes:
    </para>
    <para>
      <screen><userinput>
# kqemu
KERNEL=="kqemu",                MODE="0666"
     </userinput></screen>
    </para>
    <para>
      Suite à cette modification, redémarrez <literal>udev</literal> avec <userinput>/etc/init.d/udev restart</userinput>.
    </para>
    <para>
      A présent vous pouvez charger le module manuellement, en tant qu'utilisateur <literal>root</literal>:
    </para>
    <para>
      <screen><userinput>
# depmod -ae
# modprobe kqemu major=0
# dmesg | tail -4
QEMU Accelerator Module version 1.2.0, Copyright (c) 2005 Fabrice Bellard
This is a proprietary product. Read the LICENSE file for more information
Redistribution of this module is prohibited without authorization
KQEMU installed, max_instances=4 max_locked_mem=129300kB.
      </userinput></screen>
    </para>
    <para>
      Pour éviter le chargement manuel de ce module par la suite, vous pouvez demander au système de le charger automatiquement. Sur une Debian, il faudra ajouter une ligne <userinput>kqemu</userinput> dans le fichier <filename>/etc/modules</filename> et créer un fichier <filename>kqemu</filename> sous <filename class="directory">/etc/modprobe.d/</filename> <footnote><para>Sur d'autres distributions, ou bien si vous utilisez un noyau 2.4.x vous devrez peut-être plutôt créer ce fichier sous <filename class="directory">/etc/modutils/</filename> et lancer un utilitaire comme <userinput>update-modules</userinput>.</para></footnote>:
    </para>
     <para>
      <screen><userinput>
# echo "qkemu" >> /etc/modules
# echo "options kqemu major=0" > /etc/modprobe.d/kqemu
# update-modules
      </userinput></screen>
  </para>
  </sect1>
  <sect1 id="qemu-l-emulateur">
    <title>QEMU - L'émulateur</title>
    <para>
      L'émulateur peut être téléchargé à partir de <ulink url="http://fabrice.bellard.free.fr/qemu/download.html">cette page</ulink>. N'hésitez pas à prendre la toute dernière version disponible.
    </para>
    <para>
      <screen><userinput>
$ cd /usr/src/
$ wget http://fabrice.bellard.free.fr/qemu/qemu-&qemuversion;.tar.gz
$ tar zxvf qemu-&qemuversion;.tar.gz
      </userinput></screen>
    </para>
    <para>
      Une fois l'archive décompressée, allez dans le répertoire de qemu et lancez un <userinput>./configure --help | less</userinput> pour visualiser les différentes options de compilation disponibles. Les options intéressantes sont les suivantes:
    </para>
    <para>
      <screen><computeroutput>
  --prefix=PREFIX          install in PREFIX []
  --disable-kqemu          disable kqemu build
  --enable-adlib           enable Adlib emulation
  --enable-coreaudio       enable Coreaudio audio driver
  --enable-alsa            enable ALSA audio driver
  --enable-fmod            enable FMOD audio driver
  --enabled-dsound         enable DirectSound audio driver
      </computeroutput></screen>
    </para>
    <para>
      Nous n'utiliserons dans ce tutoriel que les options <option>--prefix</option> (indication de la base du répertoire d'installation) et <option>--enable-alsa</option> (activation de la couche ALSA).
    </para>
    <para>
      Ensuite, lancez la commande <userinput>configure</userinput> avec les options qui vous semblent les plus appropriées à votre configuration et à ce que vous voulez faire avec QEMU:
    </para>
    <para>
      <screen><userinput>
grinch@badiou:/usr/src/qemu-&qemuversion;$ ./configure --prefix=/usr --enable-alsa
Install prefix    /usr
BIOS directory    /usr/share/qemu
binary directory  /usr/bin
Manual directory  /usr/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path       /usr/src/qemu-&qemuversion;
C compiler        gcc
Host C compiler   gcc
make              make
host CPU          i386
host big endian   no
target list       i386-user arm-user armeb-user sparc-user ppc-user mips-user mipsel-user i386-softmmu ppc-softmmu sparc-softmmu x86_64-softmmu mips-softmmu arm-softmmu
gprof enabled     no
static build      no
SDL support       yes
SDL static link   no
mingw32 support   no
Adlib support     no
CoreAudio support no
ALSA support      yes
DSound support    no
FMOD support      no
kqemu support     yes

KQEMU Linux module configuration:
kernel sources    /lib/modules/&kernelversion;/build
kbuild type       2.6
grinch@badiou:/usr/src/qemu-&qemuversion;$
      </userinput></screen>
    </para>
    <para>
      N'oubliez pas de vous reporter vers <xref linkend="kqemu-l-accelerateur" /> avant de compiler QEMU au cas ou vous voudriez utiliser l'accélérateur KQEMU.
    </para>
    <para>
      Ensuite, lancer <userinput>make</userinput> puis <userinput>su -c "make install"</userinput> pour compiler et installer QEMU.
    </para>
  </sect1>
  <sect1 id="arborescence-locale">
    <title>Arborescence locale</title>
    <para>
      Je vous conseille de créer une arborescence dédiée à toutes vos images et scripts QEMU. L'arborescence décrite dans ce tutoriel correspond à celle attendue par le script de gestion qui l'accompagne: <ulink url="http://esaracco.free.fr/downloads/qemuctl"><application>qemuctl</application></ulink>.
    </para>
    <para>
      Voici l'arborescence à construire:
    </para>
    <para>
      <screen><userinput>
$ mkdir -p ~/qemu/{debian,fedora,freebsd}/src
      </userinput></screen>
    </para>
    <para>
      Nous avons là les répertoires <filename class="directory">debian/</filename>, <filename class="directory">fedora/</filename> et <filename class="directory">freebsd/</filename> qui contiendront les différents fichiers nécessaires à la gestion de systèmes spécifiques (dans le cas présent il s'agit respectivement d'une distribution GNU/Linux <ulink url="http://www.debian.org">Debian</ulink>, d'une distribution GNU/Linux <ulink url="http://fedora.redhat.com">Fedora</ulink>, et d'un système <ulink url="http://www.freebsd.org">FreeBSD</ulink>). Chacun de ces 3 répertoires contient un répertoire <filename class="directory">src/</filename> qui n'est pas vraiment nécessaire mais permet l'archivage des ISO utilisées pour la création des images QEMU.
    </para>
  </sect1>
</chapter>

<chapter id="creation-de-l-image">
  <title>Création de l'image</title>
  
  <warning>
    <para>
      QEMU ne sait pas installer un système à partir de plusieurs images ISO.
    </para>
  </warning>

  <para>
    QEMU ne travaille pas directement sur votre système de fichier, ou plutôt il a besoin d'un fichier contenant l'image d'un système. Il nous faut donc tout d'abord créer cette image et y installer un système.
  </para>
  <para>
    QEMU peut installer des images à partir du lecteur de CDROM ou bien directement à partir d'un fichier ISO de CD ou de DVD. Lorsque vous installez une distribution fedora par exemple, pensez à le faire à partir de l'ISO DVD et pas à partir des ISO CD, sinon vous ne pourrez pas dépasser la première demande de changement de CD de l'installeur.
  </para>
  <para>
    La façon la plus simple de créer une image et de lancer l'installation d'un système GNU/Linux Debian est de procéder comme suit <footnote><para>Il n'est pas nécessaire d'utiliser un DVD pour installer GNU/Linux Debian. Il suffit de <ulink url="http://www.debian.org/CD/netinst/">télécharger une ISO minimale</ulink> et de continuer l'installation via le réseau.</para></footnote>:
  </para>
  <para>
    <screen><userinput>
$ cd ~/qemu/debian/
$ qemu-img create debian.img 5G
$ cd src/
$ wget http://cdimage.debian.org/debian-cd/3.1_r1/i386/iso-cd/debian-31r1a-i386-netinst.iso
$ cd ../
$ qemu -localtime -m 256 -k fr -net nic -boot d -hda debian.img -cdrom src/debian-31r1a-i386-netinst.iso
    </userinput></screen>
  </para>
  <para>
    Durant l'installation, n'hésitez pas à choisir de configurer le réseau via DHCP, nous reviendrons par la suite sur cette configuration pour forcer le système de l'image à utiliser un réseau local spécifique et nous lui allouerons une adresse IP fixe.
  </para>
</chapter>

<chapter id="configuration-du-reseau">
  <title>Configuration du réseau</title>
  <para>
    Comme vous avez déjà dû le remarquer si vous avez déjà fait quelques essais avec QEMU, le réseau se configure rapidement à l'aide de l'option <option>-net user</option> <footnote><para>Cette option est utilisée par défaut pour la configuration du réseau.</para></footnote>. Cependant cette configuration simple, si elle permet bien au système QEMU d'accéder au réseau, ne permet pas au système hôte d'y accéder.
  </para>
  <para>
    Pour que le système QEMU s'intègre pleinement au réseau local il faut lui créer son propre réseau virtuel et router le traffic à l'aide d'une interface réseau virtuelle.
  </para>
  <para>
    Assurez-vous d'avoir bien suivi les conseils de configuration du noyau <xref linkend="configuration-du-noyau" /> avant de commencer.
  </para>
  <para>
    Nous choisirons dans ce tutoriel de configurer un réseau <literal>192.168.4.0/24</literal>. Nous aurons donc la configuration suivante:
  </para>
  <para>
    <table><title>Réseau virtuel</title>
      <tgroup cols="2" colsep="1" rowsep="1">
        <thead>
          <row>
            <entry>Nom</entry>
            <entry>Valeur</entry>
          </row>
        </thead>
        <tbody>
          <row>
            <entry>Interface</entry>
            <entry>tap0</entry>
          </row>
          <row>
            <entry>Réseau</entry>
            <entry>192.168.4.0/24</entry>
          </row>
          <row>
            <entry>Adresse hôte</entry>
            <entry>192.168.4.1</entry>
          </row>
          <row>
            <entry>Adresse image</entry>
            <entry>192.168.4.2</entry>
          </row>
        </tbody>
      </tgroup>
    </table>
  </para>
  <para>
    Dans un premier temps il nous faut configurer le système pour qu'il puisse charger correctement le module qui nous permettra de mettre en place un pont. Sur un système Debian, éditez le fichier <filename>/etc/udev/permissions.rules</filename> et y ajouter les lignes suivantes:
  </para>
  <para>
    <screen><userinput>
# tun
KERNEL=="tun",                MODE="0666"
    </userinput></screen>
  </para>
  <para>
    Suite à cette modification, redémarrez <literal>udev</literal> avec <userinput>/etc/init.d/udev restart</userinput>.
  </para>
  <sect1 id="configuration-de-l-hote">
    <title>Configuration de l'hôte</title>
    <para>
      QEMU va automatiquement chercher à exécuter un fichier <filename>/etc/qemu-ifup</filename> au démarrage. Cela va nous permettre de configurer le réseau de l'image.
    </para>
    <para>
      Nous allons donc créer un fichier <filename>/etc/qemu-ifup</filename> (téléchargeable <ulink url="http://esaracco.free.fr/downloads/qemu-ifup">ici</ulink>), dont le contenu sera le suivant:
    </para>
    <para>
      <screen><computeroutput>
#!/bin/sh

NET=192.168.4.0/24
GATEWAY=192.168.4.1

/sbin/ifconfig $1 $GATEWAY

/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_irc
/sbin/modprobe ip_nat_ftp
/sbin/modprobe iptable_filter
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe ip_conntrack_netbios_ns
/sbin/modprobe ip_conntrack_netlink

/sbin/iptables -D POSTROUTING -t nat -s $NET -d ! $NET -j MASQUERADE
/sbin/iptables -t nat -s $NET -d ! $NET -A POSTROUTING -j MASQUERADE
/bin/echo 1 > /proc/sys/net/ipv4/ip_forward
      </computeroutput></screen>
    </para>
    <para>
      Assurez-vous que tous les modules noyau chargés ici sont bien présents dans le répertoire <filename class="directory">/lib/modules/&kernelversion;/kernel/net/ipv4/netfilter/</filename> de l'hôte. N'hésitez pas à commenter les lignes qui ne vous seront pas nécessaires (comme celles concernant le chargement des modules <literal>ip_nat_irc</literal>, <literal>ip_conntrack_irc</literal>, <literal>ip_conntrack_netbios_ns</literal> etc., par exemple).
    </para>
    <para>
      Le rôle de ce script est de configurer l'interface virtuelle nouvellement créée pour QEMU. Celui-ci passe son nom en premier paramètre lors de l'appel. Ensuite on charge les modules nécessaires, puis on crée les règles qui permettront à l'hôte et à l'image QEMU de communiquer via le réseau <varname>$NET</varname>.
    </para>
  </sect1>
  <sect1 id="configuration-de-l-image">
    <title>Configuration de l'image</title>
    <para>
      Lors de la première installation du système sur l'image vous avez certainement configuré le réseau pour qu'il se configure automatiquement via le protocole <acronym>DHCP</acronym>. A présent nous allons revoir la configuration pour l'adapter à notre réseau virtuel.
    </para>
    <para>
      Lancez votre image avec la commande suivante:
    </para>
    <para>
      <screen><userinput>
$ qemu -localtime -m 256 -k fr -net nic -boot c -hda ~/qemu/debian/debian.img
      </userinput></screen>
    </para>
    <para>
      Identifiez vous en tant que root et éditez le fichier <filename>/etc/network/interfaces</filename> pour modifier la section de configuration de l'interface <literal>eth0</literal> comme suit:
    </para>
     <para>
      <screen><userinput>
auto eth0
iface eth0 inet static
        address 192.168.4.2
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255
        gateway 192.168.4.1
      </userinput></screen>
    </para>
    <para>
      Ensuite arrêtez l'image QEMU.
    </para>
    <para>
      A présent tout devrait être prêt. Pour tester votre nouveau réseau, lancez l'image QEMU en tant qu'utilisateur <literal>root</literal> <footnote><para>Nous avons besoin des droits superutilisateur pour manipuler <literal>ifconfig</literal> et <command>iptables</command>. Nous verrons <xref linkend="utilisation-de-sudo" /> comment utiliser la table <literal>sudoers</literal> à cette fin.</para></footnote> avec les options suivantes <footnote><para>Assurez-vous d'avoir bien installé et configuré le script <filename>/etc/qemu-ifup</filename> auparavant (voir <xref linkend="configuration-de-l-hote" />).</para></footnote>:
    </para>
    <para>
      <screen><userinput>
# qemu -localtime -m 256 -k fr -net nic -net tap -boot c -hda /home/grinch/qemu/debian/debian.img
      </userinput></screen>
    </para>
  </sect1>
  <sect1 id="partager-un-reseau-virtuel">
    <title>Partager un réseau virtuel</title>
    <para>
      Il est possible de faire tourner plusieurs instances de QEMU sur le même réseau virtuel. Il faut pour cela créer et configurer une première instance comme expliqué dans les chapitres précédents. Ensuite les différences se trouvent principalement dans les options de lancement de chaque image.
    </para>
    <sect2 id="serveur-de-reseau">
      <title>Serveur de réseau</title>
      <para>
        Le serveur de réseau doit être unique. Si vous avez configuré une première image comme indiqué dans ce tutoriel, celle-ci mettra à disposition des autres instances un réseau <literal>192.168.4.0/24</literal>.
      </para>
      <para>
        Cette première instance doit être lancée avec les options suivantes:
      </para>
      <para>
        <screen><userinput>
# qemu -localtime -m 256 -k fr -net nic -net tap -net socket,listen=127.0.0.1:1234 -boot c -hda /home/grinch/qemu/debian/debian.img
        </userinput></screen>
      </para>
      <para>
        A présent l'image fait office de serveur de réseau virtuel. Elle écoute en local sur le port <literal>1234</literal>. 
      </para>
      
      <note>
        <para>
          Le choix de l'adresse IP et du port est libre. A vous de faire attention à ce que le port choisi ne soit pas déjà utilisé.
        </para>
      </note>

    </sect2>
    <sect2 id="clients-du-reseau">
      <title>Clients du réseau</title>
      <para>
        Avant de faire partager le réseau à d'autres instances il faut s'assurer qu'il n'y a pas de conflit au niveau de leur adresse IP. Il faudra donc attribuer à chacune une adresse unique sur le réseau virtuel.
      </para>
      <para>
        Toutes les autres instances doivent être lancées avec les options suivantes:
      </para>
      <para>
        <screen><userinput>
# qemu -localtime -m 256 -k fr -net nic -net tap -net socket,connect=127.0.0.1:1234 -boot c -hda /home/grinch/qemu/freebsd/freebsd.img
        </userinput></screen>
      </para>
      
      <warning>
        <para>
          Pensez bien à indiquer ici le même couple adresse IP/port que celui spécifié au lancement du serveur de réseau.
        </para>
      </warning>
      
    </sect2>
  </sect1>
</chapter>

<chapter id="Automatisation">
  <title>Automatisation</title>
  <para>
    La gestion des images QEMU devient vite fastidieuse. Une automatisation s'impose donc.
  </para>
  <sect1 id="utilisation-de-sudo">
    <title>Utilisation de sudo</title>
    <para>
      Pour manipuler les modules et utiliser <command>iptables</command> nous avons besoin d'avoir les droits de l'utilisateur <literal>root</literal>. Donc plutôt que d'utiliser directement ce compte pour gérer les images QEMU nous allons passer par l'utilitaire <command>sudo</command>, qui permet de donner à un utilisateur ou un groupe les droits d'autres utilisateurs ou d'autres groupes.
    </para>
    <para>
      <command>sudo</command> se configure dans le fichier <filename>/etc/sudoers</filename>. Vous pouvez éditer directement ce fichier, néanmoins il est préférable d'utiliser la commande <command>visudo</command> si elle est disponible sur votre système. En tant qu'utilisateur root, ajoutez les lignes suivantes:
    </para>
    <para>
      <screen><userinput>
grinch  ALL=NOPASSWD:/usr/bin/qemuctl
      </userinput></screen>
    </para>
    <para>
      Pensez à remplacer <literal>grinch</literal> par le nom de l'utilisateur système de votre choix. Nous verrons <xref linkend="utilisation-de-qemuctl" /> à quoi correspond l'utilitaire <command>qemuctl</command>, et comment l'utiliser pour la gestion des images QEMU.
    </para>
    <para>
      Pour vérifier que la configuration de <command>sudo</command> est correcte, utilisez la commande <userinput>sudo -l</userinput>, qui devrait sortir quelque chose comme:
    </para>
    <para>
      <screen><userinput>
grinch@badiou:~$ sudo -l
User grinch may run the following commands on this host:
    (root) NOPASSWD: /usr/bin/qemuctl
grinch@badiou:~$
      </userinput></screen>
    </para>
    <para>
      A présent l'utilisateur système <literal>grinch</literal> pourra lancer le script <filename>/usr/bin/qemuctl</filename> avcec les droits de l'utilisateur <literal>root</literal> sans fournir de mot de passe, en utilisant la commande <userinput>sudo qemuctl</userinput>.
    </para>
  </sect1>
  <sect1 id="utilisation-de-qemuctl">
    <title>Utilisation de qemuctl</title>
    
    <warning>
      <para>
        Pensez bien à lancer la commande <command>qemuctl</command> en la faisant toujours précéder de <command>sudo</command>. Dans le cas contraire le script s'écuterait sans les droit de l'utilisateur <literal>root</literal> et s'arrêterait en affichant un message d'erreur.
      </para>
    </warning>

    <para>
      Afin d'automatiser les tâches de création, de démarrage et d'arrêt des images QEMU j'ai mis au point un script nommé <command>qemuctl</command> (téléchargeable <ulink url="http://esaracco.free.fr/downloads/qemuctl">ici</ulink>). Une fois le script téléchargé, déposez-le en tant que <literal>root</literal> dans <filename class="directory">/usr/bin/</filename> et rendez-le exécutable à l'aide de <userinput>chmod +x /usr/bin/qemuctl</userinput>. Ensuite vérifiez que vous avez bien suivi ce que nous avons dit <xref linkend="utilisation-de-sudo" /> pour pouvoir utiliser ce script avec les droits de l'utilisateur <literal>root</literal>.
    </para>
    <para>
      Avant toute chose, pensez à adapter la configuration du script à votre système. Les constantes à modifier se trouvent en début de script:
    </para>
    <para>
      <screen><computeroutput>
use constant QEMU_PATH => "/home/grinch/qemu";
use constant QEMU_RAM_SIZE => 256;
use constant QEMU_GRAPHIC => '-nographic';
use constant QEMU_VLAN_IP => '127.0.0.1';
use constant QEMU_VLAN_PORT => '1234';
      </computeroutput></screen>
    </para>

    <para>
      <variablelist>
        <varlistentry>
          <term>QEMU_PATH</term>
          <listitem><para>
            La constante <constant>QEMU_PATH</constant> pointe sur le répertoire dans lequel se trouve vos répertoires d'images QEMU.
          </para></listitem>
        </varlistentry>
        <varlistentry>
          <term>QEMU_RAM_SIZE</term>
          <listitem><para>
            La constante <constant class="limit">QEMU_RAM_SIZE</constant> indique la taille maximum de la <acronym>RAM</acronym> à allouer pour le système contenu dans l'image QEMU.
          </para></listitem>
        </varlistentry>
        <varlistentry>
          <term>QEMU_GRAPHIC</term>
          <listitem><para>
            La constante <constant>QEMU_GRAPHIC</constant> contient l'option de contrôle de l'affichage. Si elle contient <option>-nographic</option>, aucun display X ne sera utilisé lors du lancement. Si elle ne contient rien (une chaîne vide), QEMU utilisera un display X.
          </para></listitem>
        </varlistentry>
        <varlistentry>
          <term>QEMU_VLAN_IP</term>
          <listitem><para>
            La constante <constant>QEMU_VLAN_IP</constant> contient l'adresse IP sur laquelle est géré le <acronym>VLAN</acronym>. Il ne s'agit pas obligatoirement de la boucle locale. Elle est utilisée lorsque l'option <option>vls</option> (<acronym>VLAN</acronym> serveur) ou <option>vlc</option> (<acronym>VLAN</acronym> client) est passée à <command>qemuctl</command>.
          </para></listitem>
        </varlistentry>
        <varlistentry>
          <term>QEMU_VLAN_PORT</term>
          <listitem><para>
            La constante <constant>QEMU_VLAN_PORT</constant> contient le numéro de port sur lequel est géré le <acronym>VLAN</acronym>. Il est utilisé lorsque l'option <option>vls</option> (<acronym>VLAN</acronym> serveur) ou <option>vlc</option> (<acronym>VLAN</acronym> client) est passé à <command>qemuctl</command>.
          </para></listitem>
        </varlistentry>
      </variablelist>
    </para>
    
    <note>
      <para>
        Une fois que le système est installé et configuré sur l'image je vous conseille de ne plus utiliser de display X et d'accéder à votre image via SSH depuis la machine hôte.
      </para>
    </note>

    <para>
      Le fonctionnement du script est très simple. Dans un premier temps, lancez-le sans arguments afin d'afficher l'aide:
    </para>
    <para>
      <screen><computeroutput>
grinch@badiou:~/qemu$ qemuctl

    Version: &qemuctlversion;

    Usage  : qemuctl imgname [install|start|stop] [vls|vlc]
    Example: qemuctl freebsd start

    Available QEMU images:

        - fedora
        - freebsd
        - debian
        - gentoo

    Report bugs to &lt;esaracco@users.labs.libre-entreprise.org&gt;

grinch@badiou:~/qemu$
      </computeroutput></screen>
    </para>
    <para>
      Par défaut, <command>qemuctl</command> affiche une aide ainsi que la liste des différentes images détectées.
    </para>
    <para>
      Le synopsis est le suivant:
    </para>
    <cmdsynopsis>
      <command>qemuctl</command>
      <arg choice="plain"><replaceable>imgname</replaceable></arg>
        <group>
          <arg>install</arg>
          <arg>start</arg>
          <arg>stop</arg>
        </group>
        <group>
          <arg>vls</arg>
          <arg>vlc</arg>
        </group>
    </cmdsynopsis>
    <sect2 id="qemuctl-creation-d-une-image">
      <title>Création d'une image</title>
      <para>
        <command>qemuctl</command> permet de simplifier la création d'une image QEMU. Il faut néanmoins lui préparer un peu le terrain. Le script s'attend à trouver l'arborescence décrite <xref linkend="arborescence-locale" />. Si nous décidions par exemple d'installer une image du système <ulink url="http://www.freebsd.org">FreeBSD</ulink> nous préparerions le terrain comme suit:
      </para>
      <para>
        <screen><userinput>
$ cd ~/qemu/
$ mkdir -p freebsd/src
$ cd freebsd/src/
$ wget "ftp://ftp.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/6.1/6.1-RC1-i386-disc1.iso"
$ ln -s 6.1-RC1-i386-disc1.iso freebsd.iso
$ cd ../
$ qemu-img create freebsd.img 5G
        </userinput></screen>
      </para>
      <para>
        Ce qui nous donnerait au final:
      </para>
      <para>
        <screen><computeroutput>
grinch@badiou:~/qemu/freebsd$ pwd
/home/grinch/qemu/freebsd
grinch@badiou:~/qemu/freebsd$ ls -lR
.:
total 4
-rw-r--r-- 1 grinch grinch 5368709120 2006-03-13 18:43 freebsd.img
drwxr-xr-x 2 grinch grinch       4096 2006-04-17 19:47 src

./src:
total 49728
lrwxrwxrwx 1 grinch grinch       30 2006-04-17 19:47 freebsd.iso -> 6.1-RC1-i386-disc1.iso
-rw-r--r-- 1 grinch grinch 50862080 2006-03-13 18:25 6.1-RC1-i386-disc1.iso
grinch@badiou:~/qemu/freebsd$
        </computeroutput></screen>
      </para>
      <para>
        Une fois le terrain préparé il suffirait de lancer <userinput>sudo qemuctl freebsd install</userinput>.
      </para>
    </sect2>
    <sect2 id="execution-d-une-image">
      <title>Exécution d'une image</title>
      <para>
        Pour exécuter une image (<literal>debian</literal> dans notre cas), utilisez <userinput>sudo qemuctl debian start</userinput>.
      </para>
      <para>
        Un fichier de log est automatiquement créé directement sous le répertoire d'hébergement de l'image. Ici sous <filename class="directory">~/qemu/debian/</filename>. Ce fichier porte le nom de l'image: <filename>debian.log</filename>. Le script crée également un fichier <filename>debian.pid</filename> dans lequel est stocké l'identifiant du processus correspondant à l'image QEMU démarrée.
      </para>
      <para>
        Pour lancer une image en tant que serveur de réseau virtuel (voir <xref linkend="serveur-de-reseau"/>) il suffit de préciser l'argument <option>vls</option> après l'action: <userinput>sudo qemuctl debian start vls</userinput>.
      </para>
      <para>
        Pour lancer une image en tant que client d'un réseau virtuel (voir <xref linkend="serveur-de-reseau"/>) il suffit de préciser l'argument <option>vlc</option> après l'action: <userinput>sudo qemuctl debian start vlc</userinput>.
      </para>
    </sect2>
    <sect2 id="arret-d-une-image">
      <title>Arrêt d'une image</title>
      
      <warning>
        <para>
          Il est recommandé de ne jamais arrêter manuellement une image lancée avec <command>qemuctl</command>. Les images lancées avec <command>qemuctl</command> doivent être arrêtées avec <command>qemuctl</command>.
        </para>
      </warning>

      <para>
        L'arrêt d'une image est aisé lorsqu'on l'a démarrée en ne lui interdisant pas d'utiliser un display graphique. Néanmoins l'utilisation d'un display pouvant causer des problèmes au sein de X (instabilité du comportement de la souris, instabilité de la console graphique etc.) il est plus simple de passer l'option <option>-nographic</option> à QEMU via la constante <constant>QEMU_GRAPHIC</constant> de <command>qemuctl</command> (voir <xref linkend="utilisation-de-qemuctl" /> pour les détails).
      </para>
      <para>
        Pour arrêter une image (<literal>debian</literal> dans notre cas), pensez à stopper son système proprement (via la command <literal>halt</literal> par exemple), puis après avoir attendu un peu le temps que ses processus se terminent, utilisez <userinput>sudo qemuctl debian stop</userinput>.
      </para>
    </sect2>
  </sect1>
</chapter>

<chapter id="conclusion">
  <title>Conclusion</title>
  <para>
    Les scripts <emphasis>compagnons</emphasis> présentés dans ce tutoriels sont susceptibles d'évoluer en fonction de vos remarques. L'<xref linkend="fichiers-compagnons" /> sera tenue à jour en fonction de ces évolutions. N'hésitez pas à la consulter régulièrement.
  </para>
</chapter>

<appendix id="fichiers-compagnons">
  <title>Fichiers compagnons</title>
  <para>
    Vous trouverez dans cette section tous les fichiers <emphasis>maison</emphasis> dont il est question dans ce document.
  </para>
  <para><ulink url="http://esaracco.free.fr/downloads/qemuctl">Script de gestion des images QEMU</ulink> (voir <xref linkend="utilisation-de-qemuctl" />) - Dernière version &qemuctlversion;.</para>
  <para><ulink url="http://esaracco.free.fr/downloads/qemu-ifup">Script de configuration du réseau virtuel</ulink> (voir <xref linkend="configuration-de-l-hote" />) - Dernière version &qemuifupversion;.</para>
</appendix>

<appendix id="liens-utiles">
  <title>Liens utiles</title>
  <para><ulink url="http://fabrice.bellard.free.fr/qemu/">Site officiel de QEMU (utilisateurs)</ulink>.</para>
  <para><ulink url="http://savannah.nongnu.org/projects/qemu">Site officiel de QEMU (développeurs)</ulink>.</para>
  <para><ulink url="http://fr.wikipedia.org/wiki/QEMU">QEMU sur Wikipédia</ulink>.</para>
  <para><ulink url="http://free.oszoo.org/">Images QEMU prêtes à l'emploi</ulink>.</para>
  <para><ulink url="http://gtk-qemu.sourceforge.net/">Interface graphique en GTK pour QEMU</ulink>.</para>
  <para><ulink url="http://savannah.nongnu.org/projects/qvm86/">Un module noyau d'accélération Libre</ulink>.</para>
  <sect1 id="autres-tutoriels-et-howto">
    <title>Autres tutoriels et Howto</title>
      <para><ulink url="http://lea-linux.org/cached/index/Software-soft_emul-qemu.html">Installer et utiliser QEMU [Léa-Linux]</ulink>.</para>
      <para><ulink url="http://genibel.org/blog/index.php/2005/11/08/45-utiliser-qemu-avec-l-acceleration-kqemu">Utiliser QEMU avec l'accélération KQEMU</ulink>.</para>
      <para><ulink url="http://www.codepoets.co.uk/docs/qemu_windows2000_on_ubuntu_linux_howto">Installation de QEMU sur Ubuntu</ulink>.</para>
      <para><ulink url="http://gentoo-wiki.com/HOWTO:_Qemu">Installation de QEMU sur gentoo</ulink>.</para>
  </sect1>
</appendix>
</book>
