<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pterjan</id>
	<title>Lea Linux - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pterjan"/>
	<link rel="alternate" type="text/html" href="https://lea-linux.org/documentations/Sp%C3%A9cial:Contributions/Pterjan"/>
	<updated>2026-04-18T11:34:45Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=14538</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=14538"/>
		<updated>2007-04-27T19:30:26Z</updated>

		<summary type="html">&lt;p&gt;Pterjan : /* Structure sur le disque */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Configurer votre noyau]]&lt;br /&gt;
&lt;br /&gt;
= DKMS : Donnez l&#039;indépendance à vos pilotes =&lt;br /&gt;
&lt;br /&gt;
== Contexte ==&lt;br /&gt;
&lt;br /&gt;
Sous Linux, les pilotes (le logiciel qui permet au système d&#039;exploitation de communiquer avec le matériel) peuvent soit être directement inclus dans le noyau soit être disponibles sous la forme de modules à charger dans le noyau. Un tel module est compilé pour un noyau particulier et ne peut être utilisé sur un autre.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne les pilotes libres, cela ne pose en général aucun problème car ils sont soit livrés avec votre noyau, soit compilés en même temps que le noyau que vous compilez vous-même.&lt;br /&gt;
&lt;br /&gt;
Dans le cas de pilotes non libres (comme ceux de nVidia ou ATI) ou de pilotes distribués séparément et que vous compilez à la main, le pilote doit être recompilé à chaque version de noyau, ce qui peut devenir fastidieux.&lt;br /&gt;
&lt;br /&gt;
De plus, si vous souhaitez utiliser les pilotes distribués par votre distributeur Linux, vous devez attendre que les pilotes soient recompilés pour le nouveau noyau, et ne pouvez espérer qu&#039;ils fonctionnent avec un noyau que vous auriez personnalisé.&lt;br /&gt;
&lt;br /&gt;
== Objectifs de DKMS ==&lt;br /&gt;
&lt;br /&gt;
DKMS (Dynamic Kernel Module Support ou en français Gestion Dynamique des Modules Noyau) est un système très simple conçu par Dell et permettant de compiler dynamiquement et facilement les modules noyau pour tous les noyaux de votre système. Ce système est à la base conçu pour faciliter à Dell la distribution de pilotes Linux et de correctifs.&lt;br /&gt;
&lt;br /&gt;
Cela évite à la fois aux éditeurs et aux utilisateurs de devoir passer par des mises à jour du noyau pour une correction sur un pilote particulier et permet de distribuer un pilote supplémentaire sous la forme d&#039;un seul paquetage quel que soit le noyau de l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cet article a pour but de présenter ce système, à la fois aux développeurs et distributeurs de modules noyau qui pourraient l&#039;utiliser pour faciliter la vie à leurs utilisateurs, et aux utilisateurs qui peuvent également l&#039;utiliser tout seuls.&lt;br /&gt;
&lt;br /&gt;
== Comment ça marche ==&lt;br /&gt;
&lt;br /&gt;
Le principe de DKMS est très simple. À condition que le module soit prévu pour être utilisé avec DKMS (fourniture d&#039;un dkms.conf), l&#039;utilisation d&#039;un nouveau module en passant par DKMS consiste à exécuter les 3 étapes suivantes :&lt;br /&gt;
&lt;br /&gt;
* Insertion dans l&#039;arbre DKMS (action add)&lt;br /&gt;
* Compilation pour le noyau (action build)&lt;br /&gt;
* Installation avec les autres modules du noyau (action install)&lt;br /&gt;
&lt;br /&gt;
Ces étapes sont séparées et ne sont pas forcement toutes réalisées à la suite. La figure 1 montre les différents états d&#039;un module dans le système DKMS, et les transitions possibles entre ces états à l&#039;aide des actions de la commande dkms.&lt;br /&gt;
&lt;br /&gt;
Figure 1 : États d&#039;un module dans le système DKMS&lt;br /&gt;
&lt;br /&gt;
=== Structure sur le disque ===&lt;br /&gt;
&lt;br /&gt;
Afin de bien séparer la gestion des différentes versions de module et de la version du noyau, le fonctionnement de DKMS se base sur la présence de 3 arborescences :&lt;br /&gt;
&lt;br /&gt;
* Les sources des modules, dans &amp;lt;tt&amp;gt;/usr/src&amp;lt;/tt&amp;gt;&lt;br /&gt;
* L&#039;arborescence des modules du noyau &amp;lt;tt&amp;gt;/lib/modules&amp;lt;/tt&amp;gt; : DKMS y remplacera ou ajoutera les modules que l&#039;on va lui faire gérer&lt;br /&gt;
* L&#039;arborescence de DKMS &amp;lt;tt&amp;gt;/var/lib/dkms&amp;lt;/tt&amp;gt;, contenant :&lt;br /&gt;
          o Les répertoire ou seront construits les modules&lt;br /&gt;
          o Les modules originaux sauvegardés&lt;br /&gt;
          o Les modules générés par DKMS&lt;br /&gt;
&lt;br /&gt;
Les chemins indiqués sont ceux par défaut et il est possible de les modifier dans &amp;lt;tt&amp;gt;/etc/dkms/framework.conf&amp;lt;/tt&amp;gt; mais nous supposerons dans le reste de l&#039;article que les valeurs par défaut ont été conservées.&lt;br /&gt;
&lt;br /&gt;
== Mise en oeuvre de DKMS par un utilisateur ==&lt;br /&gt;
&lt;br /&gt;
=== La commande dkms ===&lt;br /&gt;
&lt;br /&gt;
La gestion des modules au sein du système DKMS se fait à l&#039;aide de la commande dkms. Cette commande a une syntaxe très simple : dkms &amp;lt;action&amp;gt; [options]&lt;br /&gt;
Les actions et les options sont par contre plutôt nombreuses et même si je vous les explique ci-dessous, seules les principales devraient être utiles à la majorité d&#039;entre vous (à savoir: add, build, install, remove en ce qui concerne les actions et -m, -v et --all en ce qui concerne les options).&lt;br /&gt;
&lt;br /&gt;
Voici tout d&#039;abord la liste des options génériques s&#039;appliquant à diverses commandes, celles restreintes à une commande particulière seront expliquées dans la description de celle-ci.&lt;br /&gt;
&lt;br /&gt;
* -m &amp;lt;module&amp;gt; : Le nom du module sur lequel effectuer l&#039;action.&lt;br /&gt;
* -v &amp;lt;version du module&amp;gt; : La version du module sur laquelle effectuer l&#039;action.&lt;br /&gt;
* -k &amp;lt;version du noyau&amp;gt; : La version du noyau sur laquelle effectuer l&#039;action. Il est possible pour certaines actions de spécifier plusieurs versions du noyau en utilisant plusieurs fois -k, si l&#039;action spécifiée ne le supporte pas une erreur sera émise.&lt;br /&gt;
* -a &amp;lt;architecture&amp;gt; : L&#039;architecture pour laquelle effectuer l&#039;action. Si cette option n&#039;est pas précisée, l&#039;architecture choisie est celle indiquée par uname -m. Il est possible de répéter cette option afin d&#039;indiquer plusieurs architectures, mais dans ce cas il doit y avoir exactement autant de -k que de -a. Chaque noyau sera associé à l&#039;architecture de position identique. Par exemple si vous indiquez -k noyau1 -k noyau2 -a i386 -k noyau3 -a i586 -a x86_64, DKMS comprendra que noyau1 est en i386, noyau2 est en i586 et noyau3 est en x86_64.&lt;br /&gt;
* --all : Indique d&#039;appliquer l&#039;action pour toutes les versions de noyau et toutes les architectures pour lesquelles le module a été compilé. Cela est particulièrement utile pour l&#039;action remove.&lt;br /&gt;
* --rpm_safe_upgrade : Cette option est nécessaire pour les commandes DKMS appelées à l&#039;intérieur d&#039;un RPM. Cela évite des problèmes lors de mise à jour d&#039;un RPM à un autre contenant la même version du module. Cela évite aussi les problèmes d&#039;interblocage dus au système de verrous de rpm.&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant étudier ce que permet de faire DKMS à travers le parcours des actions que l&#039;on peut faire effectuer à la commande dkms.&lt;br /&gt;
&lt;br /&gt;
* add : Ajoute à l&#039;arbre des sources de DKMS une version d&#039;un module (les options -m et -v sont donc obligatoires, c&#039;est le cas pour la majorité des commandes). Les sources du module doivent être précédemment placées dans /usr/src/&amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;/ et contenir un fichier dkms.conf. Si le fichier dkms.conf ne se trouve pas dans /usr/src/&amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;/, il faut ajouter l&#039;option -c pour indiquer son chemin.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms add -m exemple -v 0.9.0 -c /tmp/dkms.conf &lt;br /&gt;
Creating symlink /var/lib/dkms/exemple/0.9.0/source -&amp;gt;&lt;br /&gt;
		 /usr/src/exemple-0.9.0&lt;br /&gt;
&lt;br /&gt;
		 DKMS: add Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* remove : Supprime une version d&#039;un module. Il faut en plus des options -m et -v, soit préciser une version de noyau avec l&#039;option -k, soit demander à supprimer le module de tout les noyaux pour lesquelles cette version avait été compilée, avec l&#039;option --all.&lt;br /&gt;
&lt;br /&gt;
      Si le module avait été installé, il est d&#039;abord désinstallé (comme si on avait appelé l&#039;action uninstall) et d&#039;éventuelles versions précédentes sont réinstallées. Après un remove, le module n&#039;est plus du tout connu de DKMS et il faut recommencer à l&#039;étape add.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms remove -m exemple -v 0.9.0 --all&lt;br /&gt;
&lt;br /&gt;
------------------------------&lt;br /&gt;
Deleting module version: 0.9.0&lt;br /&gt;
completely from the DKMS tree.&lt;br /&gt;
------------------------------&lt;br /&gt;
Done.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* build : Compile une version d&#039;un module pour le noyau indiqué avec l&#039;option -k ou pour le noyau utilisé actuellement si aucun n&#039;est précisé. En cas d&#039;erreurs lors de la compilation, il est utile de savoir que celle-ci se déroule dans /var/lib/dkms/&amp;lt;module&amp;gt;/&amp;lt;version du module&amp;gt;/build/ et que tout ce qui est affiché pendant la compilation est enregistré dans un fichier make.log dans ce même répertoire.&lt;br /&gt;
&lt;br /&gt;
      La commande build accepte quelques options facultatives :&lt;br /&gt;
          o --config &amp;lt;fichier .config du noyau&amp;gt; : Cette option permet d&#039;indiquer à la commande build ou trouver le fichier .config si celui-ci n&#039;est pas à l&#039;emplacement standard de la distribution ou n&#039;a pas le nom habituel.&lt;br /&gt;
          o --no-prepare-kernel : Cette option demande à DKMS de ne pas préparer les sources du noyau avant de compiler un module pour lui. Il est recommandé de ne pas utiliser cette option si l&#039;on souhaite que les modules soient correctement construits.&lt;br /&gt;
          o --no-clean-kernel : Cette option demande à DKMS de ne pas nettoyer les sources du noyau après avoir compilé un module.&lt;br /&gt;
          o --kernelsourcedir &amp;lt;chemin vers les sources du noyau&amp;gt; : Cette option permet d&#039;indiquer l&#039;emplacement des sources du noyau lorsqu&#039;elles ne se trouvent pas dans /lib/modules/&amp;lt;version du noyau&amp;gt;/build.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms build -m slmodem -v 2.9.10 -k 2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
&lt;br /&gt;
Preparing kernel 2.6.12-12mdk-i686-up-4GB for module build:&lt;br /&gt;
(This is not compiling a kernel, only just preparing kernel symbols)&lt;br /&gt;
Storing current .config to be restored when complete&lt;br /&gt;
Running Generic preparation routine&lt;br /&gt;
make mrproper.........&lt;br /&gt;
using /boot/config-2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
make oldconfig......&lt;br /&gt;
make prepare-all......&lt;br /&gt;
&lt;br /&gt;
Building module:&lt;br /&gt;
cleaning build area....&lt;br /&gt;
make KERNELRELEASE=2.6.12-12mdk-i686-up-4GB KERNEL_DIR=/lib/modules/2.6.12-12mdk-i686-up-4GB/build drivers....&lt;br /&gt;
cleaning build area....&lt;br /&gt;
cleaning kernel tree (make mrproper)....&lt;br /&gt;
&lt;br /&gt;
DKMS: build Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install : Installe une version d&#039;un module dans l&#039;arborescence du noyau indiqué (ou du noyau utilisé actuellement si aucun n&#039;est précisé par l&#039;option -k). Cette version doit précédemment avoir été compilée pour le noyau en question à l&#039;aide de l&#039;action build.&lt;br /&gt;
&lt;br /&gt;
      Lors de la première installation d&#039;une version d&#039;un module donné sur un noyau donné, DKMS cherche si ce module existait déjà avec ce noyau et le sauvegarde pour pouvoir le réinstaller lorsque l&#039;on demandera à DKMS de désinstaller la nouvelle version. Pour information, la version originale est sauvée dans /var/lib/dkms/&amp;lt;module&amp;gt;/original_module/&amp;lt;version du noyau&amp;gt;/&amp;lt;architecture&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms install -m slmodem -v 2.9.10 -k 2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
Running module version sanity check.&lt;br /&gt;
&lt;br /&gt;
slamr.ko.gz:&lt;br /&gt;
 - Original module&lt;br /&gt;
   - No original module exists within this kernel&lt;br /&gt;
 - Installation&lt;br /&gt;
   - Installing to /lib/modules/2.6.12-12mdk-i686-up-4GB/kernel/drivers/char/&lt;br /&gt;
&lt;br /&gt;
slusb.ko.gz:&lt;br /&gt;
 - Original module&lt;br /&gt;
   - No original module exists within this kernel&lt;br /&gt;
 - Installation&lt;br /&gt;
   - Installing to /lib/modules/2.6.12-12mdk-i686-up-4GB/kernel/drivers/char/&lt;br /&gt;
&lt;br /&gt;
depmod.....&lt;br /&gt;
&lt;br /&gt;
DKMS: install Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* uninstall : Désinstalle une version d&#039;un module pour une version du noyau (celle précisée par l&#039;option -k ou la version utilisée actuellement si aucune n&#039;est précisée). Cette commande ne gère pas l&#039;option --all donc il vous faudra désinstaller pour chaque noyau séparément.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms uninstall -m slmodem -v 2.9.10 -k 2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
&lt;br /&gt;
-------- Uninstall Beginning --------&lt;br /&gt;
Module:  slmodem&lt;br /&gt;
Version: 2.9.10&lt;br /&gt;
Kernel:  2.6.12-12mdk-i686-up-4GB (i586)&lt;br /&gt;
-------------------------------------&lt;br /&gt;
&lt;br /&gt;
Status: Before uninstall, this module version was ACTIVE on this kernel.&lt;br /&gt;
&lt;br /&gt;
slamr.ko.gz:&lt;br /&gt;
 - Uninstallation&lt;br /&gt;
   - Deleting from: /lib/modules/2.6.12-12mdk-i686-up-4GB/kernel/drivers/char/&lt;br /&gt;
 - Original module&lt;br /&gt;
   - No original module was found for this module on this kernel.&lt;br /&gt;
   - Use the dkms install command to reinstall any previous module version.&lt;br /&gt;
&lt;br /&gt;
slusb.ko.gz:&lt;br /&gt;
 - Uninstallation&lt;br /&gt;
   - Deleting from: /lib/modules/2.6.12-12mdk-i686-up-4GB/kernel/drivers/char/&lt;br /&gt;
 - Original module&lt;br /&gt;
   - No original module was found for this module on this kernel.&lt;br /&gt;
   - Use the dkms install command to reinstall any previous module version.&lt;br /&gt;
&lt;br /&gt;
DKMS: uninstall Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* mkrpm : Génére un RPM pour un couple module/version donné. Si vous désirez que le RPM ne contienne que les sources (et donc que les modules soient compilés lors de l&#039;installation), vous devez ajouter l&#039;option --source-only. Sinon, le choix des modules à distribuer se fait à l&#039;aide de -k et -a, comme pour les autres actions.&lt;br /&gt;
&lt;br /&gt;
      Si vous maîtrisez la création de RPM et souhaitez personnaliser ce qui est généré, sachez que DKMS regarde d&#039;abord si /usr/src/&amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;/&amp;lt;module&amp;gt;-dkms-mkrpm.spec existe, si oui l&#039;utilise comme modèle, et sinon utilise /etc/dkms/template-dkms-mkrpm.spec.&lt;br /&gt;
&lt;br /&gt;
* status : Affiche l&#039;état des différents modules pour chaque version, noyau et architecture.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms status&lt;br /&gt;
ipw2200, 1.0.4: added&lt;br /&gt;
slmodem, 2.9.10, 2.6.12-11mdk-i686-up-4GB, i586: installed&lt;br /&gt;
slmodem, 2.9.10, 2.6.12-12mdk-i686-up-4GB, i586: built&lt;br /&gt;
sysprof, 1.0, 2.6.12-12mdk-i686-up-4GB, i586: installed&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* match : Cette commande fort sympathique permet de compiler et installer pour un noyau donné tout les modules qui avaient été installés pour un autre noyau (spécifié par l&#039;option --templatekernel). Par exemple, après exécution de dkms match --templatekernel 2.6.12-11mdk-i686-up-4GB -k 2.6.12-12mdk-i686-up-4GB, toutes les combinaisons module/version qui étaient installées pour le noyau 2.6.12-11mdk-i686-up-4GB le seront pour le noyau 2.6.12-12mdk-i686-up-4GB.&lt;br /&gt;
* mktarball : Crée une archive tar.gz pour le module et la version indiquées. Cette archive contiendra les sources et les modules précédemment compilés. Par défaut l&#039;archive est créée pour le noyau utilisé actuellement. Si vous en souhaitez un (ou plusieurs) autre, vous pouvez l&#039;indiquer en utilisant les options -k et -a. Cette commande dispose également de quelques options supplémentaires :&lt;br /&gt;
          o --archive &amp;lt;fichier.tar.gz&amp;gt; : Permet de préciser le nom à donner à l&#039;archive (ne pas indiquer de chemin, il sera toujours placé dans /var/lib/dkms/&amp;lt;module&amp;gt;/&amp;lt;version du module&amp;gt;/tarball/). Sans cette option, le fichier s&#039;appelle &amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;-&amp;lt;versions des noyaux&amp;gt;.dkms.tar.gz&lt;br /&gt;
          o --binaries-only : Ne pas inclure les sources du module&lt;br /&gt;
          o --sources-only : Ne pas inclure les modules pré compilés. L&#039;archive s&#039;appellera &amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;-source-only.dkms.tar.gz, sauf si vous précisez un autre nom à l&#039;aide de --archive&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms mktarball -m slmodem -v 2.9.10 -k 2.6.12-11mdk-i686-up-4GB -k 2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
Marking modules for 2.6.12-11mdk-i686-up-4GB (i586) for archiving...&lt;br /&gt;
Marking modules for 2.6.12-12mdk-i686-up-4GB (i586) for archiving...&lt;br /&gt;
&lt;br /&gt;
Marking /usr/src/slmodem-2.9.10 for archiving...&lt;br /&gt;
&lt;br /&gt;
Tarball location: /var/lib/dkms/slmodem/2.9.10/tarball/slmodem-2.9.10-kernel2.6.12-11mdk-i686-up-4GB-i586-kernel2.6.12-12mdk-i686-up-4GB-i586.dkms.tar.gz&lt;br /&gt;
&lt;br /&gt;
DKMS: mktarball Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ldtarball : Importe une archive tar.gz créé à l&#039;aide de l&#039;action mktarball et spécifié à l&#039;aide de l&#039;option --archive.&lt;br /&gt;
&lt;br /&gt;
      Les fichiers sont importés dans l&#039;arborescence de DKMS et pas dans celle du noyau, les modules sont donc au mieux dans l&#039;état built(compilé) et il faut lancer ensuite la commande dkms install pour chacun d&#039;eux.&lt;br /&gt;
&lt;br /&gt;
      Par ailleurs, si des fichiers existent déjà lors de l&#039;import, un avertissement sera affiché et ils seront laissés tels quels. Si vous souhaitez que ces éventuels fichiers soient écrasés, il faut ajouter l&#039;option --force.&lt;br /&gt;
* mkdriverdisk : Crée une disquette avec les pilotes pour permettre l&#039;installation d&#039;une distribution, c&#039;est particulièrement utile lorsque le CD d&#039;installation ne contient pas les pilotes pour un nouveau contrôleur disque.&lt;br /&gt;
          o --size &amp;lt;taille de la disquette&amp;gt; : Cette option est utilisée par la commande mkdriverdisk pour décider de la taille de la disquette à créer. La valeur doit être un nombre entier de kilo-octets, divisible par 20, et vaut 1440 si cette option n&#039;est pas précisée.&lt;br /&gt;
          o --distrib &amp;lt;distribution&amp;gt; : Cette option obligatoire indique la distribution cible. Les valeurs actuellement supportées sont suse, UnitedLinux, redhat, redhat1 and redhat2. Red Hat supportant les disquettes de pilotes multi-architecture depuis la RHEL3, redhat1 force à utiliser l&#039;ancien format, redhat2 force à utiliser le nouveau.&lt;br /&gt;
          o --release &amp;lt;version&amp;gt; : Cette option est nécessaire si vous construisez une disquette pour SuSE ou UnitedLinux. Elle indique la version de la distribution, par exemple --distrib suse --release 9.1 indiquera que vous construisez la disquette pour une SuSE 9.1&lt;br /&gt;
      Les options --binaries-only et --sources-only de mktarball peuvent également être utilisées.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation basique ===&lt;br /&gt;
&lt;br /&gt;
Après vous avoir noyé sous les commandes et les options, je pense qu&#039;un exemple d&#039;utilisation classique est nécessaire pour vous persuader de la simplicité d&#039;utilisation. Voici donc comment installer un module exemple, fourni sous la forme de exemple-1.0.tar.gz contenant un unique répertoire exemple-1.0 avec les sources du module et un dkms.conf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd /usr/src&lt;br /&gt;
tar xzf /tmp/exemple-1.0.tar.gz&lt;br /&gt;
dkms add -m exemple -v 1.0&lt;br /&gt;
dkms build -m exemple -v 1.0&lt;br /&gt;
dkms install -m exemple -v 1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listing 1 : Ajout d&#039;un pilote en utilisant DKMS&lt;br /&gt;
&lt;br /&gt;
Si tout s&#039;est bien passé, le module est compilé et installé, et modprobe exemple fonctionne ! Si cela ne s&#039;est pas bien passé, c&#039;est vraisemblablement lors de l&#039;étape build, et vous pouvez essayer de déterminer le problème en allant lire le fichier /var/lib/dkms/exemple/1.0/build/make.log. Si vous n&#039;avez pas les compétences pour cela, le plus simple est d&#039;envoyer ce fichier à l&#039;auteur du dkms.conf afin qu&#039;il corrige l&#039;erreur.&lt;br /&gt;
&lt;br /&gt;
Un mode de distribution courant, que nous détaillerons plus loin, consiste à distribuer les sources et le dkms.conf sous la forme d&#039;un package RPM et non pas d&#039;un tar.gz. Dans ce cas, installer le package RPM suffit et exécutera automatiquement les différentes commandes.&lt;br /&gt;
&lt;br /&gt;
== Mise en oeuvre de DKMS par un distributeur ==&lt;br /&gt;
&lt;br /&gt;
=== Adaptation des sources ===&lt;br /&gt;
DKMS a besoin des sources du module dans le répertoire /usr/src/&amp;lt;nom du module&amp;gt;-&amp;lt;version du module&amp;gt;/ et d&#039;un fichier dkms.conf dans ce même répertoire. Nous allons étudier la syntaxe de ce fichier sur un exemple classique avant de détailler toutes les options disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de dkms.conf pour l&#039;ipw2200 1.0.4 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PACKAGE_VERSION=&amp;quot;1.0.4&amp;quot;&lt;br /&gt;
PACKAGE_NAME=&amp;quot;ipw2200&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MAKE[0]=&amp;quot;make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules HOSTAP_SRC=${kernel_source_dir}/3rdparty/hostap/&amp;quot;&lt;br /&gt;
CLEAN=&amp;quot;make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build clean&amp;quot;&lt;br /&gt;
&lt;br /&gt;
BUILT_MODULE_NAME[0]=&amp;quot;$PACKAGE_NAME&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[1]=&amp;quot;ieee80211_crypt_ccmp&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[2]=&amp;quot;ieee80211_crypt&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[3]=&amp;quot;ieee80211_crypt_tkip&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[4]=&amp;quot;ieee80211_crypt_wep&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[5]=&amp;quot;ieee80211&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[0]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[1]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[2]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[3]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[4]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[5]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;eth&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REMAKE_INITRD=&amp;quot;no&amp;quot;&lt;br /&gt;
AUTOINSTALL=&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listing 2: Exemple de dkms.conf pour le pilote ipw2200 version 1.0.4&lt;br /&gt;
&lt;br /&gt;
Comme vous pouvez le voir ce fichier a une syntaxe très simple, une option par ligne sous la forme OPTION=&amp;quot;valeur&amp;quot;. Voyons maintenant plus précisément à quoi correspondent les options définies dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
PACKAGE_VERSION et PACKAGE_NAME ne méritent je pense aucune explication. Il est toutefois intéressant de noter que lors de la sortie d&#039;une nouvelle version du module, la seule ligne à modifier dans le dkms.conf est en général PACKAGE_VERSION.&lt;br /&gt;
&lt;br /&gt;
MAKE[0] contient la commande à exécuter pour compiler le module, elle peut utiliser de nombreuses variables, listées dans la section suivante. La majorité des modules peuvent se compiler avec la commande suivante : make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules&lt;br /&gt;
&lt;br /&gt;
CLEAN contient une commande permettant de nettoyer le répertoire de construction, elle est appelée avant et après la compilation du module.&lt;br /&gt;
&lt;br /&gt;
Les 12 lignes suivantes indiquent les modules générés (ici il y en a 6) et ou il faut les installer. BUILT_MODULE_NAME[i] contient le nom du module numéro i (en commençant à 0) et DEST_MODULE_LOCATION[i] le chemin où installer le module numéro i. Le chemin est relatif à l&#039;arborescence des modules du noyau concerné, /lib/modules/&amp;lt;version du noyau&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
L&#039;option MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;eth&amp;quot; indique qu&#039;il faudra ajouter dans /etc/modprobe.conf (ou modules.conf) un alias vers ce module qui s&#039;appelera eth0 (ou eth1, eth2, ... selon ce qui est déjà pris).&lt;br /&gt;
&lt;br /&gt;
REMAKE_INITRD=&amp;quot;no&amp;quot; indique que ce pilote n&#039;a pas besoin d&#039;être dans l&#039;initrd. L&#039;initrd est l&#039;image contenant tout les modules et commandes nécessaires pour accéder au disque dur, cette option a donc rarement besoin d&#039;être à yes en dehors des pilotes de contrôleur disque.&lt;br /&gt;
&lt;br /&gt;
AUTOINSTALL=&amp;quot;yes&amp;quot; indique que l&#039;on veut que ce module soit compilé et installé automatiquement lorsque l&#039;on démarre sur un nouveau noyau.&lt;br /&gt;
&lt;br /&gt;
=== Variables disponibles ===&lt;br /&gt;
&lt;br /&gt;
Quelques variables peut être utilisées dans les options et les commandes comme vous pouvez le voir dans la commande MAKE[0] de l&#039;exemple précédent. Ces variables sont définies par la configuration de DKMS ou par les options passées à la commande dkms.&lt;br /&gt;
&lt;br /&gt;
* $kernelver : Cette variable contient la version du noyau pour laquelle le module est en train d&#039;être construit. C&#039;est particulièrement utile dans la définition de la commande MAKE, par exemple MAKE[0]=&amp;quot;make INCLUDEDIR=/lib/modules/${kernelver}/build/include&amp;quot;&lt;br /&gt;
* $dkms_tree : Cette variable indique ou se trouve l&#039;arbre DKMS sur le système local. Par défaut il s&#039;agit de /var/lib/dkms, mais cette valeur ne doit pas être mise en dur dans les dkms.conf au cas ou l&#039;utilisateur aurait changé cela sur son système (Un tel réglage se fait à l&#039;aide de /etc/dkms/framework.conf ou en ajoutant l&#039;option --dkmstree lors de l&#039;appel, mais nous ne verrons pas ce genre d&#039;utilisations avancées dans cette article).&lt;br /&gt;
* $source_tree : Cette variable indique ou DKMS stocke les sources des modules sur le système. Par défaut il s&#039;agit de /usr/src, mais cette valeur ne doit pas être mise en dur dans les dkms.conf au cas ou l&#039;utilisateur aurait changé cela sur son système (à l&#039;aide de /etc/dkms/framework.conf ou en ajoutant l&#039;option --sourcetree lors de l&#039;appel).&lt;br /&gt;
* $kernel_source_dir : Cette variable contient le chemin vers les sources du kernel pour lequel on construit le module. Il s&#039;agit en général de /lib/modules/$kernelver/build, à moins qu&#039;un autre chemin ait été spécifié avec l&#039;option --kernel-sourcedir&lt;br /&gt;
&lt;br /&gt;
=== Options que l&#039;on peut définir dans le fichier dkms.conf ===&lt;br /&gt;
Tout d&#039;abord, le nom des options est sensible à la casse donc elles doivent être écrites en majuscules. Seules 4 options sont obligatoires :&lt;br /&gt;
&lt;br /&gt;
* PACKAGE_NAME : le nom du package&lt;br /&gt;
* PACKAGE_VERSION : la version du package&lt;br /&gt;
* BUILT_MODULE_NAME[0] : le nom du module construit. S&#039;il y en a plusieurs, ça sera BUILT_MODULE_NAME[1], BUILT_MODULE_NAME[2], ... Les modules non listés ici ne seront pas installés même s&#039;il sont construit par la commande MAKE[0]&lt;br /&gt;
* DEST_MODULE_LOCATION[0] : l&#039;emplacement ou installer le module numéro 0. Ce chemin est relatif au répertoire des modules, et sera par exemple &amp;quot;3rdparty&amp;quot;. Il faut renseigner DEST_MODULE_LOCATION[#] pour chaque module listé dans BUILT_MODULE_NAME&lt;br /&gt;
&lt;br /&gt;
De nombreuses autres options bien pratiques mais facultatives dont disponibles :&lt;br /&gt;
&lt;br /&gt;
* MAKE[#] : la commande pour compiler le(s) modules. Voir l&#039;explication de MAKE_MATCH pour la signification du numéro passé en paramètre. Cette option est facultative dans la mesure ou la commande standard de construction d&#039;un module kernel sera utilisée si elle n&#039;est pas définie.&lt;br /&gt;
* MAKE_MATCH[#] : cet ensemble d&#039;options permet d&#039;avoir une commande de construction différente en fonction des versions du kernel. Chacune contient une expression régulière qui sera comparée à la version du noyau. Le numéro de la dernière qui correspond indiquera le numéro de commande MAKE à utiliser.&lt;br /&gt;
* BUILT_MODULE_LOCATION[#] : le chemin relatif vers le module généré. Cela est nécessaire lorsque le module est généré dans un sous répertoire du répertoire de compilation.&lt;br /&gt;
* DEST_MODULE_NAME[#] : le nom a utiliser pour installer le module, s&#039;il y a besoin de le renommer. L&#039;extension (.o ou .ko) ne doit pas être spécifiée. Par défaut le nom original BUILT_MODULE_NAME[#] est conservé.&lt;br /&gt;
* MODULES_CONF_ALIAS_TYPE[#] : cette option indique pour chaque module quel alias créer dans /etc/modprobe.conf. DKMS calculera automatiquement le numéro de l&#039;alias en fonction de ceux qui existent déjà. Par exemple si MODULES_CONF_ALIAS_TYPE[0] contient eth et que vous avez déjà eth0 et eth1 définis dans /etc/modprobe.conf, DKMS ajoutera un alias eth2 vers le module. Cette fonctionnalité est à utiliser avec précaution dans la mesure ou elle gère mal les cas complexes, comme par exemple les systèmes avec plusieurs cartes réseau utilisant le même module.&lt;br /&gt;
* MODULES_CONF_OBSOLETES[#] : cette option indique à DKMS quels modules vers lesquels pointent des alias dans /etc/modprobe.conf doivent être remplacés par ce nouveau module. Si il y en a plusieurs, les séparer par une virgule. Je pense que ce sera plus clair sur un exemple. Considérons le fichier modprobe.conf suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;alias eth0 bcm4400&lt;br /&gt;
alias eth1 e1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      Si l&#039;on se contente des options suivantes, DKMS n&#039;a aucun moyen de deviner que b44 et bcm4400 gèrent la même carte et un nouvel alias sera généré.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;BUILT_MODULE_NAME[0]=&amp;quot;b44&amp;quot;&lt;br /&gt;
MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;eth&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      Le nouveau modprobe.conf contiendra donc :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;alias eth0 bcm4400&lt;br /&gt;
alias eth1 e1000&lt;br /&gt;
alias eth2 b44&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      Si par contre on ajoute MODULES_CONF_OBSOLETES[0]=&amp;quot;bcm4400&amp;quot;, le nouveau modprobe.conf sera correct :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;alias eth0 b44&lt;br /&gt;
alias eth1 e1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* MODULES_CONF_OBSOLETE_ONLY[#] : Si cette option vaut yes, DKMS ne modifiera modprobe.conf que s&#039;il trouve un alias vers un module obsolète à remplacer. Il n&#039;y aura donc jamais de nouveaux alias de créés.&lt;br /&gt;
* STRIP[#] : Par défaut, les symboles de deboguage sont supprimés des modules à l&#039;aide de strip -g. Positionner cette option à &amp;quot;no&amp;quot; pour l&#039;un des modules permet de les conserver dans ce module.&lt;br /&gt;
* REMAKE_INITRD : Cette option indique, lorsque la première lettre est y ou Y, qu&#039;il faut régénérer l&#039;initrd après l&#039;installation d&#039;une nouvelle version du module. C&#039;est surtout nécessaire pour les pilotes de contrôleur disque.&lt;br /&gt;
* MODULES_CONF[#] : Cette option permet d&#039;indiquer des lignes à ajouter au fichier modprobe.conf. Lorsqu&#039;une première version du module est installée sur l&#039;un des noyaux, les lignes de MODULES_CONF sont ajoutées au fichier modprobe.conf (avant que l&#039;initrd soit régénéré si REMAKE_INITRD est activé). Elles sont supprimées lorsque la dernière version est désinstallée. On peut imaginer par exemple dans le cas de l&#039;ipw2200 MODULES_CONF[0]=&amp;quot;options ipw2200 led=1&amp;quot;.&lt;br /&gt;
* PATCH[#] : Cette option permet d&#039;indiquer des patchs à appliquer sur les sources du pilote avant de le compiler. Tout les patchs doivent se trouver dans /usr/src/&amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;/patches/ et sont appliqués avec patch -p1. Vous pouvez spécifier pour quels noyaux chaque patch doit être appliqué en utilisant l&#039;option PATCH_MATCH ci-dessous.&lt;br /&gt;
* PATCH_MATCH[#] : Cette option sert à indiquer pour quels noyaux les patchs contenus dans le tableau PATCH doivent être appliqués. PATCH_MATCH[i] contient une expression régulière qui est comparés à la version du noyau cible pour décider si PATCH[i] doit être appliqué.&lt;br /&gt;
* AUTOINSTALL : Si cette option vaut &amp;quot;yes&amp;quot;, le service dkms (/etc/rc.d/init.d/dkms) essayera automatiquement de construire et installer ce module sur le noyau sur lequel vous démarrez. Ce service ne fera toutefois rien si plusieurs versions du module sont présentes dans l&#039;arbre DKMS, ce sera à vous de décider laquelle vous souhaitez.&lt;br /&gt;
* BUILD_EXCLUSIVE_KERNEL : Cette option permet d&#039;indiquer une expression régulière décrivant les versions de noyau pour lesquelles DKMS est autorisé à construire votre module. Si vous essayez de construire le module pour un noyau ne correspondant pas à cette expression régulière, DKMS provoquera une erreur. Par exemple, si vous indiquez &amp;quot;^2.6.*&amp;quot;, votre module ne pourra être construit que pour les noyaux 2.6 et une erreur se produira sur les 2.4.&lt;br /&gt;
* BUILD_EXCLUSIVE_ARCH : Cette option fonctionne comme BUILD_EXCLUSIVE_KERNEL mais limite l&#039;architecture du noyau au lieu de sa version. Par exemple, si cette option vaut &amp;quot;i.86&amp;quot; votre module pourra être construit pour i386 ou i586 mais pas ppc, x86_64, ni s390.&lt;br /&gt;
* POST_ADD : Cette option indique le nom d&#039;un script à exécuter après le traitement de la commande add. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
* POST_BUILD : Cette option indique le nom d&#039;un script à exécuter après le traitement de la commande build. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
* POST_INSTALL : Cette option indique le nom d&#039;un script à exécuter après le traitement de la commande install. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
* POST_REMOVE : Cette option indique le nom d&#039;un script à exécuter après le traitement de la commande remove. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
* PRE_BUILD : Cette option indique le nom d&#039;un script à exécuter avant le traitement de la commande build. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
&lt;br /&gt;
=== Intégration avec rpm ===&lt;br /&gt;
&lt;br /&gt;
Les possibilités d&#039;intégration de DKMS avec RPM sont doubles :&lt;br /&gt;
&lt;br /&gt;
* Création manuelle de RPM contenant les sources et le dkms.conf ;&lt;br /&gt;
* Création automatique de rpm contant un module compilé à l&#039;aide de dkms, et dont la gestion est faite par DKMS.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le premier cas, la création du RPM est assez simple si vous savez construire des RPM. Vous indiquez comme source le tar.gz des sources du module et dans la section %install vous copiez les sources vers /usr/src/&amp;lt;nom du module&amp;gt;-&amp;lt;version du module&amp;gt; et vous y écrivez le dkms.conf (Il est également possible de mettre le dkms.conf dans un fichier annexe et de l&#039;inclure comme source, mais l&#039;avoir inclus permet d&#039;utiliser les macros RPM %name, %version, ... afin de créer rapidement un .spec pour un nouveau module). Ensuite vous indiquez en %post et %preun les commandes DKMS à invoquer (add, build et install en %post et remove en %preun).&lt;br /&gt;
Le modèle de fichier spec suivant pourra vous servir de base dans la majorité des cas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;%define module_name rt2500&lt;br /&gt;
&lt;br /&gt;
Name:           dkms-%{module_name}&lt;br /&gt;
Version:        1.4.6.2&lt;br /&gt;
Release:        1mdk&lt;br /&gt;
Summary:        DKMS-ready kernel-source for the RT2500 driver&lt;br /&gt;
License:        GPL&lt;br /&gt;
URL:            http://www.ralinktech.com/supp-1.htm&lt;br /&gt;
Source:         http://www.ralinktech.com/drivers/Linux/RT2500-Linux-STA-%{version}.tar.bz2&lt;br /&gt;
Group:          System/Kernel and hardware&lt;br /&gt;
Requires(pre):  dkms&lt;br /&gt;
Requires(post): dkms&lt;br /&gt;
Buildroot:      %{_tmppath}/%{name}-%{version}-root&lt;br /&gt;
Buildarch:      noarch&lt;br /&gt;
&lt;br /&gt;
%description&lt;br /&gt;
Driver for the Ralink RT2500 802.11g chipset&lt;br /&gt;
&lt;br /&gt;
%prep&lt;br /&gt;
%setup -q -n RT2500-Linux-STA-%{version}&lt;br /&gt;
chmod 0755  Module/2.*.x&lt;br /&gt;
&lt;br /&gt;
%build&lt;br /&gt;
&lt;br /&gt;
%clean&lt;br /&gt;
rm -fr $RPM_BUILD_ROOT&lt;br /&gt;
&lt;br /&gt;
%install&lt;br /&gt;
mkdir -p %{buildroot}/usr/src/%{module_name}-%{version}-%{release}&lt;br /&gt;
cp -a Module/* %{buildroot}/usr/src/%{module_name}-%{version}-%{release}&lt;br /&gt;
cp -af Module/2.6.x/Makefile %{buildroot}/usr/src/%{module_name}-%{version}-%{release}&lt;br /&gt;
cat &amp;gt; %{buildroot}/usr/src/%{module_name}-%{version}-%{release}/dkms.conf &amp;lt;&amp;lt;EOF&lt;br /&gt;
&lt;br /&gt;
PACKAGE_VERSION=&amp;quot;%{version}-%{release}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Items below here should not have to change with each driver version&lt;br /&gt;
PACKAGE_NAME=&amp;quot;%{module_name}&amp;quot;&lt;br /&gt;
MAKE[0]=&amp;quot;make -C \${kernel_source_dir} SUBDIRS=\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build modules&amp;quot;&lt;br /&gt;
CLEAN=&amp;quot;make -C \${kernel_source_dir} SUBDIRS=\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build clean&amp;quot;&lt;br /&gt;
&lt;br /&gt;
BUILT_MODULE_NAME[0]=&amp;quot;\$PACKAGE_NAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DEST_MODULE_LOCATION[0]=&amp;quot;/kernel/drivers/net/wireless/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;ra&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REMAKE_INITRD=&amp;quot;no&amp;quot;&lt;br /&gt;
AUTOINSTALL=yes&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
dkms add -m %{module_name} -v %{version}-%{release} --rpm_safe_upgrade&lt;br /&gt;
dkms build -m %{module_name} -v %{version}-%{release} --rpm_safe_upgrade&lt;br /&gt;
dkms install -m %{module_name} -v %{version}-%{release} --rpm_safe_upgrade&lt;br /&gt;
&lt;br /&gt;
%preun&lt;br /&gt;
dkms remove -m %{module_name} -v %{version}-%{release} --rpm_safe_upgrade --all ||:&lt;br /&gt;
&lt;br /&gt;
%files&lt;br /&gt;
%defattr(-,root,root)&lt;br /&gt;
/usr/src/%{module_name}-%{version}-%{release}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listing 7: Exemple de fichier .spec pour un package DKMS&lt;br /&gt;
&lt;br /&gt;
Il y a peu de remarques à faire sur ce fichier si ce n&#039;est l&#039;importance de ne pas oublier --rpm_safe_upgrade et surtout ||: dans le %preun qui permet que le rpm puisse être désinstallé même si le remove échoue (par exemple parce que le build avait échoué donc le module n&#039;est pas installé).&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est du deuxième cas (création de RPM binaires), c&#039;est encore plus simple, il suffit de compiler le module puis d&#039;utiliser dkms mkrpm en précisant le module, sa version et le ou les noyaux qui vous intéressent. Contrairement aux RPM créés à la main comme précédemment, cette méthode nécessite par contre d&#039;être root sur la machine générant le package (ou d&#039;avoir par exemple un sudo sur la commande dkms).&lt;br /&gt;
&lt;br /&gt;
== Avantages et inconvénients ==&lt;br /&gt;
&lt;br /&gt;
Pour finir, voici une petite liste des avantages et des inconvénients que je vois à utiliser DKMS. Cette liste vous aidera probablement à décider si vous souhaiter essayer de gérer vos pilotes additionnels avec DKMS.&lt;br /&gt;
&lt;br /&gt;
=== Avantages ===&lt;br /&gt;
&lt;br /&gt;
* Il n&#039;y a plus besoin de se préoccuper de ses pilotes additionnels lorsque l&#039;on met à jour son noyau ;&lt;br /&gt;
* Il est beaucoup plus facile de distribuer des pilotes (y compris les modules propriétaires avec une couche libre de jonction). Avec un seul paquetage à installer l&#039;utilisateur n&#039;a rien à faire pour que ça marche sur son noyau ;&lt;br /&gt;
* Il est beaucoup plus facile (et léger) de distribuer des correctifs sur les noyaux. Il n&#039;y a plus besoin de distribuer un nouveau noyau lorsque le problème n&#039;affecte qu&#039;un module, DKMS gérera très bien le remplacement du module original, même si celui-ci n&#039;était initialement pas installé avec DKMS ;&lt;br /&gt;
* Il est possible d&#039;avoir plusieurs versions du module présentes sur sa machine simultanément et de basculer entres elles à l&#039;aide de la commande dkms, ce qui est très pratique pour des tests ;&lt;br /&gt;
* Il est possible de distribuer le module avec la partie userspace associée plutôt qu&#039;avec le noyau, ce qui permet d&#039;éviter les problèmes de désynchronisation.&lt;br /&gt;
&lt;br /&gt;
=== Inconvénients ===&lt;br /&gt;
&lt;br /&gt;
* Le fonctionnement classique de DKMS implique la présence d&#039;un compilateur sur la machine, ce qui est en particulier problématique pour la sécurité des serveurs. Toutefois, DKMS reste utile sans compilateur sur le serveur pour générer depuis une autre machine un RPM contenant la nouvelle version compilée du module et pouvoir ainsi facilement mettre à jour toutes ses machines.&lt;br /&gt;
* De même DKMS a besoin des sources du noyau, ce qui occupe beaucoup d&#039;espace disque.&lt;br /&gt;
* La recompilation dynamique par un service au démarrage n&#039;est pas adaptée pour les modules nécessaires plus tôt (pilotes de contrôleur disque par exemple), il faut donc dans ce cas s&#039;assurer de faire compiler à DKMS le pilote pour le nouveau noyau avant de redémarrer. Cet inconvénient n&#039;en est toutefois pas réellement un dans la mesure où le problème est le même lorsque le module en question est compilé à la main sans DKMS.&lt;br /&gt;
* DKMS est basé sur RPM et ne fonctionnera donc que sur des distributions utilisant RPM (RedHat, Mandriva, SuSE, ...). L&#039;utilisation de rpm est pourtant très localisée (par exemple détection de l&#039;architecture du noyau cible) et il devrait être assez facile de s&#039;en passer.&lt;br /&gt;
* DKMS ne prend pour le moment pas en compte le fichier .config du noyau mais celui par défaut fourni par la distribution pour la famille de noyaux (smp, 64G, ...).&lt;br /&gt;
&lt;br /&gt;
=== Références ===&lt;br /&gt;
&lt;br /&gt;
* [http://linux.dell.com/dkms/dkms.html http://linux.dell.com/dkms/dkms.html]&lt;br /&gt;
* [http://www.linuxjournal.com/article/6896 http://www.linuxjournal.com/article/6896]&lt;br /&gt;
* [http://linux.dell.com/dkms/dkms-ols2004.pdf http://linux.dell.com/dkms/dkms-ols2004.pdf]&lt;br /&gt;
* [http://www.dell.com/downloads/global/power/1q04-ler.pdf http://www.dell.com/downloads/global/power/1q04-ler.pdf]&lt;br /&gt;
* [http://linux.dell.com/dkms/dkms-LWE-Boston2005.pdf http://linux.dell.com/dkms/dkms-LWE-Boston2005.pdf]&lt;br /&gt;
&lt;br /&gt;
Pascal Terjan &amp;lt;pterjan at mandriva dot com&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Cet article a été initialement publié dans le GNU/Linux Magazine 80 de Février 2006&lt;br /&gt;
&lt;br /&gt;
{{Copy|2006|Pascal Terjan|LDL}}&lt;/div&gt;</summary>
		<author><name>Pterjan</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=14537</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=14537"/>
		<updated>2007-04-27T19:29:45Z</updated>

		<summary type="html">&lt;p&gt;Pterjan : ajout de tt autour de quelques chemins&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Configurer votre noyau]]&lt;br /&gt;
&lt;br /&gt;
= DKMS : Donnez l&#039;indépendance à vos pilotes =&lt;br /&gt;
&lt;br /&gt;
== Contexte ==&lt;br /&gt;
&lt;br /&gt;
Sous Linux, les pilotes (le logiciel qui permet au système d&#039;exploitation de communiquer avec le matériel) peuvent soit être directement inclus dans le noyau soit être disponibles sous la forme de modules à charger dans le noyau. Un tel module est compilé pour un noyau particulier et ne peut être utilisé sur un autre.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne les pilotes libres, cela ne pose en général aucun problème car ils sont soit livrés avec votre noyau, soit compilés en même temps que le noyau que vous compilez vous-même.&lt;br /&gt;
&lt;br /&gt;
Dans le cas de pilotes non libres (comme ceux de nVidia ou ATI) ou de pilotes distribués séparément et que vous compilez à la main, le pilote doit être recompilé à chaque version de noyau, ce qui peut devenir fastidieux.&lt;br /&gt;
&lt;br /&gt;
De plus, si vous souhaitez utiliser les pilotes distribués par votre distributeur Linux, vous devez attendre que les pilotes soient recompilés pour le nouveau noyau, et ne pouvez espérer qu&#039;ils fonctionnent avec un noyau que vous auriez personnalisé.&lt;br /&gt;
&lt;br /&gt;
== Objectifs de DKMS ==&lt;br /&gt;
&lt;br /&gt;
DKMS (Dynamic Kernel Module Support ou en français Gestion Dynamique des Modules Noyau) est un système très simple conçu par Dell et permettant de compiler dynamiquement et facilement les modules noyau pour tous les noyaux de votre système. Ce système est à la base conçu pour faciliter à Dell la distribution de pilotes Linux et de correctifs.&lt;br /&gt;
&lt;br /&gt;
Cela évite à la fois aux éditeurs et aux utilisateurs de devoir passer par des mises à jour du noyau pour une correction sur un pilote particulier et permet de distribuer un pilote supplémentaire sous la forme d&#039;un seul paquetage quel que soit le noyau de l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cet article a pour but de présenter ce système, à la fois aux développeurs et distributeurs de modules noyau qui pourraient l&#039;utiliser pour faciliter la vie à leurs utilisateurs, et aux utilisateurs qui peuvent également l&#039;utiliser tout seuls.&lt;br /&gt;
&lt;br /&gt;
== Comment ça marche ==&lt;br /&gt;
&lt;br /&gt;
Le principe de DKMS est très simple. À condition que le module soit prévu pour être utilisé avec DKMS (fourniture d&#039;un dkms.conf), l&#039;utilisation d&#039;un nouveau module en passant par DKMS consiste à exécuter les 3 étapes suivantes :&lt;br /&gt;
&lt;br /&gt;
* Insertion dans l&#039;arbre DKMS (action add)&lt;br /&gt;
* Compilation pour le noyau (action build)&lt;br /&gt;
* Installation avec les autres modules du noyau (action install)&lt;br /&gt;
&lt;br /&gt;
Ces étapes sont séparées et ne sont pas forcement toutes réalisées à la suite. La figure 1 montre les différents états d&#039;un module dans le système DKMS, et les transitions possibles entre ces états à l&#039;aide des actions de la commande dkms.&lt;br /&gt;
&lt;br /&gt;
Figure 1 : États d&#039;un module dans le système DKMS&lt;br /&gt;
&lt;br /&gt;
=== Structure sur le disque ===&lt;br /&gt;
&lt;br /&gt;
Afin de bien séparer la gestion des différentes versions de module et de la version du noyau, le fonctionnement de DKMS se base sur la présence de 3 arborescences :&lt;br /&gt;
&lt;br /&gt;
* Les sources des modules, dans &amp;lt;tt&amp;gt;/usr/src&amp;lt;/tt&amp;gt;&lt;br /&gt;
* L&#039;arborescence des modules du noyau &amp;lt;tt&amp;gt;/lib/modules&amp;lt;/tt&amp;gt; : DKMS y remplacera ou ajoutera les modules que l&#039;on va lui faire gérer&lt;br /&gt;
* L&#039;arborescence de DKMS &amp;lt;tt&amp;gt;/var/lib/dkms&amp;lt;/tt&amp;gt;, contenant :&lt;br /&gt;
          o Les répertoire ou seront construit les modules&lt;br /&gt;
          o Les modules originaux sauvegardés&lt;br /&gt;
          o Les modules générés par DKMS&lt;br /&gt;
&lt;br /&gt;
Les chemins indiqués sont ceux par défaut et il est possible de les modifier dans &amp;lt;tt&amp;gt;/etc/dkms/framework.conf&amp;lt;/tt&amp;gt; mais nous supposerons dans le reste de l&#039;article que les valeurs par défaut ont été conservées.&lt;br /&gt;
&lt;br /&gt;
== Mise en oeuvre de DKMS par un utilisateur ==&lt;br /&gt;
&lt;br /&gt;
=== La commande dkms ===&lt;br /&gt;
&lt;br /&gt;
La gestion des modules au sein du système DKMS se fait à l&#039;aide de la commande dkms. Cette commande a une syntaxe très simple : dkms &amp;lt;action&amp;gt; [options]&lt;br /&gt;
Les actions et les options sont par contre plutôt nombreuses et même si je vous les explique ci-dessous, seules les principales devraient être utiles à la majorité d&#039;entre vous (à savoir: add, build, install, remove en ce qui concerne les actions et -m, -v et --all en ce qui concerne les options).&lt;br /&gt;
&lt;br /&gt;
Voici tout d&#039;abord la liste des options génériques s&#039;appliquant à diverses commandes, celles restreintes à une commande particulière seront expliquées dans la description de celle-ci.&lt;br /&gt;
&lt;br /&gt;
* -m &amp;lt;module&amp;gt; : Le nom du module sur lequel effectuer l&#039;action.&lt;br /&gt;
* -v &amp;lt;version du module&amp;gt; : La version du module sur laquelle effectuer l&#039;action.&lt;br /&gt;
* -k &amp;lt;version du noyau&amp;gt; : La version du noyau sur laquelle effectuer l&#039;action. Il est possible pour certaines actions de spécifier plusieurs versions du noyau en utilisant plusieurs fois -k, si l&#039;action spécifiée ne le supporte pas une erreur sera émise.&lt;br /&gt;
* -a &amp;lt;architecture&amp;gt; : L&#039;architecture pour laquelle effectuer l&#039;action. Si cette option n&#039;est pas précisée, l&#039;architecture choisie est celle indiquée par uname -m. Il est possible de répéter cette option afin d&#039;indiquer plusieurs architectures, mais dans ce cas il doit y avoir exactement autant de -k que de -a. Chaque noyau sera associé à l&#039;architecture de position identique. Par exemple si vous indiquez -k noyau1 -k noyau2 -a i386 -k noyau3 -a i586 -a x86_64, DKMS comprendra que noyau1 est en i386, noyau2 est en i586 et noyau3 est en x86_64.&lt;br /&gt;
* --all : Indique d&#039;appliquer l&#039;action pour toutes les versions de noyau et toutes les architectures pour lesquelles le module a été compilé. Cela est particulièrement utile pour l&#039;action remove.&lt;br /&gt;
* --rpm_safe_upgrade : Cette option est nécessaire pour les commandes DKMS appelées à l&#039;intérieur d&#039;un RPM. Cela évite des problèmes lors de mise à jour d&#039;un RPM à un autre contenant la même version du module. Cela évite aussi les problèmes d&#039;interblocage dus au système de verrous de rpm.&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant étudier ce que permet de faire DKMS à travers le parcours des actions que l&#039;on peut faire effectuer à la commande dkms.&lt;br /&gt;
&lt;br /&gt;
* add : Ajoute à l&#039;arbre des sources de DKMS une version d&#039;un module (les options -m et -v sont donc obligatoires, c&#039;est le cas pour la majorité des commandes). Les sources du module doivent être précédemment placées dans /usr/src/&amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;/ et contenir un fichier dkms.conf. Si le fichier dkms.conf ne se trouve pas dans /usr/src/&amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;/, il faut ajouter l&#039;option -c pour indiquer son chemin.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms add -m exemple -v 0.9.0 -c /tmp/dkms.conf &lt;br /&gt;
Creating symlink /var/lib/dkms/exemple/0.9.0/source -&amp;gt;&lt;br /&gt;
		 /usr/src/exemple-0.9.0&lt;br /&gt;
&lt;br /&gt;
		 DKMS: add Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* remove : Supprime une version d&#039;un module. Il faut en plus des options -m et -v, soit préciser une version de noyau avec l&#039;option -k, soit demander à supprimer le module de tout les noyaux pour lesquelles cette version avait été compilée, avec l&#039;option --all.&lt;br /&gt;
&lt;br /&gt;
      Si le module avait été installé, il est d&#039;abord désinstallé (comme si on avait appelé l&#039;action uninstall) et d&#039;éventuelles versions précédentes sont réinstallées. Après un remove, le module n&#039;est plus du tout connu de DKMS et il faut recommencer à l&#039;étape add.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms remove -m exemple -v 0.9.0 --all&lt;br /&gt;
&lt;br /&gt;
------------------------------&lt;br /&gt;
Deleting module version: 0.9.0&lt;br /&gt;
completely from the DKMS tree.&lt;br /&gt;
------------------------------&lt;br /&gt;
Done.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* build : Compile une version d&#039;un module pour le noyau indiqué avec l&#039;option -k ou pour le noyau utilisé actuellement si aucun n&#039;est précisé. En cas d&#039;erreurs lors de la compilation, il est utile de savoir que celle-ci se déroule dans /var/lib/dkms/&amp;lt;module&amp;gt;/&amp;lt;version du module&amp;gt;/build/ et que tout ce qui est affiché pendant la compilation est enregistré dans un fichier make.log dans ce même répertoire.&lt;br /&gt;
&lt;br /&gt;
      La commande build accepte quelques options facultatives :&lt;br /&gt;
          o --config &amp;lt;fichier .config du noyau&amp;gt; : Cette option permet d&#039;indiquer à la commande build ou trouver le fichier .config si celui-ci n&#039;est pas à l&#039;emplacement standard de la distribution ou n&#039;a pas le nom habituel.&lt;br /&gt;
          o --no-prepare-kernel : Cette option demande à DKMS de ne pas préparer les sources du noyau avant de compiler un module pour lui. Il est recommandé de ne pas utiliser cette option si l&#039;on souhaite que les modules soient correctement construits.&lt;br /&gt;
          o --no-clean-kernel : Cette option demande à DKMS de ne pas nettoyer les sources du noyau après avoir compilé un module.&lt;br /&gt;
          o --kernelsourcedir &amp;lt;chemin vers les sources du noyau&amp;gt; : Cette option permet d&#039;indiquer l&#039;emplacement des sources du noyau lorsqu&#039;elles ne se trouvent pas dans /lib/modules/&amp;lt;version du noyau&amp;gt;/build.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms build -m slmodem -v 2.9.10 -k 2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
&lt;br /&gt;
Preparing kernel 2.6.12-12mdk-i686-up-4GB for module build:&lt;br /&gt;
(This is not compiling a kernel, only just preparing kernel symbols)&lt;br /&gt;
Storing current .config to be restored when complete&lt;br /&gt;
Running Generic preparation routine&lt;br /&gt;
make mrproper.........&lt;br /&gt;
using /boot/config-2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
make oldconfig......&lt;br /&gt;
make prepare-all......&lt;br /&gt;
&lt;br /&gt;
Building module:&lt;br /&gt;
cleaning build area....&lt;br /&gt;
make KERNELRELEASE=2.6.12-12mdk-i686-up-4GB KERNEL_DIR=/lib/modules/2.6.12-12mdk-i686-up-4GB/build drivers....&lt;br /&gt;
cleaning build area....&lt;br /&gt;
cleaning kernel tree (make mrproper)....&lt;br /&gt;
&lt;br /&gt;
DKMS: build Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install : Installe une version d&#039;un module dans l&#039;arborescence du noyau indiqué (ou du noyau utilisé actuellement si aucun n&#039;est précisé par l&#039;option -k). Cette version doit précédemment avoir été compilée pour le noyau en question à l&#039;aide de l&#039;action build.&lt;br /&gt;
&lt;br /&gt;
      Lors de la première installation d&#039;une version d&#039;un module donné sur un noyau donné, DKMS cherche si ce module existait déjà avec ce noyau et le sauvegarde pour pouvoir le réinstaller lorsque l&#039;on demandera à DKMS de désinstaller la nouvelle version. Pour information, la version originale est sauvée dans /var/lib/dkms/&amp;lt;module&amp;gt;/original_module/&amp;lt;version du noyau&amp;gt;/&amp;lt;architecture&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms install -m slmodem -v 2.9.10 -k 2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
Running module version sanity check.&lt;br /&gt;
&lt;br /&gt;
slamr.ko.gz:&lt;br /&gt;
 - Original module&lt;br /&gt;
   - No original module exists within this kernel&lt;br /&gt;
 - Installation&lt;br /&gt;
   - Installing to /lib/modules/2.6.12-12mdk-i686-up-4GB/kernel/drivers/char/&lt;br /&gt;
&lt;br /&gt;
slusb.ko.gz:&lt;br /&gt;
 - Original module&lt;br /&gt;
   - No original module exists within this kernel&lt;br /&gt;
 - Installation&lt;br /&gt;
   - Installing to /lib/modules/2.6.12-12mdk-i686-up-4GB/kernel/drivers/char/&lt;br /&gt;
&lt;br /&gt;
depmod.....&lt;br /&gt;
&lt;br /&gt;
DKMS: install Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* uninstall : Désinstalle une version d&#039;un module pour une version du noyau (celle précisée par l&#039;option -k ou la version utilisée actuellement si aucune n&#039;est précisée). Cette commande ne gère pas l&#039;option --all donc il vous faudra désinstaller pour chaque noyau séparément.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms uninstall -m slmodem -v 2.9.10 -k 2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
&lt;br /&gt;
-------- Uninstall Beginning --------&lt;br /&gt;
Module:  slmodem&lt;br /&gt;
Version: 2.9.10&lt;br /&gt;
Kernel:  2.6.12-12mdk-i686-up-4GB (i586)&lt;br /&gt;
-------------------------------------&lt;br /&gt;
&lt;br /&gt;
Status: Before uninstall, this module version was ACTIVE on this kernel.&lt;br /&gt;
&lt;br /&gt;
slamr.ko.gz:&lt;br /&gt;
 - Uninstallation&lt;br /&gt;
   - Deleting from: /lib/modules/2.6.12-12mdk-i686-up-4GB/kernel/drivers/char/&lt;br /&gt;
 - Original module&lt;br /&gt;
   - No original module was found for this module on this kernel.&lt;br /&gt;
   - Use the dkms install command to reinstall any previous module version.&lt;br /&gt;
&lt;br /&gt;
slusb.ko.gz:&lt;br /&gt;
 - Uninstallation&lt;br /&gt;
   - Deleting from: /lib/modules/2.6.12-12mdk-i686-up-4GB/kernel/drivers/char/&lt;br /&gt;
 - Original module&lt;br /&gt;
   - No original module was found for this module on this kernel.&lt;br /&gt;
   - Use the dkms install command to reinstall any previous module version.&lt;br /&gt;
&lt;br /&gt;
DKMS: uninstall Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* mkrpm : Génére un RPM pour un couple module/version donné. Si vous désirez que le RPM ne contienne que les sources (et donc que les modules soient compilés lors de l&#039;installation), vous devez ajouter l&#039;option --source-only. Sinon, le choix des modules à distribuer se fait à l&#039;aide de -k et -a, comme pour les autres actions.&lt;br /&gt;
&lt;br /&gt;
      Si vous maîtrisez la création de RPM et souhaitez personnaliser ce qui est généré, sachez que DKMS regarde d&#039;abord si /usr/src/&amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;/&amp;lt;module&amp;gt;-dkms-mkrpm.spec existe, si oui l&#039;utilise comme modèle, et sinon utilise /etc/dkms/template-dkms-mkrpm.spec.&lt;br /&gt;
&lt;br /&gt;
* status : Affiche l&#039;état des différents modules pour chaque version, noyau et architecture.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms status&lt;br /&gt;
ipw2200, 1.0.4: added&lt;br /&gt;
slmodem, 2.9.10, 2.6.12-11mdk-i686-up-4GB, i586: installed&lt;br /&gt;
slmodem, 2.9.10, 2.6.12-12mdk-i686-up-4GB, i586: built&lt;br /&gt;
sysprof, 1.0, 2.6.12-12mdk-i686-up-4GB, i586: installed&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* match : Cette commande fort sympathique permet de compiler et installer pour un noyau donné tout les modules qui avaient été installés pour un autre noyau (spécifié par l&#039;option --templatekernel). Par exemple, après exécution de dkms match --templatekernel 2.6.12-11mdk-i686-up-4GB -k 2.6.12-12mdk-i686-up-4GB, toutes les combinaisons module/version qui étaient installées pour le noyau 2.6.12-11mdk-i686-up-4GB le seront pour le noyau 2.6.12-12mdk-i686-up-4GB.&lt;br /&gt;
* mktarball : Crée une archive tar.gz pour le module et la version indiquées. Cette archive contiendra les sources et les modules précédemment compilés. Par défaut l&#039;archive est créée pour le noyau utilisé actuellement. Si vous en souhaitez un (ou plusieurs) autre, vous pouvez l&#039;indiquer en utilisant les options -k et -a. Cette commande dispose également de quelques options supplémentaires :&lt;br /&gt;
          o --archive &amp;lt;fichier.tar.gz&amp;gt; : Permet de préciser le nom à donner à l&#039;archive (ne pas indiquer de chemin, il sera toujours placé dans /var/lib/dkms/&amp;lt;module&amp;gt;/&amp;lt;version du module&amp;gt;/tarball/). Sans cette option, le fichier s&#039;appelle &amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;-&amp;lt;versions des noyaux&amp;gt;.dkms.tar.gz&lt;br /&gt;
          o --binaries-only : Ne pas inclure les sources du module&lt;br /&gt;
          o --sources-only : Ne pas inclure les modules pré compilés. L&#039;archive s&#039;appellera &amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;-source-only.dkms.tar.gz, sauf si vous précisez un autre nom à l&#039;aide de --archive&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms mktarball -m slmodem -v 2.9.10 -k 2.6.12-11mdk-i686-up-4GB -k 2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
Marking modules for 2.6.12-11mdk-i686-up-4GB (i586) for archiving...&lt;br /&gt;
Marking modules for 2.6.12-12mdk-i686-up-4GB (i586) for archiving...&lt;br /&gt;
&lt;br /&gt;
Marking /usr/src/slmodem-2.9.10 for archiving...&lt;br /&gt;
&lt;br /&gt;
Tarball location: /var/lib/dkms/slmodem/2.9.10/tarball/slmodem-2.9.10-kernel2.6.12-11mdk-i686-up-4GB-i586-kernel2.6.12-12mdk-i686-up-4GB-i586.dkms.tar.gz&lt;br /&gt;
&lt;br /&gt;
DKMS: mktarball Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ldtarball : Importe une archive tar.gz créé à l&#039;aide de l&#039;action mktarball et spécifié à l&#039;aide de l&#039;option --archive.&lt;br /&gt;
&lt;br /&gt;
      Les fichiers sont importés dans l&#039;arborescence de DKMS et pas dans celle du noyau, les modules sont donc au mieux dans l&#039;état built(compilé) et il faut lancer ensuite la commande dkms install pour chacun d&#039;eux.&lt;br /&gt;
&lt;br /&gt;
      Par ailleurs, si des fichiers existent déjà lors de l&#039;import, un avertissement sera affiché et ils seront laissés tels quels. Si vous souhaitez que ces éventuels fichiers soient écrasés, il faut ajouter l&#039;option --force.&lt;br /&gt;
* mkdriverdisk : Crée une disquette avec les pilotes pour permettre l&#039;installation d&#039;une distribution, c&#039;est particulièrement utile lorsque le CD d&#039;installation ne contient pas les pilotes pour un nouveau contrôleur disque.&lt;br /&gt;
          o --size &amp;lt;taille de la disquette&amp;gt; : Cette option est utilisée par la commande mkdriverdisk pour décider de la taille de la disquette à créer. La valeur doit être un nombre entier de kilo-octets, divisible par 20, et vaut 1440 si cette option n&#039;est pas précisée.&lt;br /&gt;
          o --distrib &amp;lt;distribution&amp;gt; : Cette option obligatoire indique la distribution cible. Les valeurs actuellement supportées sont suse, UnitedLinux, redhat, redhat1 and redhat2. Red Hat supportant les disquettes de pilotes multi-architecture depuis la RHEL3, redhat1 force à utiliser l&#039;ancien format, redhat2 force à utiliser le nouveau.&lt;br /&gt;
          o --release &amp;lt;version&amp;gt; : Cette option est nécessaire si vous construisez une disquette pour SuSE ou UnitedLinux. Elle indique la version de la distribution, par exemple --distrib suse --release 9.1 indiquera que vous construisez la disquette pour une SuSE 9.1&lt;br /&gt;
      Les options --binaries-only et --sources-only de mktarball peuvent également être utilisées.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation basique ===&lt;br /&gt;
&lt;br /&gt;
Après vous avoir noyé sous les commandes et les options, je pense qu&#039;un exemple d&#039;utilisation classique est nécessaire pour vous persuader de la simplicité d&#039;utilisation. Voici donc comment installer un module exemple, fourni sous la forme de exemple-1.0.tar.gz contenant un unique répertoire exemple-1.0 avec les sources du module et un dkms.conf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd /usr/src&lt;br /&gt;
tar xzf /tmp/exemple-1.0.tar.gz&lt;br /&gt;
dkms add -m exemple -v 1.0&lt;br /&gt;
dkms build -m exemple -v 1.0&lt;br /&gt;
dkms install -m exemple -v 1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listing 1 : Ajout d&#039;un pilote en utilisant DKMS&lt;br /&gt;
&lt;br /&gt;
Si tout s&#039;est bien passé, le module est compilé et installé, et modprobe exemple fonctionne ! Si cela ne s&#039;est pas bien passé, c&#039;est vraisemblablement lors de l&#039;étape build, et vous pouvez essayer de déterminer le problème en allant lire le fichier /var/lib/dkms/exemple/1.0/build/make.log. Si vous n&#039;avez pas les compétences pour cela, le plus simple est d&#039;envoyer ce fichier à l&#039;auteur du dkms.conf afin qu&#039;il corrige l&#039;erreur.&lt;br /&gt;
&lt;br /&gt;
Un mode de distribution courant, que nous détaillerons plus loin, consiste à distribuer les sources et le dkms.conf sous la forme d&#039;un package RPM et non pas d&#039;un tar.gz. Dans ce cas, installer le package RPM suffit et exécutera automatiquement les différentes commandes.&lt;br /&gt;
&lt;br /&gt;
== Mise en oeuvre de DKMS par un distributeur ==&lt;br /&gt;
&lt;br /&gt;
=== Adaptation des sources ===&lt;br /&gt;
DKMS a besoin des sources du module dans le répertoire /usr/src/&amp;lt;nom du module&amp;gt;-&amp;lt;version du module&amp;gt;/ et d&#039;un fichier dkms.conf dans ce même répertoire. Nous allons étudier la syntaxe de ce fichier sur un exemple classique avant de détailler toutes les options disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de dkms.conf pour l&#039;ipw2200 1.0.4 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PACKAGE_VERSION=&amp;quot;1.0.4&amp;quot;&lt;br /&gt;
PACKAGE_NAME=&amp;quot;ipw2200&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MAKE[0]=&amp;quot;make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules HOSTAP_SRC=${kernel_source_dir}/3rdparty/hostap/&amp;quot;&lt;br /&gt;
CLEAN=&amp;quot;make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build clean&amp;quot;&lt;br /&gt;
&lt;br /&gt;
BUILT_MODULE_NAME[0]=&amp;quot;$PACKAGE_NAME&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[1]=&amp;quot;ieee80211_crypt_ccmp&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[2]=&amp;quot;ieee80211_crypt&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[3]=&amp;quot;ieee80211_crypt_tkip&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[4]=&amp;quot;ieee80211_crypt_wep&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[5]=&amp;quot;ieee80211&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[0]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[1]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[2]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[3]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[4]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[5]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;eth&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REMAKE_INITRD=&amp;quot;no&amp;quot;&lt;br /&gt;
AUTOINSTALL=&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listing 2: Exemple de dkms.conf pour le pilote ipw2200 version 1.0.4&lt;br /&gt;
&lt;br /&gt;
Comme vous pouvez le voir ce fichier a une syntaxe très simple, une option par ligne sous la forme OPTION=&amp;quot;valeur&amp;quot;. Voyons maintenant plus précisément à quoi correspondent les options définies dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
PACKAGE_VERSION et PACKAGE_NAME ne méritent je pense aucune explication. Il est toutefois intéressant de noter que lors de la sortie d&#039;une nouvelle version du module, la seule ligne à modifier dans le dkms.conf est en général PACKAGE_VERSION.&lt;br /&gt;
&lt;br /&gt;
MAKE[0] contient la commande à exécuter pour compiler le module, elle peut utiliser de nombreuses variables, listées dans la section suivante. La majorité des modules peuvent se compiler avec la commande suivante : make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules&lt;br /&gt;
&lt;br /&gt;
CLEAN contient une commande permettant de nettoyer le répertoire de construction, elle est appelée avant et après la compilation du module.&lt;br /&gt;
&lt;br /&gt;
Les 12 lignes suivantes indiquent les modules générés (ici il y en a 6) et ou il faut les installer. BUILT_MODULE_NAME[i] contient le nom du module numéro i (en commençant à 0) et DEST_MODULE_LOCATION[i] le chemin où installer le module numéro i. Le chemin est relatif à l&#039;arborescence des modules du noyau concerné, /lib/modules/&amp;lt;version du noyau&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
L&#039;option MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;eth&amp;quot; indique qu&#039;il faudra ajouter dans /etc/modprobe.conf (ou modules.conf) un alias vers ce module qui s&#039;appelera eth0 (ou eth1, eth2, ... selon ce qui est déjà pris).&lt;br /&gt;
&lt;br /&gt;
REMAKE_INITRD=&amp;quot;no&amp;quot; indique que ce pilote n&#039;a pas besoin d&#039;être dans l&#039;initrd. L&#039;initrd est l&#039;image contenant tout les modules et commandes nécessaires pour accéder au disque dur, cette option a donc rarement besoin d&#039;être à yes en dehors des pilotes de contrôleur disque.&lt;br /&gt;
&lt;br /&gt;
AUTOINSTALL=&amp;quot;yes&amp;quot; indique que l&#039;on veut que ce module soit compilé et installé automatiquement lorsque l&#039;on démarre sur un nouveau noyau.&lt;br /&gt;
&lt;br /&gt;
=== Variables disponibles ===&lt;br /&gt;
&lt;br /&gt;
Quelques variables peut être utilisées dans les options et les commandes comme vous pouvez le voir dans la commande MAKE[0] de l&#039;exemple précédent. Ces variables sont définies par la configuration de DKMS ou par les options passées à la commande dkms.&lt;br /&gt;
&lt;br /&gt;
* $kernelver : Cette variable contient la version du noyau pour laquelle le module est en train d&#039;être construit. C&#039;est particulièrement utile dans la définition de la commande MAKE, par exemple MAKE[0]=&amp;quot;make INCLUDEDIR=/lib/modules/${kernelver}/build/include&amp;quot;&lt;br /&gt;
* $dkms_tree : Cette variable indique ou se trouve l&#039;arbre DKMS sur le système local. Par défaut il s&#039;agit de /var/lib/dkms, mais cette valeur ne doit pas être mise en dur dans les dkms.conf au cas ou l&#039;utilisateur aurait changé cela sur son système (Un tel réglage se fait à l&#039;aide de /etc/dkms/framework.conf ou en ajoutant l&#039;option --dkmstree lors de l&#039;appel, mais nous ne verrons pas ce genre d&#039;utilisations avancées dans cette article).&lt;br /&gt;
* $source_tree : Cette variable indique ou DKMS stocke les sources des modules sur le système. Par défaut il s&#039;agit de /usr/src, mais cette valeur ne doit pas être mise en dur dans les dkms.conf au cas ou l&#039;utilisateur aurait changé cela sur son système (à l&#039;aide de /etc/dkms/framework.conf ou en ajoutant l&#039;option --sourcetree lors de l&#039;appel).&lt;br /&gt;
* $kernel_source_dir : Cette variable contient le chemin vers les sources du kernel pour lequel on construit le module. Il s&#039;agit en général de /lib/modules/$kernelver/build, à moins qu&#039;un autre chemin ait été spécifié avec l&#039;option --kernel-sourcedir&lt;br /&gt;
&lt;br /&gt;
=== Options que l&#039;on peut définir dans le fichier dkms.conf ===&lt;br /&gt;
Tout d&#039;abord, le nom des options est sensible à la casse donc elles doivent être écrites en majuscules. Seules 4 options sont obligatoires :&lt;br /&gt;
&lt;br /&gt;
* PACKAGE_NAME : le nom du package&lt;br /&gt;
* PACKAGE_VERSION : la version du package&lt;br /&gt;
* BUILT_MODULE_NAME[0] : le nom du module construit. S&#039;il y en a plusieurs, ça sera BUILT_MODULE_NAME[1], BUILT_MODULE_NAME[2], ... Les modules non listés ici ne seront pas installés même s&#039;il sont construit par la commande MAKE[0]&lt;br /&gt;
* DEST_MODULE_LOCATION[0] : l&#039;emplacement ou installer le module numéro 0. Ce chemin est relatif au répertoire des modules, et sera par exemple &amp;quot;3rdparty&amp;quot;. Il faut renseigner DEST_MODULE_LOCATION[#] pour chaque module listé dans BUILT_MODULE_NAME&lt;br /&gt;
&lt;br /&gt;
De nombreuses autres options bien pratiques mais facultatives dont disponibles :&lt;br /&gt;
&lt;br /&gt;
* MAKE[#] : la commande pour compiler le(s) modules. Voir l&#039;explication de MAKE_MATCH pour la signification du numéro passé en paramètre. Cette option est facultative dans la mesure ou la commande standard de construction d&#039;un module kernel sera utilisée si elle n&#039;est pas définie.&lt;br /&gt;
* MAKE_MATCH[#] : cet ensemble d&#039;options permet d&#039;avoir une commande de construction différente en fonction des versions du kernel. Chacune contient une expression régulière qui sera comparée à la version du noyau. Le numéro de la dernière qui correspond indiquera le numéro de commande MAKE à utiliser.&lt;br /&gt;
* BUILT_MODULE_LOCATION[#] : le chemin relatif vers le module généré. Cela est nécessaire lorsque le module est généré dans un sous répertoire du répertoire de compilation.&lt;br /&gt;
* DEST_MODULE_NAME[#] : le nom a utiliser pour installer le module, s&#039;il y a besoin de le renommer. L&#039;extension (.o ou .ko) ne doit pas être spécifiée. Par défaut le nom original BUILT_MODULE_NAME[#] est conservé.&lt;br /&gt;
* MODULES_CONF_ALIAS_TYPE[#] : cette option indique pour chaque module quel alias créer dans /etc/modprobe.conf. DKMS calculera automatiquement le numéro de l&#039;alias en fonction de ceux qui existent déjà. Par exemple si MODULES_CONF_ALIAS_TYPE[0] contient eth et que vous avez déjà eth0 et eth1 définis dans /etc/modprobe.conf, DKMS ajoutera un alias eth2 vers le module. Cette fonctionnalité est à utiliser avec précaution dans la mesure ou elle gère mal les cas complexes, comme par exemple les systèmes avec plusieurs cartes réseau utilisant le même module.&lt;br /&gt;
* MODULES_CONF_OBSOLETES[#] : cette option indique à DKMS quels modules vers lesquels pointent des alias dans /etc/modprobe.conf doivent être remplacés par ce nouveau module. Si il y en a plusieurs, les séparer par une virgule. Je pense que ce sera plus clair sur un exemple. Considérons le fichier modprobe.conf suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;alias eth0 bcm4400&lt;br /&gt;
alias eth1 e1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      Si l&#039;on se contente des options suivantes, DKMS n&#039;a aucun moyen de deviner que b44 et bcm4400 gèrent la même carte et un nouvel alias sera généré.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;BUILT_MODULE_NAME[0]=&amp;quot;b44&amp;quot;&lt;br /&gt;
MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;eth&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      Le nouveau modprobe.conf contiendra donc :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;alias eth0 bcm4400&lt;br /&gt;
alias eth1 e1000&lt;br /&gt;
alias eth2 b44&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      Si par contre on ajoute MODULES_CONF_OBSOLETES[0]=&amp;quot;bcm4400&amp;quot;, le nouveau modprobe.conf sera correct :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;alias eth0 b44&lt;br /&gt;
alias eth1 e1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* MODULES_CONF_OBSOLETE_ONLY[#] : Si cette option vaut yes, DKMS ne modifiera modprobe.conf que s&#039;il trouve un alias vers un module obsolète à remplacer. Il n&#039;y aura donc jamais de nouveaux alias de créés.&lt;br /&gt;
* STRIP[#] : Par défaut, les symboles de deboguage sont supprimés des modules à l&#039;aide de strip -g. Positionner cette option à &amp;quot;no&amp;quot; pour l&#039;un des modules permet de les conserver dans ce module.&lt;br /&gt;
* REMAKE_INITRD : Cette option indique, lorsque la première lettre est y ou Y, qu&#039;il faut régénérer l&#039;initrd après l&#039;installation d&#039;une nouvelle version du module. C&#039;est surtout nécessaire pour les pilotes de contrôleur disque.&lt;br /&gt;
* MODULES_CONF[#] : Cette option permet d&#039;indiquer des lignes à ajouter au fichier modprobe.conf. Lorsqu&#039;une première version du module est installée sur l&#039;un des noyaux, les lignes de MODULES_CONF sont ajoutées au fichier modprobe.conf (avant que l&#039;initrd soit régénéré si REMAKE_INITRD est activé). Elles sont supprimées lorsque la dernière version est désinstallée. On peut imaginer par exemple dans le cas de l&#039;ipw2200 MODULES_CONF[0]=&amp;quot;options ipw2200 led=1&amp;quot;.&lt;br /&gt;
* PATCH[#] : Cette option permet d&#039;indiquer des patchs à appliquer sur les sources du pilote avant de le compiler. Tout les patchs doivent se trouver dans /usr/src/&amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;/patches/ et sont appliqués avec patch -p1. Vous pouvez spécifier pour quels noyaux chaque patch doit être appliqué en utilisant l&#039;option PATCH_MATCH ci-dessous.&lt;br /&gt;
* PATCH_MATCH[#] : Cette option sert à indiquer pour quels noyaux les patchs contenus dans le tableau PATCH doivent être appliqués. PATCH_MATCH[i] contient une expression régulière qui est comparés à la version du noyau cible pour décider si PATCH[i] doit être appliqué.&lt;br /&gt;
* AUTOINSTALL : Si cette option vaut &amp;quot;yes&amp;quot;, le service dkms (/etc/rc.d/init.d/dkms) essayera automatiquement de construire et installer ce module sur le noyau sur lequel vous démarrez. Ce service ne fera toutefois rien si plusieurs versions du module sont présentes dans l&#039;arbre DKMS, ce sera à vous de décider laquelle vous souhaitez.&lt;br /&gt;
* BUILD_EXCLUSIVE_KERNEL : Cette option permet d&#039;indiquer une expression régulière décrivant les versions de noyau pour lesquelles DKMS est autorisé à construire votre module. Si vous essayez de construire le module pour un noyau ne correspondant pas à cette expression régulière, DKMS provoquera une erreur. Par exemple, si vous indiquez &amp;quot;^2.6.*&amp;quot;, votre module ne pourra être construit que pour les noyaux 2.6 et une erreur se produira sur les 2.4.&lt;br /&gt;
* BUILD_EXCLUSIVE_ARCH : Cette option fonctionne comme BUILD_EXCLUSIVE_KERNEL mais limite l&#039;architecture du noyau au lieu de sa version. Par exemple, si cette option vaut &amp;quot;i.86&amp;quot; votre module pourra être construit pour i386 ou i586 mais pas ppc, x86_64, ni s390.&lt;br /&gt;
* POST_ADD : Cette option indique le nom d&#039;un script à exécuter après le traitement de la commande add. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
* POST_BUILD : Cette option indique le nom d&#039;un script à exécuter après le traitement de la commande build. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
* POST_INSTALL : Cette option indique le nom d&#039;un script à exécuter après le traitement de la commande install. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
* POST_REMOVE : Cette option indique le nom d&#039;un script à exécuter après le traitement de la commande remove. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
* PRE_BUILD : Cette option indique le nom d&#039;un script à exécuter avant le traitement de la commande build. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
&lt;br /&gt;
=== Intégration avec rpm ===&lt;br /&gt;
&lt;br /&gt;
Les possibilités d&#039;intégration de DKMS avec RPM sont doubles :&lt;br /&gt;
&lt;br /&gt;
* Création manuelle de RPM contenant les sources et le dkms.conf ;&lt;br /&gt;
* Création automatique de rpm contant un module compilé à l&#039;aide de dkms, et dont la gestion est faite par DKMS.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le premier cas, la création du RPM est assez simple si vous savez construire des RPM. Vous indiquez comme source le tar.gz des sources du module et dans la section %install vous copiez les sources vers /usr/src/&amp;lt;nom du module&amp;gt;-&amp;lt;version du module&amp;gt; et vous y écrivez le dkms.conf (Il est également possible de mettre le dkms.conf dans un fichier annexe et de l&#039;inclure comme source, mais l&#039;avoir inclus permet d&#039;utiliser les macros RPM %name, %version, ... afin de créer rapidement un .spec pour un nouveau module). Ensuite vous indiquez en %post et %preun les commandes DKMS à invoquer (add, build et install en %post et remove en %preun).&lt;br /&gt;
Le modèle de fichier spec suivant pourra vous servir de base dans la majorité des cas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;%define module_name rt2500&lt;br /&gt;
&lt;br /&gt;
Name:           dkms-%{module_name}&lt;br /&gt;
Version:        1.4.6.2&lt;br /&gt;
Release:        1mdk&lt;br /&gt;
Summary:        DKMS-ready kernel-source for the RT2500 driver&lt;br /&gt;
License:        GPL&lt;br /&gt;
URL:            http://www.ralinktech.com/supp-1.htm&lt;br /&gt;
Source:         http://www.ralinktech.com/drivers/Linux/RT2500-Linux-STA-%{version}.tar.bz2&lt;br /&gt;
Group:          System/Kernel and hardware&lt;br /&gt;
Requires(pre):  dkms&lt;br /&gt;
Requires(post): dkms&lt;br /&gt;
Buildroot:      %{_tmppath}/%{name}-%{version}-root&lt;br /&gt;
Buildarch:      noarch&lt;br /&gt;
&lt;br /&gt;
%description&lt;br /&gt;
Driver for the Ralink RT2500 802.11g chipset&lt;br /&gt;
&lt;br /&gt;
%prep&lt;br /&gt;
%setup -q -n RT2500-Linux-STA-%{version}&lt;br /&gt;
chmod 0755  Module/2.*.x&lt;br /&gt;
&lt;br /&gt;
%build&lt;br /&gt;
&lt;br /&gt;
%clean&lt;br /&gt;
rm -fr $RPM_BUILD_ROOT&lt;br /&gt;
&lt;br /&gt;
%install&lt;br /&gt;
mkdir -p %{buildroot}/usr/src/%{module_name}-%{version}-%{release}&lt;br /&gt;
cp -a Module/* %{buildroot}/usr/src/%{module_name}-%{version}-%{release}&lt;br /&gt;
cp -af Module/2.6.x/Makefile %{buildroot}/usr/src/%{module_name}-%{version}-%{release}&lt;br /&gt;
cat &amp;gt; %{buildroot}/usr/src/%{module_name}-%{version}-%{release}/dkms.conf &amp;lt;&amp;lt;EOF&lt;br /&gt;
&lt;br /&gt;
PACKAGE_VERSION=&amp;quot;%{version}-%{release}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Items below here should not have to change with each driver version&lt;br /&gt;
PACKAGE_NAME=&amp;quot;%{module_name}&amp;quot;&lt;br /&gt;
MAKE[0]=&amp;quot;make -C \${kernel_source_dir} SUBDIRS=\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build modules&amp;quot;&lt;br /&gt;
CLEAN=&amp;quot;make -C \${kernel_source_dir} SUBDIRS=\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build clean&amp;quot;&lt;br /&gt;
&lt;br /&gt;
BUILT_MODULE_NAME[0]=&amp;quot;\$PACKAGE_NAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DEST_MODULE_LOCATION[0]=&amp;quot;/kernel/drivers/net/wireless/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;ra&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REMAKE_INITRD=&amp;quot;no&amp;quot;&lt;br /&gt;
AUTOINSTALL=yes&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
dkms add -m %{module_name} -v %{version}-%{release} --rpm_safe_upgrade&lt;br /&gt;
dkms build -m %{module_name} -v %{version}-%{release} --rpm_safe_upgrade&lt;br /&gt;
dkms install -m %{module_name} -v %{version}-%{release} --rpm_safe_upgrade&lt;br /&gt;
&lt;br /&gt;
%preun&lt;br /&gt;
dkms remove -m %{module_name} -v %{version}-%{release} --rpm_safe_upgrade --all ||:&lt;br /&gt;
&lt;br /&gt;
%files&lt;br /&gt;
%defattr(-,root,root)&lt;br /&gt;
/usr/src/%{module_name}-%{version}-%{release}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listing 7: Exemple de fichier .spec pour un package DKMS&lt;br /&gt;
&lt;br /&gt;
Il y a peu de remarques à faire sur ce fichier si ce n&#039;est l&#039;importance de ne pas oublier --rpm_safe_upgrade et surtout ||: dans le %preun qui permet que le rpm puisse être désinstallé même si le remove échoue (par exemple parce que le build avait échoué donc le module n&#039;est pas installé).&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est du deuxième cas (création de RPM binaires), c&#039;est encore plus simple, il suffit de compiler le module puis d&#039;utiliser dkms mkrpm en précisant le module, sa version et le ou les noyaux qui vous intéressent. Contrairement aux RPM créés à la main comme précédemment, cette méthode nécessite par contre d&#039;être root sur la machine générant le package (ou d&#039;avoir par exemple un sudo sur la commande dkms).&lt;br /&gt;
&lt;br /&gt;
== Avantages et inconvénients ==&lt;br /&gt;
&lt;br /&gt;
Pour finir, voici une petite liste des avantages et des inconvénients que je vois à utiliser DKMS. Cette liste vous aidera probablement à décider si vous souhaiter essayer de gérer vos pilotes additionnels avec DKMS.&lt;br /&gt;
&lt;br /&gt;
=== Avantages ===&lt;br /&gt;
&lt;br /&gt;
* Il n&#039;y a plus besoin de se préoccuper de ses pilotes additionnels lorsque l&#039;on met à jour son noyau ;&lt;br /&gt;
* Il est beaucoup plus facile de distribuer des pilotes (y compris les modules propriétaires avec une couche libre de jonction). Avec un seul paquetage à installer l&#039;utilisateur n&#039;a rien à faire pour que ça marche sur son noyau ;&lt;br /&gt;
* Il est beaucoup plus facile (et léger) de distribuer des correctifs sur les noyaux. Il n&#039;y a plus besoin de distribuer un nouveau noyau lorsque le problème n&#039;affecte qu&#039;un module, DKMS gérera très bien le remplacement du module original, même si celui-ci n&#039;était initialement pas installé avec DKMS ;&lt;br /&gt;
* Il est possible d&#039;avoir plusieurs versions du module présentes sur sa machine simultanément et de basculer entres elles à l&#039;aide de la commande dkms, ce qui est très pratique pour des tests ;&lt;br /&gt;
* Il est possible de distribuer le module avec la partie userspace associée plutôt qu&#039;avec le noyau, ce qui permet d&#039;éviter les problèmes de désynchronisation.&lt;br /&gt;
&lt;br /&gt;
=== Inconvénients ===&lt;br /&gt;
&lt;br /&gt;
* Le fonctionnement classique de DKMS implique la présence d&#039;un compilateur sur la machine, ce qui est en particulier problématique pour la sécurité des serveurs. Toutefois, DKMS reste utile sans compilateur sur le serveur pour générer depuis une autre machine un RPM contenant la nouvelle version compilée du module et pouvoir ainsi facilement mettre à jour toutes ses machines.&lt;br /&gt;
* De même DKMS a besoin des sources du noyau, ce qui occupe beaucoup d&#039;espace disque.&lt;br /&gt;
* La recompilation dynamique par un service au démarrage n&#039;est pas adaptée pour les modules nécessaires plus tôt (pilotes de contrôleur disque par exemple), il faut donc dans ce cas s&#039;assurer de faire compiler à DKMS le pilote pour le nouveau noyau avant de redémarrer. Cet inconvénient n&#039;en est toutefois pas réellement un dans la mesure où le problème est le même lorsque le module en question est compilé à la main sans DKMS.&lt;br /&gt;
* DKMS est basé sur RPM et ne fonctionnera donc que sur des distributions utilisant RPM (RedHat, Mandriva, SuSE, ...). L&#039;utilisation de rpm est pourtant très localisée (par exemple détection de l&#039;architecture du noyau cible) et il devrait être assez facile de s&#039;en passer.&lt;br /&gt;
* DKMS ne prend pour le moment pas en compte le fichier .config du noyau mais celui par défaut fourni par la distribution pour la famille de noyaux (smp, 64G, ...).&lt;br /&gt;
&lt;br /&gt;
=== Références ===&lt;br /&gt;
&lt;br /&gt;
* [http://linux.dell.com/dkms/dkms.html http://linux.dell.com/dkms/dkms.html]&lt;br /&gt;
* [http://www.linuxjournal.com/article/6896 http://www.linuxjournal.com/article/6896]&lt;br /&gt;
* [http://linux.dell.com/dkms/dkms-ols2004.pdf http://linux.dell.com/dkms/dkms-ols2004.pdf]&lt;br /&gt;
* [http://www.dell.com/downloads/global/power/1q04-ler.pdf http://www.dell.com/downloads/global/power/1q04-ler.pdf]&lt;br /&gt;
* [http://linux.dell.com/dkms/dkms-LWE-Boston2005.pdf http://linux.dell.com/dkms/dkms-LWE-Boston2005.pdf]&lt;br /&gt;
&lt;br /&gt;
Pascal Terjan &amp;lt;pterjan at mandriva dot com&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Cet article a été initialement publié dans le GNU/Linux Magazine 80 de Février 2006&lt;br /&gt;
&lt;br /&gt;
{{Copy|2006|Pascal Terjan|LDL}}&lt;/div&gt;</summary>
		<author><name>Pterjan</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12755</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12755"/>
		<updated>2006-06-10T10:34:26Z</updated>

		<summary type="html">&lt;p&gt;Pterjan : /* Comment ça marche */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Configurer votre noyau]]&lt;br /&gt;
&lt;br /&gt;
= DKMS : Donnez l&#039;indépendance à vos pilotes =&lt;br /&gt;
&lt;br /&gt;
== Contexte ==&lt;br /&gt;
&lt;br /&gt;
Sous Linux, les pilotes (le logiciel qui permet au système d&#039;exploitation de communiquer avec le matériel) peuvent soit être directement inclus dans le noyau soit être disponibles sous la forme de modules à charger dans le noyau. Un tel module est compilé pour un noyau particulier et ne peut être utilisé sur un autre.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne les pilotes libres, cela ne pose en général aucun problème car ils sont soit livrés avec votre noyau, soit compilés en même temps que le noyau que vous compilez vous-même.&lt;br /&gt;
&lt;br /&gt;
Dans le cas de pilotes non libres (comme ceux de nVidia ou ATI) ou de pilotes distribués séparément et que vous compilez à la main, le pilote doit être recompilé à chaque version de noyau, ce qui peut devenir fastidieux.&lt;br /&gt;
&lt;br /&gt;
De plus, si vous souhaitez utiliser les pilotes distribués par votre distributeur Linux, vous devez attendre que les pilotes soient recompilés pour le nouveau noyau, et ne pouvez espérer qu&#039;ils fonctionnent avec un noyau que vous auriez personnalisé.&lt;br /&gt;
&lt;br /&gt;
== Objectifs de DKMS ==&lt;br /&gt;
&lt;br /&gt;
DKMS (Dynamic Kernel Module Support ou en français Gestion Dynamique des Modules Noyau) est un système très simple conçu par Dell et permettant de compiler dynamiquement et facilement les modules noyau pour tous les noyaux de votre système. Ce système est à la base conçu pour faciliter à Dell la distribution de pilotes Linux et de correctifs.&lt;br /&gt;
&lt;br /&gt;
Cela évite à la fois aux éditeurs et aux utilisateurs de devoir passer par des mises à jour du noyau pour une correction sur un pilote particulier et permet de distribuer un pilote supplémentaire sous la forme d&#039;un seul paquetage quel que soit le noyau de l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
Cet article a pour but de présenter ce système, à la fois aux développeurs et distributeurs de modules noyau qui pourraient l&#039;utiliser pour faciliter la vie à leurs utilisateurs, et aux utilisateurs qui peuvent également l&#039;utiliser tout seuls.&lt;br /&gt;
&lt;br /&gt;
== Comment ça marche ==&lt;br /&gt;
&lt;br /&gt;
Le principe de DKMS est très simple. À condition que le module soit prévu pour être utilisé avec DKMS (fourniture d&#039;un dkms.conf), l&#039;utilisation d&#039;un nouveau module en passant par DKMS consiste à exécuter les 3 étapes suivantes :&lt;br /&gt;
&lt;br /&gt;
* Insertion dans l&#039;arbre DKMS (action add)&lt;br /&gt;
* Compilation pour le noyau (action build)&lt;br /&gt;
* Installation avec les autres modules du noyau (action install)&lt;br /&gt;
&lt;br /&gt;
Ces étapes sont séparées et ne sont pas forcement toutes réalisées à la suite. La figure 1 montre les différents états d&#039;un module dans le système DKMS, et les transitions possibles entre ces états à l&#039;aide des actions de la commande dkms.&lt;br /&gt;
&lt;br /&gt;
Figure 1 : États d&#039;un module dans le système DKMS&lt;br /&gt;
&lt;br /&gt;
=== Structure sur le disque ===&lt;br /&gt;
&lt;br /&gt;
Afin de bien séparer la gestion des différentes versions de module et de la version du noyau, le fonctionnement de DKMS se base sur la présence de 3 arborescences :&lt;br /&gt;
&lt;br /&gt;
* Les sources des modules, dans &amp;lt;tt&amp;gt;/usr/src&amp;lt;/tt&amp;gt;&lt;br /&gt;
* L&#039;arborescence des modules du noyau/lib/modules : DKMS y remplacera ou ajoutera les modules que l&#039;on va lui faire gérer&lt;br /&gt;
* L&#039;arborescence de DKMS /var/lib/dkms, contenant :&lt;br /&gt;
          o Les répertoire ou seront construit les modules&lt;br /&gt;
          o Les modules originaux sauvegardés&lt;br /&gt;
          o Les modules générés par DKMS&lt;br /&gt;
&lt;br /&gt;
Les chemins indiqués sont ceux par défaut et il est possible de les modifier dans &amp;lt;tt&amp;gt;/etc/dkms/framework.conf&amp;lt;/tt&amp;gt; mais nous supposerons dans le reste de l&#039;article que les valeurs par défaut ont été conservées.&lt;br /&gt;
&lt;br /&gt;
== Mise en oeuvre de DKMS par un utilisateur ==&lt;br /&gt;
&lt;br /&gt;
=== La commande dkms ===&lt;br /&gt;
&lt;br /&gt;
La gestion des modules au sein du système DKMS se fait à l&#039;aide de la commande dkms. Cette commande a une syntaxe très simple : dkms &amp;lt;action&amp;gt; [options]&lt;br /&gt;
Les actions et les options sont par contre plutôt nombreuses et même si je vous les explique ci-dessous, seules les principales devraient être utiles à la majorité d&#039;entre vous (à savoir: add, build, install, remove en ce qui concerne les actions et -m, -v et --all en ce qui concerne les options).&lt;br /&gt;
&lt;br /&gt;
Voici tout d&#039;abord la liste des options génériques s&#039;appliquant à diverses commandes, celles restreintes à une commande particulière seront expliquées dans la description de celle-ci.&lt;br /&gt;
&lt;br /&gt;
* -m &amp;lt;module&amp;gt; : Le nom du module sur lequel effectuer l&#039;action.&lt;br /&gt;
* -v &amp;lt;version du module&amp;gt; : La version du module sur laquelle effectuer l&#039;action.&lt;br /&gt;
* -k &amp;lt;version du noyau&amp;gt; : La version du noyau sur laquelle effectuer l&#039;action. Il est possible pour certaines actions de spécifier plusieurs versions du noyau en utilisant plusieurs fois -k, si l&#039;action spécifiée ne le supporte pas une erreur sera émise.&lt;br /&gt;
* -a &amp;lt;architecture&amp;gt; : L&#039;architecture pour laquelle effectuer l&#039;action. Si cette option n&#039;est pas précisée, l&#039;architecture choisie est celle indiquée par uname -m. Il est possible de répéter cette option afin d&#039;indiquer plusieurs architectures, mais dans ce cas il doit y avoir exactement autant de -k que de -a. Chaque noyau sera associé à l&#039;architecture de position identique. Par exemple si vous indiquez -k noyau1 -k noyau2 -a i386 -k noyau3 -a i586 -a x86_64, DKMS comprendra que noyau1 est en i386, noyau2 est en i586 et noyau3 est en x86_64.&lt;br /&gt;
* --all : Indique d&#039;appliquer l&#039;action pour toutes les versions de noyau et toutes les architectures pour lesquelles le module a été compilé. Cela est particulièrement utile pour l&#039;action remove.&lt;br /&gt;
* --rpm_safe_upgrade : Cette option est nécessaire pour les commandes DKMS appelées à l&#039;intérieur d&#039;un RPM. Cela évite des problèmes lors de mise à jour d&#039;un RPM à un autre contenant la même version du module. Cela évite aussi les problèmes d&#039;interblocage dus au système de verrous de rpm.&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant étudier ce que permet de faire DKMS à travers le parcours des actions que l&#039;on peut faire effectuer à la commande dkms.&lt;br /&gt;
&lt;br /&gt;
* add : Ajoute à l&#039;arbre des sources de DKMS une version d&#039;un module (les options -m et -v sont donc obligatoires, c&#039;est le cas pour la majorité des commandes). Les sources du module doivent être précédemment placées dans /usr/src/&amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;/ et contenir un fichier dkms.conf. Si le fichier dkms.conf ne se trouve pas dans /usr/src/&amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;/, il faut ajouter l&#039;option -c pour indiquer son chemin.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms add -m exemple -v 0.9.0 -c /tmp/dkms.conf &lt;br /&gt;
Creating symlink /var/lib/dkms/exemple/0.9.0/source -&amp;gt;&lt;br /&gt;
		 /usr/src/exemple-0.9.0&lt;br /&gt;
&lt;br /&gt;
		 DKMS: add Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* remove : Supprime une version d&#039;un module. Il faut en plus des options -m et -v, soit préciser une version de noyau avec l&#039;option -k, soit demander à supprimer le module de tout les noyaux pour lesquelles cette version avait été compilée, avec l&#039;option --all.&lt;br /&gt;
&lt;br /&gt;
      Si le module avait été installé, il est d&#039;abord désinstallé (comme si on avait appelé l&#039;action uninstall) et d&#039;éventuelles versions précédentes sont réinstallées. Après un remove, le module n&#039;est plus du tout connu de DKMS et il faut recommencer à l&#039;étape add.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms remove -m exemple -v 0.9.0 --all&lt;br /&gt;
&lt;br /&gt;
------------------------------&lt;br /&gt;
Deleting module version: 0.9.0&lt;br /&gt;
completely from the DKMS tree.&lt;br /&gt;
------------------------------&lt;br /&gt;
Done.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* build : Compile une version d&#039;un module pour le noyau indiqué avec l&#039;option -k ou pour le noyau utilisé actuellement si aucun n&#039;est précisé. En cas d&#039;erreurs lors de la compilation, il est utile de savoir que celle-ci se déroule dans /var/lib/dkms/&amp;lt;module&amp;gt;/&amp;lt;version du module&amp;gt;/build/ et que tout ce qui est affiché pendant la compilation est enregistré dans un fichier make.log dans ce même répertoire.&lt;br /&gt;
&lt;br /&gt;
      La commande build accepte quelques options facultatives :&lt;br /&gt;
          o --config &amp;lt;fichier .config du noyau&amp;gt; : Cette option permet d&#039;indiquer à la commande build ou trouver le fichier .config si celui-ci n&#039;est pas à l&#039;emplacement standard de la distribution ou n&#039;a pas le nom habituel.&lt;br /&gt;
          o --no-prepare-kernel : Cette option demande à DKMS de ne pas préparer les sources du noyau avant de compiler un module pour lui. Il est recommandé de ne pas utiliser cette option si l&#039;on souhaite que les modules soient correctement construits.&lt;br /&gt;
          o --no-clean-kernel : Cette option demande à DKMS de ne pas nettoyer les sources du noyau après avoir compilé un module.&lt;br /&gt;
          o --kernelsourcedir &amp;lt;chemin vers les sources du noyau&amp;gt; : Cette option permet d&#039;indiquer l&#039;emplacement des sources du noyau lorsqu&#039;elles ne se trouvent pas dans /lib/modules/&amp;lt;version du noyau&amp;gt;/build.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms build -m slmodem -v 2.9.10 -k 2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
&lt;br /&gt;
Preparing kernel 2.6.12-12mdk-i686-up-4GB for module build:&lt;br /&gt;
(This is not compiling a kernel, only just preparing kernel symbols)&lt;br /&gt;
Storing current .config to be restored when complete&lt;br /&gt;
Running Generic preparation routine&lt;br /&gt;
make mrproper.........&lt;br /&gt;
using /boot/config-2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
make oldconfig......&lt;br /&gt;
make prepare-all......&lt;br /&gt;
&lt;br /&gt;
Building module:&lt;br /&gt;
cleaning build area....&lt;br /&gt;
make KERNELRELEASE=2.6.12-12mdk-i686-up-4GB KERNEL_DIR=/lib/modules/2.6.12-12mdk-i686-up-4GB/build drivers....&lt;br /&gt;
cleaning build area....&lt;br /&gt;
cleaning kernel tree (make mrproper)....&lt;br /&gt;
&lt;br /&gt;
DKMS: build Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install : Installe une version d&#039;un module dans l&#039;arborescence du noyau indiqué (ou du noyau utilisé actuellement si aucun n&#039;est précisé par l&#039;option -k). Cette version doit précédemment avoir été compilée pour le noyau en question à l&#039;aide de l&#039;action build.&lt;br /&gt;
&lt;br /&gt;
      Lors de la première installation d&#039;une version d&#039;un module donné sur un noyau donné, DKMS cherche si ce module existait déjà avec ce noyau et le sauvegarde pour pouvoir le réinstaller lorsque l&#039;on demandera à DKMS de désinstaller la nouvelle version. Pour information, la version originale est sauvée dans /var/lib/dkms/&amp;lt;module&amp;gt;/original_module/&amp;lt;version du noyau&amp;gt;/&amp;lt;architecture&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms install -m slmodem -v 2.9.10 -k 2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
Running module version sanity check.&lt;br /&gt;
&lt;br /&gt;
slamr.ko.gz:&lt;br /&gt;
 - Original module&lt;br /&gt;
   - No original module exists within this kernel&lt;br /&gt;
 - Installation&lt;br /&gt;
   - Installing to /lib/modules/2.6.12-12mdk-i686-up-4GB/kernel/drivers/char/&lt;br /&gt;
&lt;br /&gt;
slusb.ko.gz:&lt;br /&gt;
 - Original module&lt;br /&gt;
   - No original module exists within this kernel&lt;br /&gt;
 - Installation&lt;br /&gt;
   - Installing to /lib/modules/2.6.12-12mdk-i686-up-4GB/kernel/drivers/char/&lt;br /&gt;
&lt;br /&gt;
depmod.....&lt;br /&gt;
&lt;br /&gt;
DKMS: install Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* uninstall : Désinstalle une version d&#039;un module pour une version du noyau (celle précisée par l&#039;option -k ou la version utilisée actuellement si aucune n&#039;est précisée). Cette commande ne gère pas l&#039;option --all donc il vous faudra désinstaller pour chaque noyau séparément.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms uninstall -m slmodem -v 2.9.10 -k 2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
&lt;br /&gt;
-------- Uninstall Beginning --------&lt;br /&gt;
Module:  slmodem&lt;br /&gt;
Version: 2.9.10&lt;br /&gt;
Kernel:  2.6.12-12mdk-i686-up-4GB (i586)&lt;br /&gt;
-------------------------------------&lt;br /&gt;
&lt;br /&gt;
Status: Before uninstall, this module version was ACTIVE on this kernel.&lt;br /&gt;
&lt;br /&gt;
slamr.ko.gz:&lt;br /&gt;
 - Uninstallation&lt;br /&gt;
   - Deleting from: /lib/modules/2.6.12-12mdk-i686-up-4GB/kernel/drivers/char/&lt;br /&gt;
 - Original module&lt;br /&gt;
   - No original module was found for this module on this kernel.&lt;br /&gt;
   - Use the dkms install command to reinstall any previous module version.&lt;br /&gt;
&lt;br /&gt;
slusb.ko.gz:&lt;br /&gt;
 - Uninstallation&lt;br /&gt;
   - Deleting from: /lib/modules/2.6.12-12mdk-i686-up-4GB/kernel/drivers/char/&lt;br /&gt;
 - Original module&lt;br /&gt;
   - No original module was found for this module on this kernel.&lt;br /&gt;
   - Use the dkms install command to reinstall any previous module version.&lt;br /&gt;
&lt;br /&gt;
DKMS: uninstall Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* mkrpm : Génére un RPM pour un couple module/version donné. Si vous désirez que le RPM ne contienne que les sources (et donc que les modules soient compilés lors de l&#039;installation), vous devez ajouter l&#039;option --source-only. Sinon, le choix des modules à distribuer se fait à l&#039;aide de -k et -a, comme pour les autres actions.&lt;br /&gt;
&lt;br /&gt;
      Si vous maîtrisez la création de RPM et souhaitez personnaliser ce qui est généré, sachez que DKMS regarde d&#039;abord si /usr/src/&amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;/&amp;lt;module&amp;gt;-dkms-mkrpm.spec existe, si oui l&#039;utilise comme modèle, et sinon utilise /etc/dkms/template-dkms-mkrpm.spec.&lt;br /&gt;
&lt;br /&gt;
* status : Affiche l&#039;état des différents modules pour chaque version, noyau et architecture.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms status&lt;br /&gt;
ipw2200, 1.0.4: added&lt;br /&gt;
slmodem, 2.9.10, 2.6.12-11mdk-i686-up-4GB, i586: installed&lt;br /&gt;
slmodem, 2.9.10, 2.6.12-12mdk-i686-up-4GB, i586: built&lt;br /&gt;
sysprof, 1.0, 2.6.12-12mdk-i686-up-4GB, i586: installed&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* match : Cette commande fort sympathique permet de compiler et installer pour un noyau donné tout les modules qui avaient été installés pour un autre noyau (spécifié par l&#039;option --templatekernel). Par exemple, après exécution de dkms match --templatekernel 2.6.12-11mdk-i686-up-4GB -k 2.6.12-12mdk-i686-up-4GB, toutes les combinaisons module/version qui étaient installées pour le noyau 2.6.12-11mdk-i686-up-4GB le seront pour le noyau 2.6.12-12mdk-i686-up-4GB.&lt;br /&gt;
* mktarball : Crée une archive tar.gz pour le module et la version indiquées. Cette archive contiendra les sources et les modules précédemment compilés. Par défaut l&#039;archive est créée pour le noyau utilisé actuellement. Si vous en souhaitez un (ou plusieurs) autre, vous pouvez l&#039;indiquer en utilisant les options -k et -a. Cette commande dispose également de quelques options supplémentaires :&lt;br /&gt;
          o --archive &amp;lt;fichier.tar.gz&amp;gt; : Permet de préciser le nom à donner à l&#039;archive (ne pas indiquer de chemin, il sera toujours placé dans /var/lib/dkms/&amp;lt;module&amp;gt;/&amp;lt;version du module&amp;gt;/tarball/). Sans cette option, le fichier s&#039;appelle &amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;-&amp;lt;versions des noyaux&amp;gt;.dkms.tar.gz&lt;br /&gt;
          o --binaries-only : Ne pas inclure les sources du module&lt;br /&gt;
          o --sources-only : Ne pas inclure les modules pré compilés. L&#039;archive s&#039;appellera &amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;-source-only.dkms.tar.gz, sauf si vous précisez un autre nom à l&#039;aide de --archive&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@plop src]# dkms mktarball -m slmodem -v 2.9.10 -k 2.6.12-11mdk-i686-up-4GB -k 2.6.12-12mdk-i686-up-4GB&lt;br /&gt;
Marking modules for 2.6.12-11mdk-i686-up-4GB (i586) for archiving...&lt;br /&gt;
Marking modules for 2.6.12-12mdk-i686-up-4GB (i586) for archiving...&lt;br /&gt;
&lt;br /&gt;
Marking /usr/src/slmodem-2.9.10 for archiving...&lt;br /&gt;
&lt;br /&gt;
Tarball location: /var/lib/dkms/slmodem/2.9.10/tarball/slmodem-2.9.10-kernel2.6.12-11mdk-i686-up-4GB-i586-kernel2.6.12-12mdk-i686-up-4GB-i586.dkms.tar.gz&lt;br /&gt;
&lt;br /&gt;
DKMS: mktarball Completed.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ldtarball : Importe une archive tar.gz créé à l&#039;aide de l&#039;action mktarball et spécifié à l&#039;aide de l&#039;option --archive.&lt;br /&gt;
&lt;br /&gt;
      Les fichiers sont importés dans l&#039;arborescence de DKMS et pas dans celle du noyau, les modules sont donc au mieux dans l&#039;état built(compilé) et il faut lancer ensuite la commande dkms install pour chacun d&#039;eux.&lt;br /&gt;
&lt;br /&gt;
      Par ailleurs, si des fichiers existent déjà lors de l&#039;import, un avertissement sera affiché et ils seront laissés tels quels. Si vous souhaitez que ces éventuels fichiers soient écrasés, il faut ajouter l&#039;option --force.&lt;br /&gt;
* mkdriverdisk : Crée une disquette avec les pilotes pour permettre l&#039;installation d&#039;une distribution, c&#039;est particulièrement utile lorsque le CD d&#039;installation ne contient pas les pilotes pour un nouveau contrôleur disque.&lt;br /&gt;
          o --size &amp;lt;taille de la disquette&amp;gt; : Cette option est utilisée par la commande mkdriverdisk pour décider de la taille de la disquette à créer. La valeur doit être un nombre entier de kilo-octets, divisible par 20, et vaut 1440 si cette option n&#039;est pas précisée.&lt;br /&gt;
          o --distrib &amp;lt;distribution&amp;gt; : Cette option obligatoire indique la distribution cible. Les valeurs actuellement supportées sont suse, UnitedLinux, redhat, redhat1 and redhat2. Red Hat supportant les disquettes de pilotes multi-architecture depuis la RHEL3, redhat1 force à utiliser l&#039;ancien format, redhat2 force à utiliser le nouveau.&lt;br /&gt;
          o --release &amp;lt;version&amp;gt; : Cette option est nécessaire si vous construisez une disquette pour SuSE ou UnitedLinux. Elle indique la version de la distribution, par exemple --distrib suse --release 9.1 indiquera que vous construisez la disquette pour une SuSE 9.1&lt;br /&gt;
      Les options --binaries-only et --sources-only de mktarball peuvent également être utilisées.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation basique ===&lt;br /&gt;
&lt;br /&gt;
Après vous avoir noyé sous les commandes et les options, je pense qu&#039;un exemple d&#039;utilisation classique est nécessaire pour vous persuader de la simplicité d&#039;utilisation. Voici donc comment installer un module exemple, fourni sous la forme de exemple-1.0.tar.gz contenant un unique répertoire exemple-1.0 avec les sources du module et un dkms.conf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd /usr/src&lt;br /&gt;
tar xzf /tmp/exemple-1.0.tar.gz&lt;br /&gt;
dkms add -m exemple -v 1.0&lt;br /&gt;
dkms build -m exemple -v 1.0&lt;br /&gt;
dkms install -m exemple -v 1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listing 1 : Ajout d&#039;un pilote en utilisant DKMS&lt;br /&gt;
&lt;br /&gt;
Si tout s&#039;est bien passé, le module est compilé et installé, et modprobe exemple fonctionne ! Si cela ne s&#039;est pas bien passé, c&#039;est vraisemblablement lors de l&#039;étape build, et vous pouvez essayer de déterminer le problème en allant lire le fichier /var/lib/dkms/exemple/1.0/build/make.log. Si vous n&#039;avez pas les compétences pour cela, le plus simple est d&#039;envoyer ce fichier à l&#039;auteur du dkms.conf afin qu&#039;il corrige l&#039;erreur.&lt;br /&gt;
&lt;br /&gt;
Un mode de distribution courant, que nous détaillerons plus loin, consiste à distribuer les sources et le dkms.conf sous la forme d&#039;un package RPM et non pas d&#039;un tar.gz. Dans ce cas, installer le package RPM suffit et exécutera automatiquement les différentes commandes.&lt;br /&gt;
&lt;br /&gt;
== Mise en oeuvre de DKMS par un distributeur ==&lt;br /&gt;
&lt;br /&gt;
=== Adaptation des sources ===&lt;br /&gt;
DKMS a besoin des sources du module dans le répertoire /usr/src/&amp;lt;nom du module&amp;gt;-&amp;lt;version du module&amp;gt;/ et d&#039;un fichier dkms.conf dans ce même répertoire. Nous allons étudier la syntaxe de ce fichier sur un exemple classique avant de détailler toutes les options disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Exemple de dkms.conf pour l&#039;ipw2200 1.0.4 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PACKAGE_VERSION=&amp;quot;1.0.4&amp;quot;&lt;br /&gt;
PACKAGE_NAME=&amp;quot;ipw2200&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MAKE[0]=&amp;quot;make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules HOSTAP_SRC=${kernel_source_dir}/3rdparty/hostap/&amp;quot;&lt;br /&gt;
CLEAN=&amp;quot;make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build clean&amp;quot;&lt;br /&gt;
&lt;br /&gt;
BUILT_MODULE_NAME[0]=&amp;quot;$PACKAGE_NAME&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[1]=&amp;quot;ieee80211_crypt_ccmp&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[2]=&amp;quot;ieee80211_crypt&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[3]=&amp;quot;ieee80211_crypt_tkip&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[4]=&amp;quot;ieee80211_crypt_wep&amp;quot;&lt;br /&gt;
BUILT_MODULE_NAME[5]=&amp;quot;ieee80211&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[0]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[1]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[2]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[3]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[4]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
DEST_MODULE_LOCATION[5]=&amp;quot;/kernel/drivers/net/wireless/ipw2200/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;eth&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REMAKE_INITRD=&amp;quot;no&amp;quot;&lt;br /&gt;
AUTOINSTALL=&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listing 2: Exemple de dkms.conf pour le pilote ipw2200 version 1.0.4&lt;br /&gt;
&lt;br /&gt;
Comme vous pouvez le voir ce fichier a une syntaxe très simple, une option par ligne sous la forme OPTION=&amp;quot;valeur&amp;quot;. Voyons maintenant plus précisément à quoi correspondent les options définies dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
PACKAGE_VERSION et PACKAGE_NAME ne méritent je pense aucune explication. Il est toutefois intéressant de noter que lors de la sortie d&#039;une nouvelle version du module, la seule ligne à modifier dans le dkms.conf est en général PACKAGE_VERSION.&lt;br /&gt;
&lt;br /&gt;
MAKE[0] contient la commande à exécuter pour compiler le module, elle peut utiliser de nombreuses variables, listées dans la section suivante. La majorité des modules peuvent se compiler avec la commande suivante : make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules&lt;br /&gt;
&lt;br /&gt;
CLEAN contient une commande permettant de nettoyer le répertoire de construction, elle est appelée avant et après la compilation du module.&lt;br /&gt;
&lt;br /&gt;
Les 12 lignes suivantes indiquent les modules générés (ici il y en a 6) et ou il faut les installer. BUILT_MODULE_NAME[i] contient le nom du module numéro i (en commençant à 0) et DEST_MODULE_LOCATION[i] le chemin où installer le module numéro i. Le chemin est relatif à l&#039;arborescence des modules du noyau concerné, /lib/modules/&amp;lt;version du noyau&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
L&#039;option MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;eth&amp;quot; indique qu&#039;il faudra ajouter dans /etc/modprobe.conf (ou modules.conf) un alias vers ce module qui s&#039;appelera eth0 (ou eth1, eth2, ... selon ce qui est déjà pris).&lt;br /&gt;
&lt;br /&gt;
REMAKE_INITRD=&amp;quot;no&amp;quot; indique que ce pilote n&#039;a pas besoin d&#039;être dans l&#039;initrd. L&#039;initrd est l&#039;image contenant tout les modules et commandes nécessaires pour accéder au disque dur, cette option a donc rarement besoin d&#039;être à yes en dehors des pilotes de contrôleur disque.&lt;br /&gt;
&lt;br /&gt;
AUTOINSTALL=&amp;quot;yes&amp;quot; indique que l&#039;on veut que ce module soit compilé et installé automatiquement lorsque l&#039;on démarre sur un nouveau noyau.&lt;br /&gt;
&lt;br /&gt;
=== Variables disponibles ===&lt;br /&gt;
&lt;br /&gt;
Quelques variables peut être utilisées dans les options et les commandes comme vous pouvez le voir dans la commande MAKE[0] de l&#039;exemple précédent. Ces variables sont définies par la configuration de DKMS ou par les options passées à la commande dkms.&lt;br /&gt;
&lt;br /&gt;
* $kernelver : Cette variable contient la version du noyau pour laquelle le module est en train d&#039;être construit. C&#039;est particulièrement utile dans la définition de la commande MAKE, par exemple MAKE[0]=&amp;quot;make INCLUDEDIR=/lib/modules/${kernelver}/build/include&amp;quot;&lt;br /&gt;
* $dkms_tree : Cette variable indique ou se trouve l&#039;arbre DKMS sur le système local. Par défaut il s&#039;agit de /var/lib/dkms, mais cette valeur ne doit pas être mise en dur dans les dkms.conf au cas ou l&#039;utilisateur aurait changé cela sur son système (Un tel réglage se fait à l&#039;aide de /etc/dkms/framework.conf ou en ajoutant l&#039;option --dkmstree lors de l&#039;appel, mais nous ne verrons pas ce genre d&#039;utilisations avancées dans cette article).&lt;br /&gt;
* $source_tree : Cette variable indique ou DKMS stocke les sources des modules sur le système. Par défaut il s&#039;agit de /usr/src, mais cette valeur ne doit pas être mise en dur dans les dkms.conf au cas ou l&#039;utilisateur aurait changé cela sur son système (à l&#039;aide de /etc/dkms/framework.conf ou en ajoutant l&#039;option --sourcetree lors de l&#039;appel).&lt;br /&gt;
* $kernel_source_dir : Cette variable contient le chemin vers les sources du kernel pour lequel on construit le module. Il s&#039;agit en général de /lib/modules/$kernelver/build, à moins qu&#039;un autre chemin ait été spécifié avec l&#039;option --kernel-sourcedir&lt;br /&gt;
&lt;br /&gt;
=== Options que l&#039;on peut définir dans le fichier dkms.conf ===&lt;br /&gt;
Tout d&#039;abord, le nom des options est sensible à la casse donc elles doivent être écrites en majuscules. Seules 4 options sont obligatoires :&lt;br /&gt;
&lt;br /&gt;
* PACKAGE_NAME : le nom du package&lt;br /&gt;
* PACKAGE_VERSION : la version du package&lt;br /&gt;
* BUILT_MODULE_NAME[0] : le nom du module construit. S&#039;il y en a plusieurs, ça sera BUILT_MODULE_NAME[1], BUILT_MODULE_NAME[2], ... Les modules non listés ici ne seront pas installés même s&#039;il sont construit par la commande MAKE[0]&lt;br /&gt;
* DEST_MODULE_LOCATION[0] : l&#039;emplacement ou installer le module numéro 0. Ce chemin est relatif au répertoire des modules, et sera par exemple &amp;quot;3rdparty&amp;quot;. Il faut renseigner DEST_MODULE_LOCATION[#] pour chaque module listé dans BUILT_MODULE_NAME&lt;br /&gt;
&lt;br /&gt;
De nombreuses autres options bien pratiques mais facultatives dont disponibles :&lt;br /&gt;
&lt;br /&gt;
* MAKE[#] : la commande pour compiler le(s) modules. Voir l&#039;explication de MAKE_MATCH pour la signification du numéro passé en paramètre. Cette option est facultative dans la mesure ou la commande standard de construction d&#039;un module kernel sera utilisée si elle n&#039;est pas définie.&lt;br /&gt;
* MAKE_MATCH[#] : cet ensemble d&#039;options permet d&#039;avoir une commande de construction différente en fonction des versions du kernel. Chacune contient une expression régulière qui sera comparée à la version du noyau. Le numéro de la dernière qui correspond indiquera le numéro de commande MAKE à utiliser.&lt;br /&gt;
* BUILT_MODULE_LOCATION[#] : le chemin relatif vers le module généré. Cela est nécessaire lorsque le module est généré dans un sous répertoire du répertoire de compilation.&lt;br /&gt;
* DEST_MODULE_NAME[#] : le nom a utiliser pour installer le module, s&#039;il y a besoin de le renommer. L&#039;extension (.o ou .ko) ne doit pas être spécifiée. Par défaut le nom original BUILT_MODULE_NAME[#] est conservé.&lt;br /&gt;
* MODULES_CONF_ALIAS_TYPE[#] : cette option indique pour chaque module quel alias créer dans /etc/modprobe.conf. DKMS calculera automatiquement le numéro de l&#039;alias en fonction de ceux qui existent déjà. Par exemple si MODULES_CONF_ALIAS_TYPE[0] contient eth et que vous avez déjà eth0 et eth1 définis dans /etc/modprobe.conf, DKMS ajoutera un alias eth2 vers le module. Cette fonctionnalité est à utiliser avec précaution dans la mesure ou elle gère mal les cas complexes, comme par exemple les systèmes avec plusieurs cartes réseau utilisant le même module.&lt;br /&gt;
* MODULES_CONF_OBSOLETES[#] : cette option indique à DKMS quels modules vers lesquels pointent des alias dans /etc/modprobe.conf doivent être remplacés par ce nouveau module. Si il y en a plusieurs, les séparer par une virgule. Je pense que ce sera plus clair sur un exemple. Considérons le fichier modprobe.conf suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;alias eth0 bcm4400&lt;br /&gt;
alias eth1 e1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      Si l&#039;on se contente des options suivantes, DKMS n&#039;a aucun moyen de deviner que b44 et bcm4400 gèrent la même carte et un nouvel alias sera généré.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;BUILT_MODULE_NAME[0]=&amp;quot;b44&amp;quot;&lt;br /&gt;
MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;eth&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      Le nouveau modprobe.conf contiendra donc :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;alias eth0 bcm4400&lt;br /&gt;
alias eth1 e1000&lt;br /&gt;
alias eth2 b44&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      Si par contre on ajoute MODULES_CONF_OBSOLETES[0]=&amp;quot;bcm4400&amp;quot;, le nouveau modprobe.conf sera correct :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;alias eth0 b44&lt;br /&gt;
alias eth1 e1000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* MODULES_CONF_OBSOLETE_ONLY[#] : Si cette option vaut yes, DKMS ne modifiera modprobe.conf que s&#039;il trouve un alias vers un module obsolète à remplacer. Il n&#039;y aura donc jamais de nouveaux alias de créés.&lt;br /&gt;
* STRIP[#] : Par défaut, les symboles de deboguage sont supprimés des modules à l&#039;aide de strip -g. Positionner cette option à &amp;quot;no&amp;quot; pour l&#039;un des modules permet de les conserver dans ce module.&lt;br /&gt;
* REMAKE_INITRD : Cette option indique, lorsque la première lettre est y ou Y, qu&#039;il faut régénérer l&#039;initrd après l&#039;installation d&#039;une nouvelle version du module. C&#039;est surtout nécessaire pour les pilotes de contrôleur disque.&lt;br /&gt;
* MODULES_CONF[#] : Cette option permet d&#039;indiquer des lignes à ajouter au fichier modprobe.conf. Lorsqu&#039;une première version du module est installée sur l&#039;un des noyaux, les lignes de MODULES_CONF sont ajoutées au fichier modprobe.conf (avant que l&#039;initrd soit régénéré si REMAKE_INITRD est activé). Elles sont supprimées lorsque la dernière version est désinstallée. On peut imaginer par exemple dans le cas de l&#039;ipw2200 MODULES_CONF[0]=&amp;quot;options ipw2200 led=1&amp;quot;.&lt;br /&gt;
* PATCH[#] : Cette option permet d&#039;indiquer des patchs à appliquer sur les sources du pilote avant de le compiler. Tout les patchs doivent se trouver dans /usr/src/&amp;lt;module&amp;gt;-&amp;lt;version du module&amp;gt;/patches/ et sont appliqués avec patch -p1. Vous pouvez spécifier pour quels noyaux chaque patch doit être appliqué en utilisant l&#039;option PATCH_MATCH ci-dessous.&lt;br /&gt;
* PATCH_MATCH[#] : Cette option sert à indiquer pour quels noyaux les patchs contenus dans le tableau PATCH doivent être appliqués. PATCH_MATCH[i] contient une expression régulière qui est comparés à la version du noyau cible pour décider si PATCH[i] doit être appliqué.&lt;br /&gt;
* AUTOINSTALL : Si cette option vaut &amp;quot;yes&amp;quot;, le service dkms (/etc/rc.d/init.d/dkms) essayera automatiquement de construire et installer ce module sur le noyau sur lequel vous démarrez. Ce service ne fera toutefois rien si plusieurs versions du module sont présentes dans l&#039;arbre DKMS, ce sera à vous de décider laquelle vous souhaitez.&lt;br /&gt;
* BUILD_EXCLUSIVE_KERNEL : Cette option permet d&#039;indiquer une expression régulière décrivant les versions de noyau pour lesquelles DKMS est autorisé à construire votre module. Si vous essayez de construire le module pour un noyau ne correspondant pas à cette expression régulière, DKMS provoquera une erreur. Par exemple, si vous indiquez &amp;quot;^2.6.*&amp;quot;, votre module ne pourra être construit que pour les noyaux 2.6 et une erreur se produira sur les 2.4.&lt;br /&gt;
* BUILD_EXCLUSIVE_ARCH : Cette option fonctionne comme BUILD_EXCLUSIVE_KERNEL mais limite l&#039;architecture du noyau au lieu de sa version. Par exemple, si cette option vaut &amp;quot;i.86&amp;quot; votre module pourra être construit pour i386 ou i586 mais pas ppc, x86_64, ni s390.&lt;br /&gt;
* POST_ADD : Cette option indique le nom d&#039;un script à exécuter après le traitement de la commande add. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
* POST_BUILD : Cette option indique le nom d&#039;un script à exécuter après le traitement de la commande build. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
* POST_INSTALL : Cette option indique le nom d&#039;un script à exécuter après le traitement de la commande install. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
* POST_REMOVE : Cette option indique le nom d&#039;un script à exécuter après le traitement de la commande remove. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
* PRE_BUILD : Cette option indique le nom d&#039;un script à exécuter avant le traitement de la commande build. Le chemin doit être indiqué relativement aux sources du module.&lt;br /&gt;
&lt;br /&gt;
=== Intégration avec rpm ===&lt;br /&gt;
&lt;br /&gt;
Les possibilités d&#039;intégration de DKMS avec RPM sont doubles :&lt;br /&gt;
&lt;br /&gt;
* Création manuelle de RPM contenant les sources et le dkms.conf ;&lt;br /&gt;
* Création automatique de rpm contant un module compilé à l&#039;aide de dkms, et dont la gestion est faite par DKMS.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le premier cas, la création du RPM est assez simple si vous savez construire des RPM. Vous indiquez comme source le tar.gz des sources du module et dans la section %install vous copiez les sources vers /usr/src/&amp;lt;nom du module&amp;gt;-&amp;lt;version du module&amp;gt; et vous y écrivez le dkms.conf (Il est également possible de mettre le dkms.conf dans un fichier annexe et de l&#039;inclure comme source, mais l&#039;avoir inclus permet d&#039;utiliser les macros RPM %name, %version, ... afin de créer rapidement un .spec pour un nouveau module). Ensuite vous indiquez en %post et %preun les commandes DKMS à invoquer (add, build et install en %post et remove en %preun).&lt;br /&gt;
Le modèle de fichier spec suivant pourra vous servir de base dans la majorité des cas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;%define module_name rt2500&lt;br /&gt;
&lt;br /&gt;
Name:           dkms-%{module_name}&lt;br /&gt;
Version:        1.4.6.2&lt;br /&gt;
Release:        1mdk&lt;br /&gt;
Summary:        DKMS-ready kernel-source for the RT2500 driver&lt;br /&gt;
License:        GPL&lt;br /&gt;
URL:            http://www.ralinktech.com/supp-1.htm&lt;br /&gt;
Source:         http://www.ralinktech.com/drivers/Linux/RT2500-Linux-STA-%{version}.tar.bz2&lt;br /&gt;
Group:          System/Kernel and hardware&lt;br /&gt;
Requires(pre):  dkms&lt;br /&gt;
Requires(post): dkms&lt;br /&gt;
Buildroot:      %{_tmppath}/%{name}-%{version}-root&lt;br /&gt;
Buildarch:      noarch&lt;br /&gt;
&lt;br /&gt;
%description&lt;br /&gt;
Driver for the Ralink RT2500 802.11g chipset&lt;br /&gt;
&lt;br /&gt;
%prep&lt;br /&gt;
%setup -q -n RT2500-Linux-STA-%{version}&lt;br /&gt;
chmod 0755  Module/2.*.x&lt;br /&gt;
&lt;br /&gt;
%build&lt;br /&gt;
&lt;br /&gt;
%clean&lt;br /&gt;
rm -fr $RPM_BUILD_ROOT&lt;br /&gt;
&lt;br /&gt;
%install&lt;br /&gt;
mkdir -p %{buildroot}/usr/src/%{module_name}-%{version}-%{release}&lt;br /&gt;
cp -a Module/* %{buildroot}/usr/src/%{module_name}-%{version}-%{release}&lt;br /&gt;
cp -af Module/2.6.x/Makefile %{buildroot}/usr/src/%{module_name}-%{version}-%{release}&lt;br /&gt;
cat &amp;gt; %{buildroot}/usr/src/%{module_name}-%{version}-%{release}/dkms.conf &amp;lt;&amp;lt;EOF&lt;br /&gt;
&lt;br /&gt;
PACKAGE_VERSION=&amp;quot;%{version}-%{release}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Items below here should not have to change with each driver version&lt;br /&gt;
PACKAGE_NAME=&amp;quot;%{module_name}&amp;quot;&lt;br /&gt;
MAKE[0]=&amp;quot;make -C \${kernel_source_dir} SUBDIRS=\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build modules&amp;quot;&lt;br /&gt;
CLEAN=&amp;quot;make -C \${kernel_source_dir} SUBDIRS=\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build clean&amp;quot;&lt;br /&gt;
&lt;br /&gt;
BUILT_MODULE_NAME[0]=&amp;quot;\$PACKAGE_NAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DEST_MODULE_LOCATION[0]=&amp;quot;/kernel/drivers/net/wireless/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;ra&amp;quot;&lt;br /&gt;
&lt;br /&gt;
REMAKE_INITRD=&amp;quot;no&amp;quot;&lt;br /&gt;
AUTOINSTALL=yes&lt;br /&gt;
&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
dkms add -m %{module_name} -v %{version}-%{release} --rpm_safe_upgrade&lt;br /&gt;
dkms build -m %{module_name} -v %{version}-%{release} --rpm_safe_upgrade&lt;br /&gt;
dkms install -m %{module_name} -v %{version}-%{release} --rpm_safe_upgrade&lt;br /&gt;
&lt;br /&gt;
%preun&lt;br /&gt;
dkms remove -m %{module_name} -v %{version}-%{release} --rpm_safe_upgrade --all ||:&lt;br /&gt;
&lt;br /&gt;
%files&lt;br /&gt;
%defattr(-,root,root)&lt;br /&gt;
/usr/src/%{module_name}-%{version}-%{release}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listing 7: Exemple de fichier .spec pour un package DKMS&lt;br /&gt;
&lt;br /&gt;
Il y a peu de remarques à faire sur ce fichier si ce n&#039;est l&#039;importance de ne pas oublier --rpm_safe_upgrade et surtout ||: dans le %preun qui permet que le rpm puisse être désinstallé même si le remove échoue (par exemple parce que le build avait échoué donc le module n&#039;est pas installé).&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est du deuxième cas (création de RPM binaires), c&#039;est encore plus simple, il suffit de compiler le module puis d&#039;utiliser dkms mkrpm en précisant le module, sa version et le ou les noyaux qui vous intéressent. Contrairement aux RPM créés à la main comme précédemment, cette méthode nécessite par contre d&#039;être root sur la machine générant le package (ou d&#039;avoir par exemple un sudo sur la commande dkms).&lt;br /&gt;
&lt;br /&gt;
== Avantages et inconvénients ==&lt;br /&gt;
&lt;br /&gt;
Pour finir, voici une petite liste des avantages et des inconvénients que je vois à utiliser DKMS. Cette liste vous aidera probablement à décider si vous souhaiter essayer de gérer vos pilotes additionnels avec DKMS.&lt;br /&gt;
&lt;br /&gt;
=== Avantages ===&lt;br /&gt;
&lt;br /&gt;
* Il n&#039;y a plus besoin de se préoccuper de ses pilotes additionnels lorsque l&#039;on met à jour son noyau ;&lt;br /&gt;
* Il est beaucoup plus facile de distribuer des pilotes (y compris les modules propriétaires avec une couche libre de jonction). Avec un seul paquetage à installer l&#039;utilisateur n&#039;a rien à faire pour que ça marche sur son noyau ;&lt;br /&gt;
* Il est beaucoup plus facile (et léger) de distribuer des correctifs sur les noyaux. Il n&#039;y a plus besoin de distribuer un nouveau noyau lorsque le problème n&#039;affecte qu&#039;un module, DKMS gérera très bien le remplacement du module original, même si celui-ci n&#039;était initialement pas installé avec DKMS ;&lt;br /&gt;
* Il est possible d&#039;avoir plusieurs versions du module présentes sur sa machine simultanément et de basculer entres elles à l&#039;aide de la commande dkms, ce qui est très pratique pour des tests ;&lt;br /&gt;
* Il est possible de distribuer le module avec la partie userspace associée plutôt qu&#039;avec le noyau, ce qui permet d&#039;éviter les problèmes de désynchronisation.&lt;br /&gt;
&lt;br /&gt;
=== Inconvénients ===&lt;br /&gt;
&lt;br /&gt;
* Le fonctionnement classique de DKMS implique la présence d&#039;un compilateur sur la machine, ce qui est en particulier problématique pour la sécurité des serveurs. Toutefois, DKMS reste utile sans compilateur sur le serveur pour générer depuis une autre machine un RPM contenant la nouvelle version compilée du module et pouvoir ainsi facilement mettre à jour toutes ses machines.&lt;br /&gt;
* De même DKMS a besoin des sources du noyau, ce qui occupe beaucoup d&#039;espace disque.&lt;br /&gt;
* La recompilation dynamique par un service au démarrage n&#039;est pas adaptée pour les modules nécessaires plus tôt (pilotes de contrôleur disque par exemple), il faut donc dans ce cas s&#039;assurer de faire compiler à DKMS le pilote pour le nouveau noyau avant de redémarrer. Cet inconvénient n&#039;en est toutefois pas réellement un dans la mesure où le problème est le même lorsque le module en question est compilé à la main sans DKMS.&lt;br /&gt;
* DKMS est basé sur RPM et ne fonctionnera donc que sur des distributions utilisant RPM (RedHat, Mandriva, SuSE, ...). L&#039;utilisation de rpm est pourtant très localisée (par exemple détection de l&#039;architecture du noyau cible) et il devrait être assez facile de s&#039;en passer.&lt;br /&gt;
* DKMS ne prend pour le moment pas en compte le fichier .config du noyau mais celui par défaut fourni par la distribution pour la famille de noyaux (smp, 64G, ...).&lt;br /&gt;
&lt;br /&gt;
=== Références ===&lt;br /&gt;
&lt;br /&gt;
* [http://linux.dell.com/dkms/dkms.html http://linux.dell.com/dkms/dkms.html]&lt;br /&gt;
* [http://www.linuxjournal.com/article/6896 http://www.linuxjournal.com/article/6896]&lt;br /&gt;
* [http://linux.dell.com/dkms/dkms-ols2004.pdf http://linux.dell.com/dkms/dkms-ols2004.pdf]&lt;br /&gt;
* [http://www.dell.com/downloads/global/power/1q04-ler.pdf http://www.dell.com/downloads/global/power/1q04-ler.pdf]&lt;br /&gt;
* [http://linux.dell.com/dkms/dkms-LWE-Boston2005.pdf http://linux.dell.com/dkms/dkms-LWE-Boston2005.pdf]&lt;br /&gt;
&lt;br /&gt;
Pascal Terjan &amp;lt;pterjan at mandriva dot com&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Cet article a été initialement publié dans le GNU/Linux Magazine 80 de Février 2006&lt;/div&gt;</summary>
		<author><name>Pterjan</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Tunnels_ethernet_avec_OpenSSH&amp;diff=11664</id>
		<title>Tunnels ethernet avec OpenSSH</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Tunnels_ethernet_avec_OpenSSH&amp;diff=11664"/>
		<updated>2006-02-12T12:43:44Z</updated>

		<summary type="html">&lt;p&gt;Pterjan : quelques corrections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Depuis la version 4.3 de Openssh, l&#039;option pour faire des tunnels ip a été ajoutée, mais la doc sur internet est plutot rare sur le sujet.&lt;br /&gt;
&lt;br /&gt;
Avant tout, il faut vérifier la version d&#039;openssh sur le serveur et le client.&lt;br /&gt;
&amp;lt;code multi&amp;gt;&lt;br /&gt;
~ $ rpm -q openssh&lt;br /&gt;
openssh-4.3p1-3mdk&lt;br /&gt;
~ $ ssh sisay rpm -q openssh&lt;br /&gt;
openssh-4.3p1-0.1.20060mdk&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;exemple ici a été fait à partir de 2 mandriva, mais ça doit marcher sans modification&lt;br /&gt;
sur un autre linux ou *bsd.&lt;br /&gt;
&lt;br /&gt;
Tout d&#039;abord, il faut les droits root sur les 2 machines. En effet, il y a quelques opérations à faire, aussi bien au niveau de la configuration que du réseau.&lt;br /&gt;
&lt;br /&gt;
== Sur le serveur ==&lt;br /&gt;
&lt;br /&gt;
La première chose à faire est de dire à openssh d&#039;autoriser les tunnels, en rajoutant cette directive :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PermitTunnel yes&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dans /etc/ssh/sshd_config.&lt;br /&gt;
&lt;br /&gt;
Il faut aussi retirer la séparation des priviléges, ou jouer sur les permissions de /dev/tun  .&lt;br /&gt;
J&#039;ai pris la facilité pour le moment, j&#039;ai rajouté&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UsePrivilegeSeparation no&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une autre solution est de donner les permissions en lecture écriture à un groupe particulier&lt;br /&gt;
sur /dev/tun, ce qui est bien plus simple et sûr.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chmod :mongroupe /dev/tun&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et bien sur, être dans le groupe en question.&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite charger le module tun :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;modprobe tun&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et le rajouter dans /etc/modprobe.preload&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;echo tun &amp;gt;&amp;gt; /etc/modprobe.preload&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pour le charger au prochain démarrage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sur le client ==&lt;br /&gt;
&lt;br /&gt;
Il faut simplement les droits sur /dev/tun, donc soit tourner en root, ou avoir la permission&lt;br /&gt;
d&#039;écrire sur /dev/tun, comme plus haut, puis faire ( sisay etant le serveur ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -w any:any sisay&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez jeter une oeil sur les options -f et -N pour ne pas lancer de shell sur la machine distante. Et bien sur, les options habituelles marchent encore ( clé, tunnel, master/slave ).&lt;br /&gt;
&lt;br /&gt;
Puis, en root, vous pourrez changer l&#039;ip de la nouvelle interface tun0 sur le serveur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ifconfig tun0 10.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et faire pareil sur le client :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ifconfig tun0 10.0.0.2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et finalement, vous pouvez maintenant tester le ping depuis le client :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ping 10.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le reste, c&#039;est de la configuration normale pour les interfaces. Vous pouvez rajouter des routes, un firewall, n&#039;importe quoi.&lt;br /&gt;
&lt;br /&gt;
Néanmoins, il faut savoir que les connexions tcp par dessus tcp ( comme c&#039;est le cas avec ssh ) sont déconseillées, de par la nature de tcp ( http://docs.mandragor.org/files/Misc/GLFM/lm31/TCP_over_TCP_mauvaise_iD.html ).&lt;/div&gt;</summary>
		<author><name>Pterjan</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Lea_Linux:Compte-rendu_AG_2005&amp;diff=11000</id>
		<title>Lea Linux:Compte-rendu AG 2005</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Lea_Linux:Compte-rendu_AG_2005&amp;diff=11000"/>
		<updated>2005-12-03T10:54:25Z</updated>

		<summary type="html">&lt;p&gt;Pterjan : cohérence des mois, le pric c&amp;#039;était pas aux tanneries&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Association]]&lt;br /&gt;
&lt;br /&gt;
= Bilan moral =&lt;br /&gt;
L&#039;association Léa existe officiellement depuis maintenant 4 ans ; son existence a été rendue publique lors du salon Linux Solutions de février 2003. Le site Lea-Linux.org existe, quant à lui, depuis 1999.&lt;br /&gt;
&lt;br /&gt;
Cette année a été riche en événements pour Léa.&lt;br /&gt;
&lt;br /&gt;
Tout d&#039;abord, c&#039;était la troisième année où Léa sortait dans la vie réelle. Ainsi avons-nous participé à des manifestations, dont vous verrez le résumé plus bas.&lt;br /&gt;
&lt;br /&gt;
Ensuite, le site a aussi évolué :&lt;br /&gt;
* en changeant de charte graphique (nous tenons à remercier Ayo et LinuxGraphic.org)&lt;br /&gt;
* en s&#039;ouvrant à une contribution plus large. &lt;br /&gt;
&lt;br /&gt;
Le forum et la liste aide tournent déjà grâce au support de quelques habitués : Léa les remercie de leur présence et de leur disponibilité. Néanmoins, nous sommes toujours en perpétuel quête de contributeurs pour faire « vivre » l&#039;association, le site, le forum, les listes de diffusion etc...&lt;br /&gt;
&lt;br /&gt;
Il restait à faire vivre les articles du site. Grâce au Wiki, nous espérons avec vous relever le défi de maintenir une documentation à jour.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons tout au cours de cette année fait de nombreuses actions de prosélytisme et de lobbying pour Linux et les Logiciels Libres, des conférences, des install-parties.&lt;br /&gt;
&lt;br /&gt;
Du côté administratif, cet été, le siège social de l&#039;association a déménagé en même temps que son président à l&#039;adresse suivante : 12 rue Boucry – 75018 PARIS.&lt;br /&gt;
&lt;br /&gt;
== Compte-rendu des actions ==&lt;br /&gt;
=== Site Web ===&lt;br /&gt;
==== Léa ====&lt;br /&gt;
Avant l&#039;été, il a été mis en place un système de paiement de dons en ligne par carte de paiement à travers le service de Paypal. Ce service ne nécessite pas la création de compte Paypal.&lt;br /&gt;
&lt;br /&gt;
Durant les RMLL, Léa a décidé d&#039;étudier l&#039;ouverture à la contribution sur ses articles à l&#039;aide d&#039;un Wiki. Après des études de faisabilité durant Juillet/Août, le CA a décidé de commencer les travaux de migration du site vers le moteur MediaWiki.&lt;br /&gt;
&lt;br /&gt;
Le site de Léa tourne depuis fin Octobre sous un MediaWiki auquel nous avons ajouté quelques extensions (dont certaines sont disponibles sur la page de [[Utilisateur:Lea|Lea]]) ainsi qu&#039;un cache statique qui sert de filtre entre les modifications et le net.&lt;br /&gt;
&lt;br /&gt;
==== Forum ====&lt;br /&gt;
Le forum tourne toujours sous Phorum. Des maintenances correctives et de sécurité ont été effectuées.&lt;br /&gt;
&lt;br /&gt;
==== Liste Aide ====&lt;br /&gt;
Emmanuel Fleury est toujours modérateur de la liste.&lt;br /&gt;
&lt;br /&gt;
==== LinuxFrench ====&lt;br /&gt;
Au printemps, LinuxFrench a failli fermer ces portes lors du départ d&#039;Albert Bruc. &lt;br /&gt;
Heureusement, Jean-Claude Stiegler reprend le site en accord avec Albert.&lt;br /&gt;
La ligne éditoriale restera la même et nous espèrons que certains d&#039;entre vous rejoindront la rédaction passagèrement ou sur plus long terme.&lt;br /&gt;
&lt;br /&gt;
=== Manifestations ===&lt;br /&gt;
==== Concours Kakémono ====&lt;br /&gt;
Pour représenter Léa lors de ces manifestations, le CA a décidé en Juin d&#039;organiser un concours pour la réalisation d&#039;un kakémono.&lt;br /&gt;
&lt;br /&gt;
Après la délibération du jury, les délais ont été très court pour sa première sortie lors des RMLL.&lt;br /&gt;
Le vainqueur de ce concours a été skeepin.&lt;br /&gt;
&lt;br /&gt;
==== Liste de manifestations ====&lt;br /&gt;
Remarque : Ce rapport ne mentionne que les actions dont le conseil d&#039;administration a été mis au courant, il se peut donc que les actions de tous les membres de Léa ne soient pas dans ce rapport.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;1 au 3 Février 2005 : Solutions Linux&#039;&#039;&#039; : Prosélytisme Linux et vente de CDs, Léa-Books et T-Shirts. Léa a remporté le 1er prix du meilleur site web aux Coups de Coeur du Libre&lt;br /&gt;
* &#039;&#039;&#039;19 Mars 2005 : Install-Party à la Villette&#039;&#039;&#039; : Conférences, Install-Party et prosélytisme Linux&lt;br /&gt;
* &#039;&#039;&#039;1 et 2 Avril 2005 : Game Over à Limoges&#039;&#039;&#039; : Prosélytisme Linux et vente de Live CDs, Léa-Books et T-Shirts&lt;br /&gt;
* &#039;&#039;&#039;23 au 25 avril 2004 : Libr&#039;east&#039;&#039;&#039; : Prosélytisme Linux, Install Party et vente de CDs, Léa-Books et T-Shirts&lt;br /&gt;
* &#039;&#039;&#039;30 Avril 2004 : AG 2004 et Léa-Party&#039;&#039;&#039; : AG 2004, Conférences et Repas entre membres de l&#039;associations&lt;br /&gt;
* &#039;&#039;&#039;14 et 15 Mai 2005 Salon Multimédia de Proville&#039;&#039;&#039; : Prosélytisme Linux&lt;br /&gt;
* &#039;&#039;&#039;4 au 9 Juillet 2005 : RMML à Dijon&#039;&#039;&#039; : Prosélytisme Linux et vente de CDs, Léa-Books et T-Shirts. Le stand de Léa a remporté le second prix ex-aequo du stand le plus sympa du village&lt;br /&gt;
* &#039;&#039;&#039;9, 10 et 11 Septembre 2005 : Fête de l&#039;Huma&#039;&#039;&#039; : Prosélytisme Linux&lt;br /&gt;
* &#039;&#039;&#039;14 et 15 Octobre 2005 : Journées du Logiciel Libre à Lyon&#039;&#039;&#039; : Prosélytisme Linux&lt;br /&gt;
&lt;br /&gt;
=== Lobbying ===&lt;br /&gt;
* Lors du Salon Linux Solution, Léa a participé matériellement, humainement et financièrement à la tenue d&#039;un stand de conférences libres sur le Libre.&lt;br /&gt;
&lt;br /&gt;
== Action à mener ==&lt;br /&gt;
=== Site Web ===&lt;br /&gt;
* Maintenance du serveur&lt;br /&gt;
* Améliorer la gestion des modifications de la page de modération&lt;br /&gt;
* Mieux intégrer Awstats à mediawiki&lt;br /&gt;
* Restructurer le wiki (voir [[Lea Linux:Modération/Structuration du wiki|Modération/Structuration du wiki]])&lt;br /&gt;
&lt;br /&gt;
=== Manifestations ===&lt;br /&gt;
* 31 Janvier au 2 Février 2006 : Linux Solutions 2006&lt;br /&gt;
* Juillet 2006 : RMLL à Nancy ???&lt;br /&gt;
* Léa-Party et Install-Parties&lt;br /&gt;
* Salon de l&#039;Education&lt;br /&gt;
&lt;br /&gt;
=== Lobbying ===&lt;br /&gt;
* Brevets logiciels&lt;br /&gt;
* Loi DADVSI&lt;br /&gt;
&lt;br /&gt;
{{DP}}&lt;/div&gt;</summary>
		<author><name>Pterjan</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Lea_Linux:Compte-rendu_AG_2005&amp;diff=10999</id>
		<title>Lea Linux:Compte-rendu AG 2005</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Lea_Linux:Compte-rendu_AG_2005&amp;diff=10999"/>
		<updated>2005-12-03T10:53:08Z</updated>

		<summary type="html">&lt;p&gt;Pterjan : typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Association]]&lt;br /&gt;
&lt;br /&gt;
= Bilan moral =&lt;br /&gt;
L&#039;association Léa existe officiellement depuis maintenant 4 ans ; son existence a été rendue publique lors du salon Linux Solutions de février 2003. Le site Lea-Linux.org existe, quant à lui, depuis 1999.&lt;br /&gt;
&lt;br /&gt;
Cette année a été riche en événements pour Léa.&lt;br /&gt;
&lt;br /&gt;
Tout d&#039;abord, c&#039;était la troisième année où Léa sortait dans la vie réelle. Ainsi avons-nous participé à des manifestations, dont vous verrez le résumé plus bas.&lt;br /&gt;
&lt;br /&gt;
Ensuite, le site a aussi évolué :&lt;br /&gt;
* en changeant de charte graphique (nous tenons à remercier Ayo et LinuxGraphic.org)&lt;br /&gt;
* en s&#039;ouvrant à une contribution plus large. &lt;br /&gt;
&lt;br /&gt;
Le forum et la liste aide tournent déjà grâce au support de quelques habitués : Léa les remercie de leur présence et de leur disponibilité. Néanmoins, nous sommes toujours en perpétuel quête de contributeurs pour faire « vivre » l&#039;association, le site, le forum, les listes de diffusion etc...&lt;br /&gt;
&lt;br /&gt;
Il restait à faire vivre les articles du site. Grâce au Wiki, nous espérons avec vous relever le défi de maintenir une documentation à jour.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons tout au cours de cette année fait de nombreuses actions de prosélytisme et de lobbying pour Linux et les Logiciels Libres, des conférences, des install-parties.&lt;br /&gt;
&lt;br /&gt;
Du côté administratif, cet été, le siège social de l&#039;association a déménagé en même temps que son président à l&#039;adresse suivante : 12 rue Boucry – 75018 PARIS.&lt;br /&gt;
&lt;br /&gt;
== Compte-rendu des actions ==&lt;br /&gt;
=== Site Web ===&lt;br /&gt;
==== Léa ====&lt;br /&gt;
Avant l&#039;été, il a été mis en place un système de paiement de dons en ligne par carte de paiement à travers le service de Paypal. Ce service ne nécessite pas la création de compte Paypal.&lt;br /&gt;
&lt;br /&gt;
Durant les RMLL, Léa a décidé d&#039;étudier l&#039;ouverture à la contribution sur ses articles à l&#039;aide d&#039;un Wiki. Après des études de faisabilité durant Juillet/Août, le CA a décidé de commencer les travaux de migration du site vers le moteur MediaWiki.&lt;br /&gt;
&lt;br /&gt;
Le site de Léa tourne depuis fin Octobre sous un MediaWiki auquel nous avons ajouté quelques extensions (dont certaines sont disponibles sur la page de [[Utilisateur:Lea|Lea]]) ainsi qu&#039;un cache statique qui sert de filtre entre les modifications et le net.&lt;br /&gt;
&lt;br /&gt;
==== Forum ====&lt;br /&gt;
Le forum tourne toujours sous Phorum. Des maintenances correctives et de sécurité ont été effectuées.&lt;br /&gt;
&lt;br /&gt;
==== Liste Aide ====&lt;br /&gt;
Emmanuel Fleury est toujours modérateur de la liste.&lt;br /&gt;
&lt;br /&gt;
==== LinuxFrench ====&lt;br /&gt;
Au printemps, LinuxFrench a failli fermer ces portes lors du départ d&#039;Albert Bruc. &lt;br /&gt;
Heureusement, Jean-Claude Stiegler reprend le site en accord avec Albert.&lt;br /&gt;
La ligne éditoriale restera la même et nous espèrons que certains d&#039;entre vous rejoindront la rédaction passagèrement ou sur plus long terme.&lt;br /&gt;
&lt;br /&gt;
=== Manifestations ===&lt;br /&gt;
==== Concours Kakémono ====&lt;br /&gt;
Pour représenter Léa lors de ces manifestations, le CA a décidé en Juin d&#039;organiser un concours pour la réalisation d&#039;un kakémono.&lt;br /&gt;
&lt;br /&gt;
Après la délibération du jury, les délais ont été très court pour sa première sortie lors des RMLL.&lt;br /&gt;
Le vainqueur de ce concours a été skeepin.&lt;br /&gt;
&lt;br /&gt;
==== Liste de manifestations ====&lt;br /&gt;
Remarque : Ce rapport ne mentionne que les actions dont le conseil d&#039;administration a été mis au courant, il se peut donc que les actions de tous les membres de Léa ne soient pas dans ce rapport.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;1 au 3 février 2005 : Solutions Linux&#039;&#039;&#039; : Prosélytisme Linux et vente de CDs, Léa-Books et T-Shirts. Léa a remporté le 1er prix du meilleur site web aux Coups de Coeur du Libre&lt;br /&gt;
* &#039;&#039;&#039;19/03/2005 : Install-Party à la Villette&#039;&#039;&#039; : Conférences, Install-Party et prosélytisme Linux&lt;br /&gt;
* &#039;&#039;&#039;1 et 2 avril 2005 : Game Over à Limoges&#039;&#039;&#039; : Prosélytisme Linux et vente de Live CDs, Léa-Books et T-Shirts&lt;br /&gt;
* &#039;&#039;&#039;23 au 25 avril 2004 : Libr&#039;east&#039;&#039;&#039; : Prosélytisme Linux, Install Party et vente de CDs, Léa-Books et T-Shirts&lt;br /&gt;
* &#039;&#039;&#039;30 avril 2004 : AG 2004 et Léa-Party&#039;&#039;&#039; : AG 2004, Conférences et Repas entre membres de l&#039;associations&lt;br /&gt;
* &#039;&#039;&#039;14 et 15 Mai 2005 Salon Multimédia de Proville&#039;&#039;&#039; : Prosélytisme Linux&lt;br /&gt;
* &#039;&#039;&#039;4 au 9 juillet 2005 : RMML à Dijon&#039;&#039;&#039; : Prosélytisme Linux et vente de CDs, Léa-Books et T-Shirts. Le stand de Léa a remporté le second prix ex-aequo du stand le plus sympa du village, lors d&#039;une soirée aux Tanneries (espace autogéré)&lt;br /&gt;
* &#039;&#039;&#039;9, 10 et 11 Septembre 2005 : Fête de l&#039;Huma&#039;&#039;&#039; : Prosélytisme Linux&lt;br /&gt;
* &#039;&#039;&#039;14 et 15 Octobre 2005 : Journées du Logiciel Libre à Lyon&#039;&#039;&#039; : Prosélytisme Linux&lt;br /&gt;
&lt;br /&gt;
=== Lobbying ===&lt;br /&gt;
* Lors du Salon Linux Solution, Léa a participé matériellement, humainement et financièrement à la tenue d&#039;un stand de conférences libres sur le Libre.&lt;br /&gt;
&lt;br /&gt;
== Action à mener ==&lt;br /&gt;
=== Site Web ===&lt;br /&gt;
* Maintenance du serveur&lt;br /&gt;
* Améliorer la gestion des modifications de la page de modération&lt;br /&gt;
* Mieux intégrer Awstats à mediawiki&lt;br /&gt;
* Restructurer le wiki (voir [[Lea Linux:Modération/Structuration du wiki|Modération/Structuration du wiki]])&lt;br /&gt;
&lt;br /&gt;
=== Manifestations ===&lt;br /&gt;
* 31 Janvier au 2 Février 2006 : Linux Solutions 2006&lt;br /&gt;
* Juillet 2006 : RMLL à Nancy ???&lt;br /&gt;
* Léa-Party et Install-Parties&lt;br /&gt;
* Salon de l&#039;Education&lt;br /&gt;
&lt;br /&gt;
=== Lobbying ===&lt;br /&gt;
* Brevets logiciels&lt;br /&gt;
* Loi DADVSI&lt;br /&gt;
&lt;br /&gt;
{{DP}}&lt;/div&gt;</summary>
		<author><name>Pterjan</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Lea_Linux:Statuts_du_03-12-2005&amp;diff=10998</id>
		<title>Lea Linux:Statuts du 03-12-2005</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Lea_Linux:Statuts_du_03-12-2005&amp;diff=10998"/>
		<updated>2005-12-03T10:50:47Z</updated>

		<summary type="html">&lt;p&gt;Pterjan : Vraie liste&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Association]]&lt;br /&gt;
Ecrits par les membres fondateurs : Frédéric Bonnaud, Jean-Christophe Cardot, Anne-Laure Nicolas, Serge Tchesmeli.&lt;br /&gt;
&lt;br /&gt;
= Article 1 : constitution et dénomination =&lt;br /&gt;
Il est fondé entre les adhérents aux présents statuts une association régie par la loi du 1er juillet 1901 et le décret du 16 août 1901, ayant pour dénomination l&#039;association Léa (Linux entre amis).&lt;br /&gt;
&lt;br /&gt;
= Article 2 : objet =&lt;br /&gt;
Cette association a pour but de promouvoir et de défendre par tous les moyens dont elle dispose, y compris juridiques, les logiciels libres au sens ou l&#039;entendent l&#039;association « Free Software Foundation (FSF) » et l&#039;organisme « Open Source Initiative (OSI) », dont le système d&#039;exploitation Linux, afin d&#039;aider à leur installation et configuration par divers moyens tels que :&lt;br /&gt;
* la rédaction et la publication d&#039;articles en ligne, en particulier sur les sites web http://lea-linux.org, http://linuxfrench.net et http://asill.org animés par l&#039;association ou sur tout autre site partenaire, &lt;br /&gt;
* la publication permanente et en langue française d&#039;articles et de brèves réalisés par ou pour l&#039;association et ceci sur tous les formats possibles (numérique ou non),&lt;br /&gt;
* des réunions d&#039;utilisateurs avec des conférences et des débats animés par l&#039;association ou des personnes externes, &lt;br /&gt;
* la présence et interventions dans diverses manifestations,&lt;br /&gt;
* la défense légale des documentations réalisées par ses membres.&lt;br /&gt;
&lt;br /&gt;
= Article 3 : siège social = &lt;br /&gt;
Le siège social est fixé à l&#039;adresse suivante :&lt;br /&gt;
:c/o Jean-Christophe Cardot&lt;br /&gt;
:12, rue Boucry&lt;br /&gt;
:75018 PARIS&lt;br /&gt;
&lt;br /&gt;
Il pourra être transféré par simple décision du conseil d&#039;administration.&lt;br /&gt;
&lt;br /&gt;
= Article 4 : durée =&lt;br /&gt;
La durée de l&#039;association est de 99 ans.&lt;br /&gt;
&lt;br /&gt;
= Article 5 : composition de l&#039;association =&lt;br /&gt;
L&#039;association se compose de :&lt;br /&gt;
* &#039;&#039;&#039;membres actifs&#039;&#039;&#039;. Sont membres actifs ceux qui sont à jour de leur cotisation annuelle. Il peut y avoir deux types de membres actifs : les personnes physiques et les personnes morales. Ils disposent chacun d&#039;une voix lors des votes de l&#039;assemblée générale. Si une personne physique est également représentante d&#039;une personne morale, elle dispose d&#039;une voix en tant que personne physique, et d&#039;une voix en tant que personne morale. &lt;br /&gt;
* &#039;&#039;&#039;membres d&#039;honneur&#039;&#039;&#039;. Le titre de membre d&#039;honneur peut être décerné par le conseil d&#039; administration aux personnes qui rendent ou ont rendu des services signalés à l&#039;association. Les membres d&#039; honneur sont des membres de l&#039; Assemblée Générale et ne sont pas tenus de payer une cotisation annuelle. &lt;br /&gt;
* &#039;&#039;&#039;membres bienfaiteurs&#039;&#039;&#039;. Personnes physiques ou morales qui auront versé une cotisation annuelle au moins double de la cotisation des membres actifs.&lt;br /&gt;
&lt;br /&gt;
= Article 6 : admission et adhésion =&lt;br /&gt;
Pour faire partie de l&#039;association, il faut adhérer aux présents statuts, être agréé par le conseil d&#039;administration, avoir souscrit un bulletin d&#039;adhésion qui précise la qualité de l&#039;adhérant (personne morale ou physique), avoir acquitté un droit d&#039;entrée égal à la cotisation annuelle.&lt;br /&gt;
&lt;br /&gt;
En cas de refus d&#039;une adhésion par le conseil d&#039;administration (un avis sera alors transmis à l&#039;intéressé), le droit d&#039;entrée éventuellement perçu sera intégralement remboursé.&lt;br /&gt;
&lt;br /&gt;
= Article 7 : cotisation =&lt;br /&gt;
Une cotisation annuelle doit être acquittée par les adhérents. Son montant est fixé chaque année par le conseil d&#039;administration. Celui-ci pourra être différent pour les personnes physiques et les personnes morales.&lt;br /&gt;
&lt;br /&gt;
Sur décision du conseil d&#039;administration, un ou tous les membres de l&#039;association peuvent être dispensés de cotisation.&lt;br /&gt;
&lt;br /&gt;
Toute cotisation pourra être rachetée moyennant le paiement d&#039;une somme minima égale à dix fois le montant annuel sans que la somme globale ne puisse dépasser un montant de 15 (quinze) euros (cf. loi du 1er Janvier 1901, modifiée par la loi du 23 juin 1948, n°48-1001.)&lt;br /&gt;
&lt;br /&gt;
= Article 8 : radiation =&lt;br /&gt;
La qualité de membre se perd par :&lt;br /&gt;
* le décès, &lt;br /&gt;
* la démission qui doit être adressée par écrit au conseil d&#039;administration, &lt;br /&gt;
* le non-paiement de la cotisation dans un délai de 2 mois après sa date d&#039;exigibilité (validée dans ce cas par une décision du conseil d&#039;administration), &lt;br /&gt;
&lt;br /&gt;
La radiation est prononcée par le conseil d&#039;administration pour le non-paiement de la cotisation, ou pour motif grave, l&#039;intéressé ayant été invité par lettre recommandée à se présenter devant le bureau pour fournir des explications.&lt;br /&gt;
&lt;br /&gt;
= Article 9 : ressources =&lt;br /&gt;
Les ressources de l&#039;association comprennent :&lt;br /&gt;
* le montant des cotisations, &lt;br /&gt;
* les subventions de l&#039;état et des collectivités territoriales, &lt;br /&gt;
* les recettes des manifestations exceptionnelles, &lt;br /&gt;
* toute autre ressource que peut percevoir une association régie par la loi du 1er juillet 1901 et le décret du 16 août 1901 et qui ne soit pas contraire aux règles en vigueur.&lt;br /&gt;
&lt;br /&gt;
= Article 10 : bureau et conseil d&#039;administration =&lt;br /&gt;
L&#039;association est dirigée par un bureau et un conseil d&#039;administration. Le bureau est composé des 4 membres fondateurs, permanents (sauf démission du bureau ou du conseil d&#039;administration ou radiation de l&#039;association). Le conseil d&#039;administration est composé du bureau augmenté sur décision du conseil de 0 à 7 membres élus par l&#039;assemblée générale.&lt;br /&gt;
&lt;br /&gt;
Les membres fondateurs sont :&lt;br /&gt;
* Frédéric Bonnaud, &lt;br /&gt;
* Jean-Christophe Cardot, &lt;br /&gt;
* Anne-Laure Nicolas,&lt;br /&gt;
* Serge Tchesmeli (démissionnaire).&lt;br /&gt;
&lt;br /&gt;
Ils forment le &#039;&#039;&#039;Bureau&#039;&#039;&#039; qui élira en son sein, lors de chaque assemblée générale, un &#039;&#039;&#039;président&#039;&#039;&#039;, un &#039;&#039;&#039;vice-président&#039;&#039;&#039;, un &#039;&#039;&#039;secrétaire&#039;&#039;&#039; et un &#039;&#039;&#039;trésorier&#039;&#039;&#039;. En cas de départ de l&#039;association d&#039;un de ces quatre membres, celui sera remplacé : provisoirement, avant la prochaine assemblée générale, par le conseil, puis par une élection pour deux ans par cette assemblée générale. De plus, le bureau peut décider d&#039;admettre un membre en son sein, par cooptation puis vote des membres du bureau.&lt;br /&gt;
&lt;br /&gt;
En cas de vacances de poste au conseil, celui-ci pourvoit de la même façon au remplacement du ou des membres aux postes vacants. De même, en cas de décision du conseil d&#039;augmenter le nombre de ses membres, ce ou ces membres sont élus pour 2 années lors de la prochaine assemblée générale.&lt;br /&gt;
&lt;br /&gt;
Les mineurs de moins de 16 ans peuvent être élus au conseil d&#039;administration après acceptation de leur candidature par le conseil d&#039;administration sortant.&lt;br /&gt;
&lt;br /&gt;
= Article 11 : rôle des membres du bureau =&lt;br /&gt;
Les rôles respectifs du bureau et du conseil d&#039;administration pourront être précisés dans le règlement intérieur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Président&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le président convoque les assemblées générales ainsi que le conseil d&#039;administration et le Bureau. Il représente l&#039;association dans tous les actes de la vie civile et est investi de tous pouvoirs à cet effet. Il peut déléguer certaines de ses attributions.&lt;br /&gt;
Il a notamment qualité pour ester en justice au nom de l&#039;association, tant en demande qu&#039;en défense.&lt;br /&gt;
En cas d&#039;absence ou de maladie, il est remplacé par tout administrateur spécialement délégué par le Conseil, en priorité par le vice-président.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vice-président&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Il remplace le président en cas d&#039;incapacité de ce dernier à remplir ses obligations, sur demande de ce dernier ou sur demande du bureau.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Responsable de la publication technique et éditoriale&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le responsables de la publication est chargé d&#039;assurer la coordination des articles publiés ainsi que de leur validité.&lt;br /&gt;
Il est défini deux postes :&lt;br /&gt;
un responsable de la publication technique &lt;br /&gt;
un responsable de la publication éditoriale &lt;br /&gt;
Ceux-ci sont nommés par le bureau et peuvent être membre de celui-ci ou bien du conseil d&#039;administration de l&#039;association. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secrétaire&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le Secrétaire est chargé de tout ce qui concerne la correspondance et des archives.&lt;br /&gt;
Il rédige les procès verbaux des délibérations &lt;br /&gt;
Il tient le registre spécial prévu par la loi et assure l&#039;exécution des formalités prescrites.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Trésorier&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le trésorier est chargé de tenir, ou faire tenir, sous son contrôle, la comptabilité de l&#039;association. Il perçoit toute recette ; il effectue tout paiement, sous réserve de l&#039;autorisation du président ainsi que l&#039;inventaire. En cas d&#039;empêchement, il est remplacé par le président.&lt;br /&gt;
&lt;br /&gt;
À l&#039;égard des organismes bancaires ou postaux, le président, le trésorier, ou tout autre personne désignée par le président avec l&#039;accord du conseil d&#039;administration, ont pouvoir, chacun séparément, de signer tous moyens de paiement (chèques, virements...).&lt;br /&gt;
&lt;br /&gt;
= Article 12 : réunion du conseil d&#039;administration =&lt;br /&gt;
Le conseil d&#039;administration se réunit tous les six mois, sur convocation du président, ou sur demande de la moitié de ses membres. Au moins la moitié des membres doivent être présents pour que le conseil d&#039;administration puisse délibérer valablement.&lt;br /&gt;
&lt;br /&gt;
Il est tenu un compte-rendu des séances.&lt;br /&gt;
&lt;br /&gt;
Les décisions sont prises à la majorité des voix; en cas de partage, la voix du président est prépondérante.&lt;br /&gt;
&lt;br /&gt;
Tout membre du conseil qui, sans excuse, n&#039;aura pas assisté à trois réunions consécutives, pourra être considéré comme démissionnaire par le conseil d&#039;administration.&lt;br /&gt;
&lt;br /&gt;
Ces réunions pourront être faite «en ligne» sur internet (via des outils de communication en direct) au cas où plusieurs membres sont dans l&#039;incapacité de se déplacer.&lt;br /&gt;
&lt;br /&gt;
= Article 13 : assemblée générale ordinaire =&lt;br /&gt;
L&#039;assemblée générale ordinaire se réunit une fois par an et comprend tous les membres de l&#039;association à jour de leur cotisation. Quinze jours au moins avant la date fixée, les membres de l&#039;association sont convoqués. La convocation pourra se faire par courrier, courrier électronique ou tout autre moyen de communication. L&#039;ordre du jour sera communiqué sur les convocations. &lt;br /&gt;
&lt;br /&gt;
Le président, assisté des membres du conseil, préside l&#039;assemblé et expose la situation morale de l&#039;association. Le trésorier rend compte de sa gestion et expose la situation financière. Le bilan est soumis à l&#039;approbation de l&#039;assemblée. &lt;br /&gt;
&lt;br /&gt;
L&#039;assemblée délibère ensuite sur les orientations à venir ; il est procédé, après épuisement de l&#039;ordre du jour, au remplacement, au scrutin secret, des membres du conseil éventuellement sortants.&lt;br /&gt;
&lt;br /&gt;
Les membres empêchés peuvent se faire représenter par un autre membre de l&#039; association au moyen d&#039; un pouvoir écrit (par voie électronique signée, par fax ou par courier). &lt;br /&gt;
&lt;br /&gt;
= Article 14 : assemblée générale extraordinaire =&lt;br /&gt;
Si besoin est, ou sur demande d&#039;un tiers plus un des membres inscrits, le président peut convoquer une assemblée générale extraordinaire, suivant les formalités de l&#039;article treize.&lt;br /&gt;
&lt;br /&gt;
= Article 15 : rémunération =&lt;br /&gt;
Les membres de l&#039;association ont droit au remboursement des dépenses engagées pour l&#039;association, sur présentation de justificatifs et après accord du bureau.&lt;br /&gt;
&lt;br /&gt;
Les frais de déplacements seront remboursés sur le barème de l&#039;administration fiscale. Leurs fonctions sont principalement bénévoles mais une rémunération exceptionnelle peut être prévue dans les limites fixées par la réglementation fiscale.&lt;br /&gt;
&lt;br /&gt;
= Article 16 : règlement intérieur =&lt;br /&gt;
Un règlement intérieur peut être établi par le conseil d&#039;administration qui le fait alors approuver par l&#039;assemblée générale ordinaire. Il s&#039;impose à tous les membres de l&#039;association.&lt;br /&gt;
&lt;br /&gt;
Ce règlement permettra de bien cerner l&#039;esprit de l&#039;association, et donnera des directives et des conseils pour le fonctionnement de l&#039; association. Et il pourra permettre éventuellement de fixer les divers points non prévus par les statuts.&lt;br /&gt;
&lt;br /&gt;
Il pourra être modifié par le conseil d&#039;administration, et ratifié par l&#039;assemblée générale ordinaire.&lt;br /&gt;
&lt;br /&gt;
Ce règlement éventuel est destiné à fixer les divers points non prévus par les statuts.&lt;br /&gt;
&lt;br /&gt;
= Article 17 : dissolution =&lt;br /&gt;
La dissolution est prononcée par l&#039;assemblée générale extraordinaire qui nomme un liquidateur. L&#039;actif, s&#039;il y a lieu, sera dévolu conformément à l&#039;article 9 de la loi du 1er juillet 1901 et au décret du 16 août 1901, en faveur d&#039;une ou plusieurs associations ayant un objet voisin.&lt;br /&gt;
&lt;br /&gt;
{{DP}}&lt;/div&gt;</summary>
		<author><name>Pterjan</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Lea_Linux:Statuts_du_03-12-2005&amp;diff=10997</id>
		<title>Lea Linux:Statuts du 03-12-2005</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Lea_Linux:Statuts_du_03-12-2005&amp;diff=10997"/>
		<updated>2005-12-03T10:50:24Z</updated>

		<summary type="html">&lt;p&gt;Pterjan : Vraie liste&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Association]]&lt;br /&gt;
Ecrits par les membres fondateurs : Frédéric Bonnaud, Jean-Christophe Cardot, Anne-Laure Nicolas, Serge Tchesmeli.&lt;br /&gt;
&lt;br /&gt;
= Article 1 : constitution et dénomination =&lt;br /&gt;
Il est fondé entre les adhérents aux présents statuts une association régie par la loi du 1er juillet 1901 et le décret du 16 août 1901, ayant pour dénomination l&#039;association Léa (Linux entre amis).&lt;br /&gt;
&lt;br /&gt;
= Article 2 : objet =&lt;br /&gt;
Cette association a pour but de promouvoir et de défendre par tous les moyens dont elle dispose, y compris juridiques, les logiciels libres au sens ou l&#039;entendent l&#039;association « Free Software Foundation (FSF) » et l&#039;organisme « Open Source Initiative (OSI) », dont le système d&#039;exploitation Linux, afin d&#039;aider à leur installation et configuration par divers moyens tels que :&lt;br /&gt;
* la rédaction et la publication d&#039;articles en ligne, en particulier sur les sites web http://lea-linux.org, http://linuxfrench.net et http://asill.org animés par l&#039;association ou sur tout autre site partenaire, &lt;br /&gt;
* la publication permanente et en langue française d&#039;articles et de brèves réalisés par ou pour l&#039;association et ceci sur tous les formats possibles (numérique ou non),&lt;br /&gt;
* des réunions d&#039;utilisateurs avec des conférences et des débats animés par l&#039;association ou des personnes externes, &lt;br /&gt;
* la présence et interventions dans diverses manifestations,&lt;br /&gt;
* la défense légale des documentations réalisées par ses membres.&lt;br /&gt;
&lt;br /&gt;
= Article 3 : siège social = &lt;br /&gt;
Le siège social est fixé à l&#039;adresse suivante :&lt;br /&gt;
:c/o Jean-Christophe Cardot&lt;br /&gt;
:12, rue Boucry&lt;br /&gt;
:75018 PARIS&lt;br /&gt;
&lt;br /&gt;
Il pourra être transféré par simple décision du conseil d&#039;administration.&lt;br /&gt;
&lt;br /&gt;
= Article 4 : durée =&lt;br /&gt;
La durée de l&#039;association est de 99 ans.&lt;br /&gt;
&lt;br /&gt;
= Article 5 : composition de l&#039;association =&lt;br /&gt;
L&#039;association se compose de :&lt;br /&gt;
* &#039;&#039;&#039;membres actifs&#039;&#039;&#039;. Sont membres actifs ceux qui sont à jour de leur cotisation annuelle. Il peut y avoir deux types de membres actifs : les personnes physiques et les personnes morales. Ils disposent chacun d&#039;une voix lors des votes de l&#039;assemblée générale. Si une personne physique est également représentante d&#039;une personne morale, elle dispose d&#039;une voix en tant que personne physique, et d&#039;une voix en tant que personne morale. &lt;br /&gt;
* &#039;&#039;&#039;membres d&#039;honneur&#039;&#039;&#039;. Le titre de membre d&#039;honneur peut être décerné par le conseil d&#039; administration aux personnes qui rendent ou ont rendu des services signalés à l&#039;association. Les membres d&#039; honneur sont des membres de l&#039; Assemblée Générale et ne sont pas tenus de payer une cotisation annuelle. &lt;br /&gt;
* &#039;&#039;&#039;membres bienfaiteurs&#039;&#039;&#039;. Personnes physiques ou morales qui auront versé une cotisation annuelle au moins double de la cotisation des membres actifs.&lt;br /&gt;
&lt;br /&gt;
= Article 6 : admission et adhésion =&lt;br /&gt;
Pour faire partie de l&#039;association, il faut adhérer aux présents statuts, être agréé par le conseil d&#039;administration, avoir souscrit un bulletin d&#039;adhésion qui précise la qualité de l&#039;adhérant (personne morale ou physique), avoir acquitté un droit d&#039;entrée égal à la cotisation annuelle.&lt;br /&gt;
&lt;br /&gt;
En cas de refus d&#039;une adhésion par le conseil d&#039;administration (un avis sera alors transmis à l&#039;intéressé), le droit d&#039;entrée éventuellement perçu sera intégralement remboursé.&lt;br /&gt;
&lt;br /&gt;
= Article 7 : cotisation =&lt;br /&gt;
Une cotisation annuelle doit être acquittée par les adhérents. Son montant est fixé chaque année par le conseil d&#039;administration. Celui-ci pourra être différent pour les personnes physiques et les personnes morales.&lt;br /&gt;
&lt;br /&gt;
Sur décision du conseil d&#039;administration, un ou tous les membres de l&#039;association peuvent être dispensés de cotisation.&lt;br /&gt;
&lt;br /&gt;
Toute cotisation pourra être rachetée moyennant le paiement d&#039;une somme minima égale à dix fois le montant annuel sans que la somme globale ne puisse dépasser un montant de 15 (quinze) euros (cf. loi du 1er Janvier 1901, modifiée par la loi du 23 juin 1948, n°48-1001.)&lt;br /&gt;
&lt;br /&gt;
= Article 8 : radiation =&lt;br /&gt;
La qualité de membre se perd par :&lt;br /&gt;
* le décès, &lt;br /&gt;
* la démission qui doit être adressée par écrit au conseil d&#039;administration, &lt;br /&gt;
* le non-paiement de la cotisation dans un délai de 2 mois après sa date d&#039;exigibilité (validée dans ce cas par une décision du conseil d&#039;administration), &lt;br /&gt;
&lt;br /&gt;
La radiation est prononcée par le conseil d&#039;administration pour le non-paiement de la cotisation, ou pour motif grave, l&#039;intéressé ayant été invité par lettre recommandée à se présenter devant le bureau pour fournir des explications.&lt;br /&gt;
&lt;br /&gt;
= Article 9 : ressources =&lt;br /&gt;
Les ressources de l&#039;association comprennent :&lt;br /&gt;
- le montant des cotisations, &lt;br /&gt;
- les subventions de l&#039;état et des collectivités territoriales, &lt;br /&gt;
- les recettes des manifestations exceptionnelles, &lt;br /&gt;
- toute autre ressource que peut percevoir une association régie par la loi du 1er juillet 1901 et le décret du 16 août 1901 et qui ne soit pas contraire aux règles en vigueur.&lt;br /&gt;
&lt;br /&gt;
= Article 10 : bureau et conseil d&#039;administration =&lt;br /&gt;
L&#039;association est dirigée par un bureau et un conseil d&#039;administration. Le bureau est composé des 4 membres fondateurs, permanents (sauf démission du bureau ou du conseil d&#039;administration ou radiation de l&#039;association). Le conseil d&#039;administration est composé du bureau augmenté sur décision du conseil de 0 à 7 membres élus par l&#039;assemblée générale.&lt;br /&gt;
&lt;br /&gt;
Les membres fondateurs sont :&lt;br /&gt;
* Frédéric Bonnaud, &lt;br /&gt;
* Jean-Christophe Cardot, &lt;br /&gt;
* Anne-Laure Nicolas,&lt;br /&gt;
* Serge Tchesmeli (démissionnaire).&lt;br /&gt;
&lt;br /&gt;
Ils forment le &#039;&#039;&#039;Bureau&#039;&#039;&#039; qui élira en son sein, lors de chaque assemblée générale, un &#039;&#039;&#039;président&#039;&#039;&#039;, un &#039;&#039;&#039;vice-président&#039;&#039;&#039;, un &#039;&#039;&#039;secrétaire&#039;&#039;&#039; et un &#039;&#039;&#039;trésorier&#039;&#039;&#039;. En cas de départ de l&#039;association d&#039;un de ces quatre membres, celui sera remplacé : provisoirement, avant la prochaine assemblée générale, par le conseil, puis par une élection pour deux ans par cette assemblée générale. De plus, le bureau peut décider d&#039;admettre un membre en son sein, par cooptation puis vote des membres du bureau.&lt;br /&gt;
&lt;br /&gt;
En cas de vacances de poste au conseil, celui-ci pourvoit de la même façon au remplacement du ou des membres aux postes vacants. De même, en cas de décision du conseil d&#039;augmenter le nombre de ses membres, ce ou ces membres sont élus pour 2 années lors de la prochaine assemblée générale.&lt;br /&gt;
&lt;br /&gt;
Les mineurs de moins de 16 ans peuvent être élus au conseil d&#039;administration après acceptation de leur candidature par le conseil d&#039;administration sortant.&lt;br /&gt;
&lt;br /&gt;
= Article 11 : rôle des membres du bureau =&lt;br /&gt;
Les rôles respectifs du bureau et du conseil d&#039;administration pourront être précisés dans le règlement intérieur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Président&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le président convoque les assemblées générales ainsi que le conseil d&#039;administration et le Bureau. Il représente l&#039;association dans tous les actes de la vie civile et est investi de tous pouvoirs à cet effet. Il peut déléguer certaines de ses attributions.&lt;br /&gt;
Il a notamment qualité pour ester en justice au nom de l&#039;association, tant en demande qu&#039;en défense.&lt;br /&gt;
En cas d&#039;absence ou de maladie, il est remplacé par tout administrateur spécialement délégué par le Conseil, en priorité par le vice-président.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vice-président&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Il remplace le président en cas d&#039;incapacité de ce dernier à remplir ses obligations, sur demande de ce dernier ou sur demande du bureau.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Responsable de la publication technique et éditoriale&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le responsables de la publication est chargé d&#039;assurer la coordination des articles publiés ainsi que de leur validité.&lt;br /&gt;
Il est défini deux postes :&lt;br /&gt;
un responsable de la publication technique &lt;br /&gt;
un responsable de la publication éditoriale &lt;br /&gt;
Ceux-ci sont nommés par le bureau et peuvent être membre de celui-ci ou bien du conseil d&#039;administration de l&#039;association. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secrétaire&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le Secrétaire est chargé de tout ce qui concerne la correspondance et des archives.&lt;br /&gt;
Il rédige les procès verbaux des délibérations &lt;br /&gt;
Il tient le registre spécial prévu par la loi et assure l&#039;exécution des formalités prescrites.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Trésorier&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le trésorier est chargé de tenir, ou faire tenir, sous son contrôle, la comptabilité de l&#039;association. Il perçoit toute recette ; il effectue tout paiement, sous réserve de l&#039;autorisation du président ainsi que l&#039;inventaire. En cas d&#039;empêchement, il est remplacé par le président.&lt;br /&gt;
&lt;br /&gt;
À l&#039;égard des organismes bancaires ou postaux, le président, le trésorier, ou tout autre personne désignée par le président avec l&#039;accord du conseil d&#039;administration, ont pouvoir, chacun séparément, de signer tous moyens de paiement (chèques, virements...).&lt;br /&gt;
&lt;br /&gt;
= Article 12 : réunion du conseil d&#039;administration =&lt;br /&gt;
Le conseil d&#039;administration se réunit tous les six mois, sur convocation du président, ou sur demande de la moitié de ses membres. Au moins la moitié des membres doivent être présents pour que le conseil d&#039;administration puisse délibérer valablement.&lt;br /&gt;
&lt;br /&gt;
Il est tenu un compte-rendu des séances.&lt;br /&gt;
&lt;br /&gt;
Les décisions sont prises à la majorité des voix; en cas de partage, la voix du président est prépondérante.&lt;br /&gt;
&lt;br /&gt;
Tout membre du conseil qui, sans excuse, n&#039;aura pas assisté à trois réunions consécutives, pourra être considéré comme démissionnaire par le conseil d&#039;administration.&lt;br /&gt;
&lt;br /&gt;
Ces réunions pourront être faite «en ligne» sur internet (via des outils de communication en direct) au cas où plusieurs membres sont dans l&#039;incapacité de se déplacer.&lt;br /&gt;
&lt;br /&gt;
= Article 13 : assemblée générale ordinaire =&lt;br /&gt;
L&#039;assemblée générale ordinaire se réunit une fois par an et comprend tous les membres de l&#039;association à jour de leur cotisation. Quinze jours au moins avant la date fixée, les membres de l&#039;association sont convoqués. La convocation pourra se faire par courrier, courrier électronique ou tout autre moyen de communication. L&#039;ordre du jour sera communiqué sur les convocations. &lt;br /&gt;
&lt;br /&gt;
Le président, assisté des membres du conseil, préside l&#039;assemblé et expose la situation morale de l&#039;association. Le trésorier rend compte de sa gestion et expose la situation financière. Le bilan est soumis à l&#039;approbation de l&#039;assemblée. &lt;br /&gt;
&lt;br /&gt;
L&#039;assemblée délibère ensuite sur les orientations à venir ; il est procédé, après épuisement de l&#039;ordre du jour, au remplacement, au scrutin secret, des membres du conseil éventuellement sortants.&lt;br /&gt;
&lt;br /&gt;
Les membres empêchés peuvent se faire représenter par un autre membre de l&#039; association au moyen d&#039; un pouvoir écrit (par voie électronique signée, par fax ou par courier). &lt;br /&gt;
&lt;br /&gt;
= Article 14 : assemblée générale extraordinaire =&lt;br /&gt;
Si besoin est, ou sur demande d&#039;un tiers plus un des membres inscrits, le président peut convoquer une assemblée générale extraordinaire, suivant les formalités de l&#039;article treize.&lt;br /&gt;
&lt;br /&gt;
= Article 15 : rémunération =&lt;br /&gt;
Les membres de l&#039;association ont droit au remboursement des dépenses engagées pour l&#039;association, sur présentation de justificatifs et après accord du bureau.&lt;br /&gt;
&lt;br /&gt;
Les frais de déplacements seront remboursés sur le barème de l&#039;administration fiscale. Leurs fonctions sont principalement bénévoles mais une rémunération exceptionnelle peut être prévue dans les limites fixées par la réglementation fiscale.&lt;br /&gt;
&lt;br /&gt;
= Article 16 : règlement intérieur =&lt;br /&gt;
Un règlement intérieur peut être établi par le conseil d&#039;administration qui le fait alors approuver par l&#039;assemblée générale ordinaire. Il s&#039;impose à tous les membres de l&#039;association.&lt;br /&gt;
&lt;br /&gt;
Ce règlement permettra de bien cerner l&#039;esprit de l&#039;association, et donnera des directives et des conseils pour le fonctionnement de l&#039; association. Et il pourra permettre éventuellement de fixer les divers points non prévus par les statuts.&lt;br /&gt;
&lt;br /&gt;
Il pourra être modifié par le conseil d&#039;administration, et ratifié par l&#039;assemblée générale ordinaire.&lt;br /&gt;
&lt;br /&gt;
Ce règlement éventuel est destiné à fixer les divers points non prévus par les statuts.&lt;br /&gt;
&lt;br /&gt;
= Article 17 : dissolution =&lt;br /&gt;
La dissolution est prononcée par l&#039;assemblée générale extraordinaire qui nomme un liquidateur. L&#039;actif, s&#039;il y a lieu, sera dévolu conformément à l&#039;article 9 de la loi du 1er juillet 1901 et au décret du 16 août 1901, en faveur d&#039;une ou plusieurs associations ayant un objet voisin.&lt;br /&gt;
&lt;br /&gt;
{{DP}}&lt;/div&gt;</summary>
		<author><name>Pterjan</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Discussion_Lea_Linux:AG_2005&amp;diff=10770</id>
		<title>Discussion Lea Linux:AG 2005</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Discussion_Lea_Linux:AG_2005&amp;diff=10770"/>
		<updated>2005-11-17T23:14:55Z</updated>

		<summary type="html">&lt;p&gt;Pterjan : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Utilisateur:ST|ST]] (AG + Confs + Soirée) - 1 personne&lt;br /&gt;
* [[Utilisateur:Maston28|Maston28]] (AG + Confs + Soirée) - 1 personne&lt;br /&gt;
* [[Utilisateur:Fred|Fred]] (AG + Confs + Soirée ... si hébergement) - 1 personne&lt;br /&gt;
* [[Utilisateur:Ennael|Anne]]  (AG + Confs + Soirée) - 2 personnes&lt;br /&gt;
* [[Utilisateur:Phlogistique|Noé Rubinstein]] (Confs) - 1 personne - pas sur&lt;br /&gt;
* [[Utilisateur:Zragg|Zragg]]  (AG + Confs + Soirée) - 1 personnes&lt;br /&gt;
* [[Utilisateur:Philheap|Philheap]]  (AG + Confs + Soirée) - 2 personnes&lt;br /&gt;
* [[Utilisateur:LeaJice|Jice]] (AG + Confs + Soirée) - 1 personne&lt;br /&gt;
* [[Utilisateur:Pterjan|CMoi]]  (Confs + Soirée) - 1 personne&lt;/div&gt;</summary>
		<author><name>Pterjan</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Iptables&amp;diff=10005</id>
		<title>Iptables</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Iptables&amp;diff=10005"/>
		<updated>2005-10-26T10:14:30Z</updated>

		<summary type="html">&lt;p&gt;Pterjan : DENY -&amp;gt; DROP&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Sécurité]]&lt;br /&gt;
= IpTables par l&#039;exemple =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;leatitre&amp;quot;&amp;gt;IpTables par l&#039;exemple&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;Arnaud de Bermingham&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leadesc&amp;quot;&amp;gt;IpTables par l&#039;exemple&amp;lt;/div&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Contact : [mailto:duracell chez apinc point org  duracell chez apinc point org]&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;révision par Jice &amp;lt;[mailto:jice chez lea-linux point org jice chez lea-linux point org]&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;révision par Fred &amp;lt;[mailto:fred chez lea-linux point org fred chez lea-linux point org]&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Cet article présente de façon pratique la mise en place d&#039;un firewall / proxy sur une machine Linux tournant avec un noyau 2.4. &amp;lt;br /&amp;gt;Pour des informations plus théoriques sur les firewall/proxies, vous pouvez lire l&#039;[firewall.php3 article firewall].&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;nowiki&amp;gt;* Présentation d&#039;IpTables&amp;lt;/nowiki&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
IpTables est une solution complète de firewall (noyau 2.4) remplaçant &#039;&#039;ipchains&#039;&#039; (noyau 2.2) tournant sous le système GNU/Linux. IpTables permet de faire du firewalling &#039;&#039;stateful&#039;&#039; (à états), de la translation de port et d&#039;adresse, du filtrage au niveau 2 et beaucoup d&#039;autres choses que nous n&#039;allons pas aborder comme le &amp;quot;Mangle&amp;quot; ou modification des paquets à la volée (atchoum).&lt;br /&gt;
&lt;br /&gt;
IpTables est fiable et dispose de très nombreuses options qui permettent de faire du filtrage très fin.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;nowiki&amp;gt;* Licence de cet article&amp;lt;/nowiki&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Cette documentation est sous licence LDP&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;nowiki&amp;gt;* Licence de NetFilter&amp;lt;/nowiki&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
NetFilter est sous licence libre GPL, i.e. gratuit et modifiable du moment que les modifications et améliorations apportées soit rendues publiques.&lt;br /&gt;
&lt;br /&gt;
== 1/ Installation ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1/ Prérequis ===&lt;br /&gt;
&lt;br /&gt;
IpTables est installé en standard sur de nombreuses distributions Linux récentes. En particulier, il est installé sur Linux RedHat 7.1 et sur la plupart des distributions basées sur un kernel 2.4.x.&lt;br /&gt;
&lt;br /&gt;
IpTables a besoin d&#039;un &#039;&#039;&#039;kernel de génération 2.4&#039;&#039;&#039; compilé avec des options spéciales. Ceci ne pose pas de problèmes avec les noyaux 2.4 génériques des principales distributions basées sur cette génération de kernel.&lt;br /&gt;
&lt;br /&gt;
=== 1.2/ Options de compilation du kernel ===&lt;br /&gt;
&lt;br /&gt;
Si vous désirez re-compiler votre kernel, il faut spécifier les options nécessaires au fonctionnement d&#039;iptables.&lt;br /&gt;
&lt;br /&gt;
Les options suivantes doivent êtres activées en module (&amp;lt;tt&amp;gt;M&amp;lt;/tt&amp;gt;) ou dans le kernel (&amp;lt;tt&amp;gt;Y&amp;lt;/tt&amp;gt;) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;CONFIG_PACKET&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_NETFILTER&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;CONFIG_IP_NF_CONNTRACK&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_IP_NF_FTP&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_IP_NF_IRC&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_IP_NF_IPTABLES&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_IP_NF_FILTER&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_IP_NF_NAT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_IP_NF_MATCH_STATE&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_IP_NF_TARGET_LOG&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_IP_NF_MATCH_LIMIT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_IP_NF_TARGET_MASQUERADE&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
et éventuellement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;CONFIG_IP_NF_COMPAT_IPCHAINS&amp;lt;/tt&amp;gt; pour garder la compatibilité avec &amp;lt;u&amp;gt;ipchains&amp;lt;/u&amp;gt;. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_IP_NF_COMPAT_IPFWADM&amp;lt;/tt&amp;gt; pour garder la compatibilité avec &amp;lt;u&amp;gt;ipfwadm&amp;lt;/u&amp;gt;. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_IP_NF_TARGET_REDIRECT&amp;lt;/tt&amp;gt; indispensable, pour les proxies transparents par exemple. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;CONFIG_IP_NF_MATCH_MAC&amp;lt;/tt&amp;gt; permet de matcher avec les adresses MAC.&lt;br /&gt;
&lt;br /&gt;
Ne pas oublier le support réseau et TCP/IP et compiler le kernel comme d&#039;habitude : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;make dep &amp;amp;&amp;amp; make clean &amp;amp;&amp;amp; make bzImage &amp;amp;&amp;amp; make modules &amp;amp;&amp;amp; make modules_install&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 1.3/ Installation ===&lt;br /&gt;
&lt;br /&gt;
Sur une RedHat 7.1, récupérer le package &amp;lt;tt&amp;gt;netfilter&amp;lt;/tt&amp;gt; et l&#039;installer comme d&#039;habitude avec &amp;lt;tt&amp;gt;rpm -Uvh netfilter-x.y.z.rpm&amp;lt;/tt&amp;gt;. &amp;lt;br /&amp;gt;Sur les versions inférieures a la 7.1, il faut compiler un kernel 2.4 car iptables ne supporte pas les kernels 2.2.x. La compilation de iptables est complexe. Le mieux est de lire le fichier INSTALL du package des sources.&lt;br /&gt;
&lt;br /&gt;
=== 1.4/ Chargement des modules ===&lt;br /&gt;
&lt;br /&gt;
Dans le cas ou les options iptables du kernel ont étés compilées en modules, il est nécessaire de charger ces modules avant de pouvoir utiliser iptables :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# modprobe ip_tables&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
selon les besoins, on peut éventuellement charger les modules suivants :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# modprobe ip_nat_ftp&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# modprobe ip_nat_irc&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# modprobe iptable_filter&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# modprobe iptable_mangle&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# modprobe iptable_nat&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on a besoin de pouvoir forwarder&amp;lt;sup&amp;gt;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&amp;lt;/sup&amp;gt; les paquets IP (dans la plupart des cas), il sera nécessaire d&#039;exécuter cette commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
afin de l&#039;indiquer au noyau.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;sup&amp;gt;&amp;lt;nowiki&amp;gt;* &amp;lt;/nowiki&amp;gt;&amp;lt;/sup&amp;gt;&amp;lt;u&amp;gt;forwarder&amp;lt;/u&amp;gt;&lt;br /&gt;
: il s&#039;agit de faire passer des paquets IP d&#039;une interface réseau vers une autre. Par exemple, un paquet qui arrive de l&#039;internet via un modem ou une carte réseau sera &#039;&#039;redirigé&#039;&#039; (ou &#039;&#039;forwardé&#039;&#039;) vers la carte réseau par laquelle le firewall est attaché au réseau local.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota Bene :&#039;&#039;&#039; tous les modprobe semblent inutiles car le kernel les chargent automatiquement si l&#039;on se sert de l&#039;une des fonctionnalités d&#039;iptables.&lt;br /&gt;
&lt;br /&gt;
== 2/ Présentation ==&lt;br /&gt;
&lt;br /&gt;
=== 2.1/ Les tables ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Table NAT&#039;&#039;&#039; (Network Address Translation) : Table utilisée pour la translation d&#039;adresse ou la translation de port. &amp;lt;br /&amp;gt;Il a 2 types de chaînes&amp;lt;sup&amp;gt;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;/sup&amp;gt; : &#039;&#039;PREROUTING&#039;&#039; qui permet de spécifier &amp;quot;à l&#039;arrivée du firewall&amp;quot; et la chaîne &#039;&#039;POSTROUTING&#039;&#039; qui permet de spécifier &amp;quot;à la sortie du firewall&amp;quot;. Il existe 3 targets (ou cibles) : &#039;&#039;DNAT&amp;lt;sup&amp;gt;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&amp;lt;/sup&amp;gt;, SNAT&amp;lt;sup&amp;gt;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&amp;lt;/sup&amp;gt;&#039;&#039; et &#039;&#039;MASQUERADE&amp;lt;sup&amp;gt;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&amp;lt;/sup&amp;gt;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Table FILTER&#039;&#039;&#039; : C&#039;est la table par défaut lorsque l&#039;on en spécifie pas. &amp;lt;br /&amp;gt;Cette table contient toutes les règles de filtrage, il existe 3 types de chaînes : &#039;&#039;FORWARD&#039;&#039; pour les paquets passant par le firewall, &#039;&#039;INPUT&#039;&#039; pour les paquets entrant et &#039;&#039;OUTPUT&#039;&#039; pour les paquets sortants. Les cibles disponibles sont : &#039;&#039;ACCEPT, DENY, DROP, REJECT °&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Table Mangle&#039;&#039;&#039; : C&#039;est la table qui contient les règles pour la modification de paquets. &amp;lt;br /&amp;gt;Elle est peu utilisée et ne sera pas décrite dans cet article.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;A noter&amp;lt;/u&amp;gt; : Les règles sont matchées dans l&#039;ordre, par défaut la table &#039;&#039;FILTER&#039;&#039; est vide et donc accepte tout. Aucune règle de translation d&#039;adresse n&#039;est présente par défaut.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;sup&amp;gt;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;/sup&amp;gt; &amp;lt;u&amp;gt;chaîne&amp;lt;/u&amp;gt;&lt;br /&gt;
: une chaîne est une suite de règles, qui sont prises dans l&#039;ordre ; dès qu&#039;une règle matche un paquet, elle est déclenchée, et la suite de la chaîne est ignorée.&lt;br /&gt;
; * &amp;lt;u&amp;gt;SNAT&amp;lt;/u&amp;gt;&lt;br /&gt;
: permet de modifier l&#039;adresse source du paquet.&lt;br /&gt;
; * &amp;lt;u&amp;gt;DNAT&amp;lt;/u&amp;gt;&lt;br /&gt;
: permet de modifier l&#039;adresse destination du paquet.&lt;br /&gt;
; * &amp;lt;u&amp;gt;MASQUERADE&amp;lt;/u&amp;gt;&lt;br /&gt;
: Une gateway transforme les paquets sortants passant par elle pour donner l&#039;illusion qu&#039;ils sortent de la gateway elle-même par un port alloué dynamiquement ; lorsque la gateway recoit une réponse sur ce port, elle utilise une table de correspondance entre le port et les machines du réseau privé qu&#039;elle gère pour lui faire suivre le paquet.&lt;br /&gt;
; ° &amp;lt;u&amp;gt;policy ACCEPT&amp;lt;/u&amp;gt;&lt;br /&gt;
: permet d&#039;accepter un paquet grâce à la règle vérifiée.&lt;br /&gt;
; ° &amp;lt;u&amp;gt;policy DROP&amp;lt;/u&amp;gt;&lt;br /&gt;
: Rejet d&#039;un paquet sans message d&#039;erreur si la règle est vérifiée (&amp;quot;non ! j&#039;en veux pas mais je dis rien à l&#039;expediteur&amp;quot;).&lt;br /&gt;
; ° &amp;lt;u&amp;gt;policy REJECT&amp;lt;/u&amp;gt;&lt;br /&gt;
: Rejet avec un retour de paquet d&#039;erreur à l&#039;expediteur si la la règle est verifiée (&amp;quot;un paquet recommandé de La Poste refusé par son destinataire&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== 2.2/ Les commandes ===&lt;br /&gt;
&lt;br /&gt;
IpTables n&#039;est pas livré avec une interface graphique ; les commandes et les règles sont passées en ligne de commande. Le mieux est d&#039;écrire des scripts (à rajouter dans &amp;lt;tt&amp;gt;/etc/rc.d/init.d&amp;lt;/tt&amp;gt;) qui permettent d&#039;appliquer toutes les règles d&#039;un seul coup, dès le démarrage du Linux.&lt;br /&gt;
&lt;br /&gt;
==== 2.2.1/ Commandes principales ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-A --append&amp;lt;/tt&amp;gt; : Ajoute la règle à la fin de la chaîne spécifiée &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT ...&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-D --delete&amp;lt;/tt&amp;gt; : Permet de supprimer une chaîne. On peut la matcher de 2 manières, soit en spécifiant le numéros de la chaîne a supprimer, soit en &amp;lt;br /&amp;gt;spécifiant la règle à retirer. &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemples :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -D INPUT --dport 80 -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -D INPUT 1&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-R --replace&amp;lt;/tt&amp;gt; : Permet contrairement à &amp;lt;tt&amp;gt;--delete&amp;lt;/tt&amp;gt; de remplacer la chaîne spécifiée. &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -R INPUT 1 -s 192.168.0.1 -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-I --insert&amp;lt;/tt&amp;gt; : Permet d&#039;ajouter une chaîne dans un endroit spécifié de la chaîne. &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -I INPUT 1 --dport 80 -j ACCEPT&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-L --list&amp;lt;/tt&amp;gt; : Permet d&#039;afficher les règles. &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemples :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -L        &amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# Affiche toutes les règles des chaînes de FILTER&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -L INPUT  &amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# Affiche toutes les règles de INPUT (FILTER)&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-F --flush&amp;lt;/tt&amp;gt; : Permet de vider toutes les règles d&#039;une chaîne. &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -F INPUT&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-N --new-chain&amp;lt;/tt&amp;gt; : Permet de créer une nouvelle chaîne. &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -N LOG_DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-X --delete-chain&amp;lt;/tt&amp;gt; : Permet d&#039;effacer une chaîne. &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -X LOG_DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-P --policy&amp;lt;/tt&amp;gt; : Permet de spécifier au kernel la target par défaut d&#039;une chaîne DENY, ACCEPT, REJECT, DROP ... &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -P INPUT DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2.2.2/ Commandes pour matcher ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Remarques&amp;lt;/u&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
Le &amp;quot;!&amp;quot; peut être utilisé pour certaines commandes afin de spécifier le contraire (on peut le traduire par &amp;quot;sauf&amp;quot;). Par exemple une commande qui doit refuser tout trafic TCP sauf ce qui provient de l&#039;adresse IP 10.42.42.42 sera traduite par la commande suivante : &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p tcp --source ! 10.42.42.42 -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les adresses IP peuvent optionnellement être spécifiées avec le masque associé sous la forme [adresse ip]/[masque].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-p --protocol&amp;lt;/tt&amp;gt; : Spécifier un protocole : &amp;lt;tt&amp;gt;tcp&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;udp&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;icmp&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;all&amp;lt;/tt&amp;gt; (tous) &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p icmp -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-s --source&amp;lt;/tt&amp;gt; : Spécifier une adresse source à matcher &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p tcp -s 192.168.42.42 -j ACCEPT&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-d --destination&amp;lt;/tt&amp;gt; : Spécifier une adresse destination &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A FORWARD -p tcp -d 10.1.0.1 -j ACCEPT&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-i --in-interface&amp;lt;/tt&amp;gt; : Spécifier une interface d&#039;entrée &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p icmp -i eth0 -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-o --out-interface&amp;lt;/tt&amp;gt; : Spécifier une interface de sortie &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A OUTPUT -p icmp -o eth0 -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;-f --fragment&amp;lt;/tt&amp;gt; : Paquet fragmenté &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p icmp -f -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--sport --source-port&amp;lt;/tt&amp;gt; : Spécifier le port source ou une plage de ports, fonctionne aussi en udp, &amp;lt;tt&amp;gt;-m multiport&amp;lt;/tt&amp;gt; permet de &amp;lt;br /&amp;gt;spécifier plusieurs ports à matcher. &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemples :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p tcp --sport 80 -j ACCEPT&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p udp --sport 80 -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A OUTPUT -p tcp -m multiport --sport 3128,21,1000 -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A OUTPUT -p tcp --sport 1024:2042 -j ACCEPT&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--dport --destination-port&amp;lt;/tt&amp;gt; : Spécifier le port destination ou une plage de ports, fonctionne aussi en udp, &amp;lt;tt&amp;gt;-m multiport&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;permet de spécifier plusieurs ports a matcher. &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemples :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p tcp --dport 110 -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p udp --dport 110 -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p tcp -m multiport --dport 110,4242,119 -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p tcp --sport 4925:4633 -j ACCEPT&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--tcp-flags&amp;lt;/tt&amp;gt; : Spécifier un flag tcp à matcher : &amp;lt;tt&amp;gt;SYN ACK FIN RST URG PSH ALL NONE&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p tcp --dport 42 --tcp-flags SYN,ACK -j ACCEPT&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--icmp-type&amp;lt;/tt&amp;gt; : Spécifier un type de paquet icmp à matcher &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -p icmp --icmp-type 8 -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--mac-source&amp;lt;/tt&amp;gt; : Spécifier l&#039;adresse MAC à matcher &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT --mac-source 42.42.AA.42.42.AA -j DROP&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--state&amp;lt;/tt&amp;gt; : Permet de spécifier l&#039;état du paquet à matcher parmi les états suivants : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; ESTABLISHED &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;: paquet associé à une connexion déjà établie &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; NEW         &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;: paquet demandant une nouvelle connexion &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; INVALID     &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;: paquet associé à une connexion inconnue &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; RELATED     &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;: Nouvelle connexion mais liée, idéal pour les connexions FTP &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemples :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Spécificités NAT&amp;lt;/u&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--to-destination&amp;lt;/tt&amp;gt; : Utilisé en target pour le DNAT, permet de spécifier l&#039;adresse de destination de la translation, on peut également spécifier un port s&#039;il est différent du port source. &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemples :&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -t nat -A PREROUTING -d 42.12.42.12 -p tcp --dport 110 -j DNAT --to-destination 192.168.1.2:6110&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# iptables -t nat -A PREROUTING -d ! 42.12.42.12 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.1:3128&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--to-source&amp;lt;/tt&amp;gt; : Utilisé pour en target pour le SNAT, permet de spécifier l&#039;adresse source de la translation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Spécificités pour les LOGS&amp;lt;/u&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--log-level&amp;lt;/tt&amp;gt; : Level, niveau de log &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple : Cf. chapitre 3&amp;lt;/font&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;--log-prefix&amp;lt;/tt&amp;gt; : Permet de spécifier un préfixe pour les logs. &amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;font color=&amp;quot;#770000&amp;quot;&amp;gt;Exemple : Cf. chapitre 3&amp;lt;/font&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2.2.3/ Quelques exemples : ====&lt;br /&gt;
&lt;br /&gt;
Les exemples qui suivent supposent que vous êtes reliés à internet par modem via l&#039;interface ppp0 (mais en remplaçant ppp0 par eth0 - par exemple, on peut adapter les exemples pour d&#039;autres type de liaisons) et que votre réseau local est 192.168.1.0/24 (classe C).&lt;br /&gt;
&lt;br /&gt;
* Pour fixer les &#039;&#039;&#039;politiques par défaut&#039;&#039;&#039; (cad: ce qui se passe quand aucune règle ne correspond - ne matche pas), ici, on refuse tout (normal, on fait un firewall, oui ou non ?) : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; iptables -P INPUT DROP&amp;lt;br /&amp;gt; iptables -P OUTPUT DROP&amp;lt;br /&amp;gt; iptables -P FORWARD DROP&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
* Pour &#039;&#039;&#039;logguer&#039;&#039;&#039; tout ce qu&#039;on jette : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; iptables -N LOG_DROP&amp;lt;br /&amp;gt; iptables -A LOG_DROP -j LOG --log-prefix &#039;[IPTABLES DROP] : &#039;&amp;lt;br /&amp;gt; iptables -A LOG_DROP -j DROP&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; Et ensuite, plutôt que de mettre &amp;lt;tt&amp;gt;-j DROP&amp;lt;/tt&amp;gt;, il faut mettre &amp;lt;tt&amp;gt;-j LOG_DROP&amp;lt;/tt&amp;gt; et les trois dernières règles doivent être : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; iptables -A FORWARD -j LOG_DROP&amp;lt;br /&amp;gt; iptables -A INPUT -j LOG_DROP&amp;lt;br /&amp;gt; iptables -A OUTPUT -j LOG_DROP &amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
* Pour &#039;&#039;&#039;accepter&#039;&#039;&#039; tout ce qui se passe sur l&#039;interface &amp;lt;tt&amp;gt;lo&amp;lt;/tt&amp;gt; (sinon ce n&#039;est pas la peine d&#039;activer le réseau !) : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; iptables -A INPUT -i lo -j ACCEPT&amp;lt;br /&amp;gt; iptables -A OUTPUT -o lo -j ACCEPT &amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
* Pour &#039;&#039;&#039;accepter&#039;&#039;&#039; tout ce qui se passe sur le &#039;&#039;&#039;réseau local&#039;&#039;&#039; &amp;lt;tt&amp;gt;192.168.1.0&amp;lt;/tt&amp;gt; : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT&amp;lt;br /&amp;gt; iptables -A OUTPUT -d 192.168.1.0/24 -j ACCEPT&amp;lt;br /&amp;gt; iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT &amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
* Pour accepter les résolutions de nom (ie: le &#039;&#039;&#039;dns&#039;&#039;&#039;) : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; iptables -A INPUT -i ppp0 --protocol udp --source-port 53 -j ACCEPT&amp;lt;br /&amp;gt; iptables -A OUTPUT -o ppp0 --protocol udp --destination-port 53 -j ACCEPT&amp;lt;br /&amp;gt; iptables -A INPUT -i ppp0 --protocol tcp --source-port 53 -j ACCEPT&amp;lt;br /&amp;gt; iptables -A OUTPUT -o ppp0 --protocol tcp --destination-port 53 -j ACCEPT &amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
* Pour accepter le traffic &#039;&#039;&#039;web&#039;&#039;&#039; (on veut surfer!) : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; iptables -A INPUT -i ppp0 --protocol tcp --source-port 80 -m state --state ESTABLISHED -j LOG_ACCEPT&amp;lt;br /&amp;gt; iptables -A OUTPUT -o ppp0 --protocol tcp --destination-port 80 -m state --state NEW,ESTABLISHED -j LOG_ACCEPT&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; La première ligne pour accepter ce qui entre sur notre interface ppp0 sur le port 80 (le port http) si c&#039;est une connexion déjà établie, la seconde pour accepter ce qui sort sur ppp0 sur le port 80 si c&#039;est une nouvelle connexion ou si c&#039;est une connexion déjà établie. &lt;br /&gt;
Pour autoriser le &#039;&#039;&#039;ssh&#039;&#039;&#039;, il faut préciser le port 22; pour autoriser l&#039;&#039;&#039;&#039;irc&#039;&#039;&#039;, le port 6667 (ou celui que vous utilisez pour vous connecter à votre serveur); pour le &#039;&#039;&#039;smtp&#039;&#039;&#039; (envoi d&#039;emails), le port 25; pour le &#039;&#039;&#039;pop3&#039;&#039;&#039; (réception d&#039;emails), le port 110; pour le &#039;&#039;&#039;imap&#039;&#039;&#039; (réception d&#039;emails), les ports 143 et 220 (&#039;&#039;&#039;imap3&#039;&#039;&#039;) ; pour le &#039;&#039;&#039;cvs&#039;&#039;&#039;, le port 2401 ; pour le &#039;&#039;&#039;https&#039;&#039;&#039;, le port 443. De manière générale, le numéros de port se trouvent dans /etc/services.&lt;br /&gt;
* Pour le &#039;&#039;&#039;ftp&#039;&#039;&#039; c&#039;est un peu plus complexe. D&#039;abord, il faut charger le module : &amp;lt;tt&amp;gt;ip_conntrack_ftp&amp;lt;/tt&amp;gt; (c&#039;est lui qui suit - track en anglais - les connexions ftp) et, si vous &#039;&#039;nat&#039;&#039;ez (en utilisant le masquerading par exemple) vos connexions ftp vers d&#039;autres postes le module : &amp;lt;tt&amp;gt;ip_nat_ftp&amp;lt;/tt&amp;gt; : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; modprobe ip_conntrack_ftp&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt; # éventuellement : &amp;lt;tt&amp;gt; modprobe ip_nat_ftp&amp;lt;/tt&amp;gt; &amp;lt;/blockquote&amp;gt; Ensuite, il faut taper les commandes suivantes : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; iptables -A INPUT -i ppp0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT&amp;lt;br /&amp;gt; iptables -A OUTPUT -o ppp0 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT &amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; Cela pour que la connexion puisse s&#039;établir. Ensuite (et c&#039;est la qu&#039;on a besoin de &amp;lt;tt&amp;gt;ip_conntrack_ftp&amp;lt;/tt&amp;gt;) : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; iptables -A INPUT -i ppp0 -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT&amp;lt;br /&amp;gt; iptables -A OUTPUT -o ppp0 -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT &amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; Pour que serveur puisse établir la connexion pour les données (en mode actif). Et enfin : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; iptables -A INPUT -i ppp0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT&amp;lt;br /&amp;gt; iptables -A OUTPUT -o ppp0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT &amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; Pour que le serveur puisse établir la connexion pour les données (en mode passif). Ici aussi &amp;lt;tt&amp;gt;ip_conntrack_ftp&amp;lt;/tt&amp;gt; est nécessaire. &lt;br /&gt;
* Pour &#039;&#039;&#039;partager une connexion&#039;&#039;&#039;, il faut que le forwarding soit activé dans le noyau (&amp;lt;tt&amp;gt;echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&amp;lt;/tt&amp;gt;), puis il faut autoriser iptable à faire le forwarding : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; iptables -F FORWARD&amp;lt;br /&amp;gt; iptables -A FORWARD -j ACCEPT &amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; et enfin, cacher les machines forward-ées par le firewall : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE &amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; Sur chaque machine devant être cachée par le firewall (ou devant partager la connexion avec la machine qui est connectée à internet), il faut ajouter une route par defaut : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; route add default gw 192.168.1.1 &amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; Si la machine connectée à internet a comme ip : 192.168.1.1. Il suffit avec une redhat/mandrake d&#039;éditer : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;/etc/sysconfig/network&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; et d&#039;ajouter dedans : &amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;GATEWAY=192.168.1.1&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; puis de redémarer le réseau :&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;/etc/rc.d/init.d/network restart&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== 3/ Application par l&#039;exemple ==&lt;br /&gt;
&lt;br /&gt;
Nous allons mettre en place un firewall / proxy.&lt;br /&gt;
&lt;br /&gt;
Pour cet exemple, le firewall aura la connexion à Internet (interface eth2) et disposera de 2 pattes sur des réseaux privés (eth0 et eth1) :&lt;br /&gt;
&lt;br /&gt;
* il fait office de proxy sur le port 3128 pour un réseau qui aura ainsi un accès internet&lt;br /&gt;
* et une DMZ&amp;lt;sup&amp;gt;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&amp;lt;/sup&amp;gt; (&amp;quot;zone démilitarisée&amp;quot;) sur laquelle il y a un ensemble de serveurs disponibles de l&#039;extérieur dont un serveur web qui a pour adresse 192.168.1.2 écoutant sur le port 80 en TCP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;   ____              &#039;&#039;&#039;&amp;lt;font color=&amp;quot;#009900&amp;quot;&amp;gt;eth1&amp;lt;/font&amp;gt;&#039;&#039;&#039; &#039;&#039;&#039;.-&amp;gt;&#039;&#039;&#039; ---+------+------+---&amp;lt;br /&amp;gt;  _/    \_       ____ &amp;lt;font color=&amp;quot;#009900&amp;quot;&amp;gt;3128&amp;lt;/font&amp;gt;&#039;&#039;&#039;/&#039;&#039;&#039;     [PC1]  [PC2]  [PC3] &amp;lt;br /&amp;gt; (        ) &#039;&#039;&#039;&amp;lt;font color=&amp;quot;#990000&amp;quot;&amp;gt;eth2&amp;lt;/font&amp;gt;&#039;&#039;&#039;|    |&#039;&#039;&#039;&amp;lt;--&#039;&#039;&#039;&#039;   &amp;lt;u&amp;gt;réseau local&amp;lt;/u&amp;gt; 198.168.2.0&amp;lt;br /&amp;gt; (INTERNET)&#039;&#039;&#039;&amp;lt;---&amp;gt;&#039;&#039;&#039;|&#039;&#039;&#039;Fire&#039;&#039;&#039;|&amp;lt;br /&amp;gt; (_      _) &amp;lt;font color=&amp;quot;#990000&amp;quot;&amp;gt;ppp0&amp;lt;/font&amp;gt;|&#039;&#039;&#039;wall&#039;&#039;&#039;|&amp;lt;br /&amp;gt;   \____/       |____|&#039;&#039;&#039;&amp;lt;--.&#039;&#039;&#039;   &amp;lt;u&amp;gt;DMZ serveurs&amp;lt;/u&amp;gt; 198.168.1.0&amp;lt;br /&amp;gt;                      &#039;&#039;&#039;&amp;lt;font color=&amp;quot;#3333FF&amp;quot;&amp;gt;eth0&amp;lt;/font&amp;gt;\&#039;&#039;&#039;     [WEB]  [NEWS] [FTP]&amp;lt;br /&amp;gt;                           &#039;&#039;&#039;&#039;-&amp;gt;&#039;&#039;&#039; ---+------+------+---&amp;lt;br /&amp;gt;&#039;&#039;ASCIIArt (c) Jice&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La classe d&#039;adresse IP 192.168.2.0 correspond au réseau interne sur l&#039;interface &amp;lt;tt&amp;gt;eth1&amp;lt;/tt&amp;gt;. &amp;lt;br /&amp;gt;La classe d&#039;adresse IP 192.168.1.0 correspond a la DMZ sur l&#039;interface &amp;lt;tt&amp;gt;eth0&amp;lt;/tt&amp;gt;. &amp;lt;br /&amp;gt;L&#039;interface de la connexion Internet est ppp0 sur l&#039;interface &amp;lt;tt&amp;gt;eth2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;sup&amp;gt;&amp;lt;nowiki&amp;gt;* &amp;lt;/nowiki&amp;gt;&amp;lt;/sup&amp;gt;&amp;lt;u&amp;gt;DMZ, ou zone démilitarisée&amp;lt;/u&amp;gt;&lt;br /&gt;
: Sous-réseau dans lequel des serveurs accessibles depuis internet sont en adressage privé (classe d&#039;adresse IP réservée comme 192.168.x.x) derrière un firewall.&lt;br /&gt;
&lt;br /&gt;
=== 3.1/ Le script init.d ===&lt;br /&gt;
&lt;br /&gt;
Nous allons écrire un script qui permettra de charger automatiquement au démarrage de la machine ou sur demande les règles du firewall qui seront stockées dans le fichier &amp;lt;tt&amp;gt;/etc/firewall.sh&amp;lt;/tt&amp;gt;. &amp;lt;br /&amp;gt;Le script de démarrage sera nommé &amp;lt;tt&amp;gt;/etc/init.d/firewall&amp;lt;/tt&amp;gt;. Bien sûr, on n&#039;oubliera pas d&#039;exécuter un &amp;lt;tt&amp;gt;chmod +x&amp;lt;/tt&amp;gt; sur les 2 scripts que nous allons créer au long de ce chapitre.&lt;br /&gt;
&lt;br /&gt;
Go ! &amp;lt;br /&amp;gt;Fichier de chargement &amp;lt;tt&amp;gt;/etc/init.d/firewall&amp;lt;/tt&amp;gt; : &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;90%&amp;quot; bgcolor=&amp;quot;#FFFFCC&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/bash&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Lancement du script de Firewall&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Arnaud de Bermingham&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;. /etc/init.d/functions&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;RETVAL=0&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Fonction pour le lancement du firewall&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;start() {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  echo -n &amp;quot;Application des règles IpTables: &amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  /etc/firewall.sh&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  RETVAL=0&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  [ $RETVAL -eq 0 ] &amp;amp;&amp;amp; touch /var/lock/subsys/firewall&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  echo&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Fonction pour arrêter le firewall (on flush)&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;stop() {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  echo -n &amp;quot;Flush des règles IpTables: &amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  /etc/flush_iptables.sh&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  RETVAL=0&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  [ $RETVAL -eq 0 ] &amp;amp;&amp;amp; rm -f /var/lock/subsys/firewall&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  echo&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;case $1 in&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  start)&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    start&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    ;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  stop)&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    stop&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    ;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  restart)&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    stop&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    start&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    ;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  status)&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    /sbin/iptables -L&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    /sbin/iptables -t nat -L&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    RETVAL=0&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    ;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  *)&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    echo &amp;quot;Usage: firewall {start|stop|restart|status}&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    RETVAL=1&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;esac&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C&#039;est tout simple non ?&lt;br /&gt;
&lt;br /&gt;
=== 3.2/ Le script pour flusher (vider) les règles ===&lt;br /&gt;
&lt;br /&gt;
Et maintenant : &amp;lt;tt&amp;gt;/etc/flush_iptables.sh&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;90%&amp;quot; bgcolor=&amp;quot;#FFFFCC&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# &amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Script pour vider les règles iptables&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Arnaud de Bermingham&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# duracell@apinc.org&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# On remet la police par défaut à ACCEPT&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -P INPUT ACCEPT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -P FORWARD ACCEPT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -P OUTPUT ACCEPT&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# On remet les polices par défaut pour la table NAT&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -t nat -P PREROUTING ACCEPT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -t nat -P POSTROUTING ACCEPT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -t nat -P OUTPUT ACCEPT&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# On vide (flush) toutes les règles existantes&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -F&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -t nat -F&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Et enfin, on efface toutes les chaînes qui ne&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# sont pas à defaut dans la table filter et nat&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -X&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -t nat -X&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Message de fin&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo &amp;quot; [termine]&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bon, on va enfin commencer les choses sérieuses : le script du firewall :)&lt;br /&gt;
&lt;br /&gt;
=== 3.3/ Les prérequis pour le script du firewall et création des tables pour les logs ===&lt;br /&gt;
&lt;br /&gt;
Le script sera commenté au fur et à mesure, afin de décrire chaque étape. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;90%&amp;quot; bgcolor=&amp;quot;#FFFFCC&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# script &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;/etc/firewall.sh&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Firewall d&#039;exemple a but pédagogique&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Arnaud de Bermingham&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# duracell@apinc.org&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Activation du forwarding&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font size=&amp;quot;-1&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# C&#039;est pas pour faire joli, on aura des règles&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font size=&amp;quot;-1&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# de forward et il faut bien que les paquets&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;font size=&amp;quot;-1&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;# traversent la machine, donc on met ce fichier à 1&amp;lt;/nowiki&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Alors la, on va appliquer quelques astuces&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# pour empêcher les attaques de type &amp;lt;/nowiki&amp;gt;&#039;&#039;spoofing&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# et bloquer les réponses ICMP du firewall,&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# comme ça c&#039;est très propre. Attention, le&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# fait de bloquer le trafic ICMP sur&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# le firewall bloque les pings.&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Je veux &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;pas de spoofing&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;then&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  for filtre in /proc/sys/net/ipv4/conf/*/rp_filter&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  do&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    echo 1 &amp;gt; $filtre&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  done&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;fi&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;pas de icmp&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;echo 1 &amp;gt; /proc/sys/net/ipv4/icmp_echo_ignore_all&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo 1 &amp;gt; /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# On va utiliser iptables. Si on l&#039;a compilé en module&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# dans le kernel, il faut &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;charger le module ip_tables&#039;&#039;&#039;.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;modprobe ip_tables&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# on va charger quelques &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;modules supplémentaires&#039;&#039;&#039; pour&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# gérer la &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;translation&#039;&#039;&#039; d&#039;adresse, l&#039;&#039;&#039;&#039;IRC&#039;&#039;&#039; et le &#039;&#039;&#039;FTP&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Tu me fait 4 pompes. Chef oui chef !&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;modprobe ip_nat_ftp&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;modprobe ip_nat_irc&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;modprobe iptable_filter&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;modprobe iptable_nat&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Pour faire bien, on va &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;vider toutes les règles&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# avant d&#039;appliquer les nouvelles règles de firewall&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -F&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -X&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# On va rajouter 2 nouvelles &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;chaînes&#039;&#039;&#039;.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Ceci permettra d&#039;ajouter des nouvelles cibles qui&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# auront la possibilité de loguer ce qui se passe.&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# La on logue et on refuse le paquet,&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# on rajoute un préfixe pour pouvoir&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# s&#039;y retrouver dans les logs&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -N LOG_DROP&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -A LOG_DROP -j LOG \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  --log-prefix &#039;[IPTABLES DROP] : &#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -A LOG_DROP -j DROP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# ici, on logue et on accepte le paquet,&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# on rajoute un préfixe pour pouvoir&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# s&#039;y retrouver dans les logs&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -N LOG_ACCEPT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -A LOG_ACCEPT -j LOG \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  --log-prefix &#039;[IPTABLES ACCEPT] : &#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -A LOG_ACCEPT -j ACCEPT&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# On veut faire un firewall efficace,&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# donc la politique a appliquer est de tout&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# refuser par défaut et rajouter une a une&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# les règles que l&#039;on autorise.&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Bien sur, on a RTFM un peu et on a vu que&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# l&#039;option -P permet de définir&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;la cible par défaut&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -P INPUT DROP&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -P OUTPUT DROP&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -P FORWARD DROP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Pour éviter les problèmes, on va &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;tout accepter sur&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;la machine en local&#039;&#039;&#039; (interface lo).&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Je déconseille de retirer cette règle car&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# ça pose pas mal de problèmes et ça peut&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# faire perdre la main sur la machine&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -A INPUT  -i lo -j ACCEPT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -A OUTPUT -o lo -j ACCEPT&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Bon, la partie initialisation et préparation est&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# terminée, passons aux choses sérieuses&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Comme on l&#039;a dit dans la présentation de&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# l&#039;architecture réseau, le firewall fait&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# également office de proxy grâce par exemple&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# à un squid installé dessus. On va donc&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# accepter que le &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;proxy&#039;&#039;&#039; ait une &#039;&#039;&#039;connexion&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;internet directe&#039;&#039;&#039;. Tant qu&#039;à faire, on va&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# mettre des états pour que ça soit bien sécurisé&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -A OUTPUT -o ppp0 -m state \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  --state NEW,ESTABLISHED -p tcp --dport 80 -j ACCEPT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -A INPUT  -i ppp0 -m state \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  --state ESTABLISHED     -p tcp --sport 80 -j ACCEPT&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Maintenant, on va faire en sorte que le&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;proxy soit totalement transparent pour le LAN&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# bénéficiant de la connexion internet.&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# L&#039;astuce consiste a rediriger toutes les&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# requêtes ayant un port de destination 80&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# vers le port 3128 du proxy, ici c&#039;est le&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# firewall (qui est sur le firewall et qui&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# a l&#039;adresse IP 192.168.2.1 ).&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Une règle de NAT suffira largement pour faire ça.&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -t nat -A PREROUTING -i eth1 -p tcp \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  --dport 80 -j DNAT --to-destination 192.168.2.1:3128&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Bon, c&#039;est pas trop compliqué ! Maintenant&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# on sait que l&#039;on a un &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;serveur web sur la DMZ&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# (la machine d&#039;adresse IP 192.168.1.2) sur&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# le port 80. On souhaite que toutes les requêtes&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# provenant d&#039;internet arrivant sur l&#039;adresse IP&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# publique du serveur ( ici 42.42.42.42 ) soit&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# redirigées sur le serveur web de la DMZ.&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Rien de bien compliqué. Dans l&#039;exemple,&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# on peut retirer le :80 de la target&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# --to-destination&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -t nat -A PREROUTING -d 42.42.42.42 \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:80&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# C&#039;est bien tout ça ! mais le problème c&#039;est&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# que les chaînes de la table FILTER sont toutes&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# à DENY, donc tout ceci ne fait rien du tout.&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# On va donc passer a la &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;configuration du&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;firewall&#039;&#039;&#039; proprement dit.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# On va quand même &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;accepter les connexions ssh&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# (port 22) provenant d&#039;une machine (la votre en&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# l&#039;occurrence, on va dire 192.168.2.42) vers le&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# firewall pour pouvoir modifier les règles&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# facilement pour bien surveiller, on vas quand&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# même loguer les connexions provenant de mon IP&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# et à destination du ssh du firewall&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -A INPUT -i eth1 -s 192.168.2.42 -m state \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  --state NEW,ESTABLISHED -p tcp --dport 22 -j LOG_ACCEPT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -A OUTPUT -o eth1 -d 192.168.2.42 -m state \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  --state ESTABLISHED     -p tcp --sport 22 -j LOG_ACCEPT&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# On veut que le &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LAN&#039;&#039;&#039; connecté à l&#039;interface&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# eth1 ait un accès complet à &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;internet&#039;&#039;&#039;.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# La règle de NAT qui permettait d&#039;avoir&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# un &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;proxy transparent&#039;&#039;&#039; sera automatiquement&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# appliqué. L&#039;interface correspondant&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# à la connexion internet est ici ppp0&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -A FORWARD -i eth1 -o ppp0 -j ACCEPT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -A FORWARD -o eth1 -i ppp0 -j ACCEPT&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Maintenant on donne le droit au &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LAN&#039;&#039;&#039; de&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;consulter les pages web du serveur de la DMZ&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -A FORWARD -i eth1 -o eth0 -p tcp \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -A FORWARD -i eth0 -o eth1 -p tcp \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  --sport 80 -m state --state ESTABLISHED -j ACCEPT&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Maintenant il n&#039;y a plus qu&#039;à dire au firewall&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# d&#039;autoriser à transmettre des paquets TCP à&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# destination du port 80 provenant de l&#039;adresse&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# IP publique (i.e. d&#039;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;internet&#039;&#039;&#039;) &#039;&#039;&#039;vers le serveur&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# &amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;web de la DMZ&#039;&#039;&#039; que nous avons naté précédemment.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -A FORWARD -i ppp0 -o eth0 -p tcp \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  --destination-port 80 -m state --state NEW,ESTABLISHED -j ACCEPT&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -A FORWARD -o ppp0 -i eth0 -p tcp \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  --source-port 80      -m state --state ESTABLISHED     -j ACCEPT&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Maintenant il ne reste plus grand chose à faire !&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Il faut permettre à l&#039;ensemble du LAN de dialoguer&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# sur internet avec la même adresse IP sinon, bien&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# évidemment ça ne marchera pas (à moins que vous&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# ayez 30 adresses ip !).&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Une petite règle de NAT avec un -j MASQUERADE&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# suffira (masquerade = dialoguer avec l&#039;adresse&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# IP publique sur firewall)&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -t nat -A POSTROUTING \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  -s 192.168.2.0/24 -j MASQUERADE&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Il faut également que le serveur web de la DMZ&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# soit masqueradé sinon, le serveur&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# dialoguera sur internet avec son IP privée&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -t nat -A POSTROUTING \&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  -s 192.168.1.0/24 -j MASQUERADE&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Toutes les règles qui n&#039;ont pas passé les&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# règles du firewall seront refusées et loguées...&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# facile :&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;iptables -A FORWARD -j LOG_DROP&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -A INPUT -j LOG_DROP&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;iptables -A OUTPUT -j LOG_DROP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Pour faire zoli&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo &amp;quot; [Termine]&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# c&#039;est enfin fini&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voilà ! le firewall de compèt&#039; est prêt et fonctionnel.&lt;br /&gt;
&lt;br /&gt;
Ceci était bien évidemment un exemple, vous pouvez dès à présent préparer votre propre firewall personnalisé ! &amp;lt;br /&amp;gt;Vous pouvez l&#039;adapter à vos besoins, votre connexion vers internet (par ADSL par exemple), etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;merci&amp;quot;&amp;gt;Cette page est issue de la documentation &#039;pré-wiki&#039; de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Arnaud de Bermingham le 12/11/2001.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Copyright =&lt;br /&gt;
Copyright &amp;amp;copy; 12/11/2001, Arnaud de Bermingham&lt;br /&gt;
{{CC-BY-NC-SA}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Autres ressources=&lt;br /&gt;
Le [http://lea-linux.org/trucs/index.php3?aff_item=272 partage de connexion] facile.&lt;br /&gt;
&lt;br /&gt;
Tester votre firewall [http://grc.com/default.htm là].&lt;br /&gt;
&lt;br /&gt;
Cliquez sur &#039;ShieldsUP!&#039;, puis sur l&#039;un des boutons : &#039;Test My Shields !&amp;quot; et &amp;quot;Probe My Ports !&amp;quot;. Ça vaut pas un bon &amp;lt;tt&amp;gt;nmap&amp;lt;/tt&amp;gt; fait par un ami, mais ça permet de voir ou on en est.&lt;/div&gt;</summary>
		<author><name>Pterjan</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=L%C3%A9aLinux:Accueil&amp;diff=8689</id>
		<title>LéaLinux:Accueil</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=L%C3%A9aLinux:Accueil&amp;diff=8689"/>
		<updated>2005-10-14T12:53:36Z</updated>

		<summary type="html">&lt;p&gt;Pterjan : /* Utilisateurs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= Bienvenue sur Léa =&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
== Léa passe au Wiki ==&lt;br /&gt;
Les contributeurs de Léa sont très nombreux, mais contribuer à Léa a toujours été problématique. L&#039;histoire de Léa est longue et lourde. Je veux dire par là que pendant très longtemps les évolutions de Léa ont été suspendues aux bonnes volontés du tout petit groupe d&#039;administrateurs. &lt;br /&gt;
&lt;br /&gt;
Il fallait que ça change. Tout d&#039;abord les administrateurs se trouvent crouler (pleurez avec nous) sous la charge de travail. Ensuite les contributeurs ont l&#039;impression que nous n&#039;apprécions pas leur travail puisque nous ne le mettons pas en ligne. Enfin, rien n&#039;était &#039;&#039;user friendly&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
C&#039;est pourquoi Léa a décidé de changer presque complètement : elle passe au Wiki. C&#039;est à dire que tout le monde peut proposer des modifications pour toutes les pages. Seulement, pour que ces modifications restent un minimum vérifiées, à la différence d&#039;un wiki classique, celui de Léa sera modéré a priori. C&#039;est à dire que les modifications n&#039;apparaîtront de suite, elles devront être validées par les modérateurs.&lt;br /&gt;
&lt;br /&gt;
Pour éviter un minimum les robots et autres spammeurs en puissance, nous avons aussi décidé qu&#039;il faudrait être enregistré pour pouvoir éditer une page. Ceci dit, la création d&#039;un compte sera simple, et ne nécessitera pas notre approbation.&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
== Utilisateurs ==&lt;br /&gt;
&lt;br /&gt;
Léa aura aussi besoin de 2 nouvelles catégories d&#039;utilisateurs : les &#039;&#039;&#039;éditeurs&#039;&#039;&#039; et les &#039;&#039;&#039;modérateurs&#039;&#039;&#039;, les premiers seront des utilisateurs pouvant voir et modifier l&#039;intégralité du wiki de Léa et en modifier les pages (enfin pour les modifications, certaines parties du site resteront en accès administrateur uniquement). Les seconds auront les mêmes droits, plus celui de valider les modifications d&#039;une page pour affichage sur la partie publique du site.&lt;br /&gt;
&lt;br /&gt;
Les adhérents de l&#039;association Léa pourront demander un droit d&#039;accès éditeurs. Les modérateurs seront recrutés parmi l&#039;ensemble des utilisateurs habituels de Léa par les administrateurs du site.&lt;br /&gt;
&lt;br /&gt;
Il est prévu d&#039;unifier les identifications au forum et mediawiki par l&#039;intermédiaire d&#039;un &#039;&#039;plugin&#039;&#039; d&#039;authentification à mediawiki. Pour l&#039;instant ce &#039;&#039;plugin&#039;&#039; est à l&#039;étude.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Choix du Wiki ==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi comme  wiki pour Léa : [http://mediawiki.org mediawiki], il est bien maintenu et dispose d&#039;une grande base d&#039;utilisateurs.  Comme mediawiki ne permet pas la modération à priori des articles nous avons donc du développer une interface de modération ainsi qu&#039;un cache statique (ie: une page du wiki ne générera en général qu&#039;un seul appel à PHP, elle sera ensuite sauvée sous son nom dans l&#039;arborescence  de Léa évitant à la demande suivante un appel à php, et donc limitera la charge du serveur). De plus nous avons installé TurckMMCache sur le serveur de Léa puisque mediawiki sait le gérer. &lt;br /&gt;
&lt;br /&gt;
PS: Il semblerait que TurckMMCache occasionne des plantages d&#039;apache. Nous ne savons donc pas encore s&#039;il va rester en place.&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Transition ==&lt;br /&gt;
Il a fallu transformer la plupart des pages de Léa au format Wiki, cette transformation n&#039;a pas été faite à la main ! Nous ne sommes pas des bêtes de somme ! Le revers de la médaille c&#039;est que certaines pages ont été mal converties. Nous allons donc faire appel à vous et au fait que Léa est maintenant un wiki pour régler ce problème. Pas la peine de nous consulter : &#039;&#039;&#039;éditez vous même !&#039;&#039;&#039; Vous verrez c&#039;est facile. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;P.S. :&#039;&#039;&#039; normalement, toutes les anciennes pages de Léa restent accessibles, soit qu&#039;elles aient été traduites en wiki, soit que les répertoires en question restent inchangés. Si une page a disparu :  [[LéaLinux:BugReport|faites un rapport de bug]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ceci dit, il y a aussi des bugs ! Vous serez gentils de bien vouloir les signaler sur cette page : [[LéaLinux:BugReport]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;newbox&amp;gt;Un premier travail collectif&amp;lt;/newbox&amp;gt;&lt;br /&gt;
Comme premier travail collectif, nous vous demandons de concevoir le contenu de la page d&#039;accueil. Pour cela nous n&#039;allons pas travailler sur cette page ci, mais sur la page : [[LéaLinux:Accueil]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;newbox&amp;gt;Les nouvelles du libres (en direct des flux RSS)&amp;lt;/newbox&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot;  |&amp;lt;rss&amp;gt;http://www.agendadulibre.org/rss.php?region=all|short|max=5&amp;lt;/rss&amp;gt;&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot;  |&amp;lt;rss&amp;gt;http://linuxfr.org/backend/news/rss20.rss|short|max=5&amp;lt;/rss&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;newbox&amp;gt;Les pages d&#039;introduction à Linux&amp;lt;/newbox&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
! width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot; | Les pages suivantes constituent le point d&#039;entrée obligatoire à Léa.&lt;br /&gt;
! width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot; | Les pages suivantes sont des fiches spéciales débutant&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;DPL&amp;gt;category=Introduction à Linux&amp;lt;/DPL&amp;gt;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&amp;lt;DPL&amp;gt;category=Fiches pratiques&amp;lt;/DPL&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{DP}}&lt;/div&gt;</summary>
		<author><name>Pterjan</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=L%C3%A9aLinux:Accueil&amp;diff=8688</id>
		<title>LéaLinux:Accueil</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=L%C3%A9aLinux:Accueil&amp;diff=8688"/>
		<updated>2005-10-14T12:41:29Z</updated>

		<summary type="html">&lt;p&gt;Pterjan : /* Utilisateurs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= Bienvenue sur Léa =&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
== Léa passe au Wiki ==&lt;br /&gt;
Les contributeurs de Léa sont très nombreux, mais contribuer à Léa a toujours été problématique. L&#039;histoire de Léa est longue et lourde. Je veux dire par là que pendant très longtemps les évolutions de Léa ont été suspendues aux bonnes volontés du tout petit groupe d&#039;administrateurs. &lt;br /&gt;
&lt;br /&gt;
Il fallait que ça change. Tout d&#039;abord les administrateurs se trouvent crouler (pleurez avec nous) sous la charge de travail. Ensuite les contributeurs ont l&#039;impression que nous n&#039;apprécions pas leur travail puisque nous ne le mettons pas en ligne. Enfin, rien n&#039;était &#039;&#039;user friendly&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
C&#039;est pourquoi Léa a décidé de changer presque complètement : elle passe au Wiki. C&#039;est à dire que tout le monde peut proposer des modifications pour toutes les pages. Seulement, pour que ces modifications restent un minimum vérifiées, à la différence d&#039;un wiki classique, celui de Léa sera modéré a priori. C&#039;est à dire que les modifications n&#039;apparaîtront de suite, elles devront être validées par les modérateurs.&lt;br /&gt;
&lt;br /&gt;
Pour éviter un minimum les robots et autres spammeurs en puissance, nous avons aussi décidé qu&#039;il faudrait être enregistré pour pouvoir éditer une page. Ceci dit, la création d&#039;un compte sera simple, et ne nécessitera pas notre approbation.&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
== Utilisateurs ==&lt;br /&gt;
&lt;br /&gt;
Léa aura aussi besoin de 2 nouvelles catégories d&#039;utilisateurs : les &#039;&#039;&#039;éditeurs&#039;&#039;&#039; et les &#039;&#039;&#039;modérateurs&#039;&#039;&#039;, les premiers seront des utilisateurs pouvant voir et modifier l&#039;intégralité du wiki de Léa et en modifier les pages (enfin pour les modifications, certaines parties du site resteront en accès administrateur uniquement). Les seconds auront les mêmes droits, plus celui de valider les modifications d&#039;une page pour affichage sur la partie publique du site.&lt;br /&gt;
&lt;br /&gt;
Les adhérents de l&#039;association Léa pourront demander un droit d&#039;accès éditeurs. Les modérateurs seront recrutés parmi l&#039;ensemble des utilisateurs habituels de Léa par les administrateurs du site.&lt;br /&gt;
&lt;br /&gt;
Il est prévu d&#039;unifier les identifications à phorum et mediawiki par l&#039;intermédiaire d&#039;un &#039;&#039;plugin&#039;&#039; d&#039;authentification à mediawiki. Pour l&#039;instant ce &#039;&#039;plugin&#039;&#039; est à l&#039;étude.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Choix du Wiki ==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi comme  wiki pour Léa : [http://mediawiki.org mediawiki], il est bien maintenu et dispose d&#039;une grande base d&#039;utilisateurs.  Comme mediawiki ne permet pas la modération à priori des articles nous avons donc du développer une interface de modération ainsi qu&#039;un cache statique (ie: une page du wiki ne générera en général qu&#039;un seul appel à PHP, elle sera ensuite sauvée sous son nom dans l&#039;arborescence  de Léa évitant à la demande suivante un appel à php, et donc limitera la charge du serveur). De plus nous avons installé TurckMMCache sur le serveur de Léa puisque mediawiki sait le gérer. &lt;br /&gt;
&lt;br /&gt;
PS: Il semblerait que TurckMMCache occasionne des plantages d&#039;apache. Nous ne savons donc pas encore s&#039;il va rester en place.&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Transition ==&lt;br /&gt;
Il a fallu transformer la plupart des pages de Léa au format Wiki, cette transformation n&#039;a pas été faite à la main ! Nous ne sommes pas des bêtes de somme ! Le revers de la médaille c&#039;est que certaines pages ont été mal converties. Nous allons donc faire appel à vous et au fait que Léa est maintenant un wiki pour régler ce problème. Pas la peine de nous consulter : &#039;&#039;&#039;éditez vous même !&#039;&#039;&#039; Vous verrez c&#039;est facile. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;P.S. :&#039;&#039;&#039; normalement, toutes les anciennes pages de Léa restent accessibles, soit qu&#039;elles aient été traduites en wiki, soit que les répertoires en question restent inchangés. Si une page a disparu :  [[LéaLinux:BugReport|faites un rapport de bug]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ceci dit, il y a aussi des bugs ! Vous serez gentils de bien vouloir les signaler sur cette page : [[LéaLinux:BugReport]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;newbox&amp;gt;Un premier travail collectif&amp;lt;/newbox&amp;gt;&lt;br /&gt;
Comme premier travail collectif, nous vous demandons de concevoir le contenu de la page d&#039;accueil. Pour cela nous n&#039;allons pas travailler sur cette page ci, mais sur la page : [[LéaLinux:Accueil]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;newbox&amp;gt;Les nouvelles du libres (en direct des flux RSS)&amp;lt;/newbox&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot;  |&amp;lt;rss&amp;gt;http://www.agendadulibre.org/rss.php?region=all|short|max=5&amp;lt;/rss&amp;gt;&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot;  |&amp;lt;rss&amp;gt;http://linuxfr.org/backend/news/rss20.rss|short|max=5&amp;lt;/rss&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;newbox&amp;gt;Les pages d&#039;introduction à Linux&amp;lt;/newbox&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
! width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot; | Les pages suivantes constituent le point d&#039;entrée obligatoire à Léa.&lt;br /&gt;
! width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot; | Les pages suivantes sont des fiches spéciales débutant&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;lt;DPL&amp;gt;category=Introduction à Linux&amp;lt;/DPL&amp;gt;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&amp;lt;DPL&amp;gt;category=Fiches pratiques&amp;lt;/DPL&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{DP}}&lt;/div&gt;</summary>
		<author><name>Pterjan</name></author>
	</entry>
</feed>