<?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=Ennael</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=Ennael"/>
	<link rel="alternate" type="text/html" href="https://lea-linux.org/documentations/Sp%C3%A9cial:Contributions/Ennael"/>
	<updated>2026-04-06T04:53:49Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Accueil&amp;diff=14182</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Accueil&amp;diff=14182"/>
		<updated>2007-01-07T17:37:43Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Léa à Linux Solution 2007 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Bonne année 2007 ! ===&lt;br /&gt;
&lt;br /&gt;
Léa souhaite une bonne année 2007 à toutes et à tous. &lt;br /&gt;
&lt;br /&gt;
Nous souhaitons que cette année 2007 marque la fin des brevets logiciels, que l&#039;EUCD soit révoqué, que l&#039;utilisation des DRM soit déclaré illégale, que les constructeurs de matériel décident de livrer les spécifications de leurs matériels, que les développeur de jeux décident d&#039;utiliser OpenAL et portent leurs jeux sous Linux ... &#039;&#039;C&#039;est beau de rêver&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;imglink&amp;gt;http://eucd.info![[Image:Copier_différent_de_pirater.png|http://eucd.info]]&amp;lt;/imglink&amp;gt;&lt;br /&gt;
&amp;lt;cadre&amp;gt;Ça y est ! C&#039;est fait ! La loi sur le &#039;&#039;&#039;Droit d&#039;Auteur et les Droits Voisins dans la Société de l&#039;Information&#039;&#039;&#039; est votée. Nos droits à l&#039;interopérabilité se retrouvent donc bridés. Nous risquons maintenant des amendes à utiliser le Peer To Peer (comment détermineront-ils si nous en faisons une utilisation légale ou pas ?). Merci à nos parlementaires d&#039;avoir si bien su défendre l&#039;intérêt général.&amp;lt;/cadre&amp;gt;&lt;br /&gt;
= Bienvenue sur Léa =&lt;br /&gt;
&lt;br /&gt;
=== Léa à Linux Solution 2007 ===&lt;br /&gt;
[[Image:sl2007.jpg]]&lt;br /&gt;
&lt;br /&gt;
Comme les années précédentes, Léa sera présente à [http://www.solutionslinux.fr/fr/exposer_associations.php Solution Linux 2007]. N&#039;hésitez pas à passer nous voir ! Si vous souhaitez participer à la vie du stand, envoyez un mail à admin at lea-linux.org.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez plus d&#039;informations [http://www.assoces-libres.org ici]&lt;br /&gt;
&lt;br /&gt;
{{Lea_Linux:Les_nouvelles}}&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Léa est un Wiki ! ==&lt;br /&gt;
Autrefois, contribuer à Léa était assez compliqué (ce qui n&#039;a pas empêché de nombreux auteurs de nous soumettre leurs articles).&lt;br /&gt;
&lt;br /&gt;
Aujourd&#039;hui, nous avons adopté la technologie de Wikipédia, &lt;br /&gt;
&lt;br /&gt;
Tout le monde peut donc créer et modifier 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 : les modifications 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;
&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 a 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;
&amp;lt;newbox&amp;gt;Les nouvelles du libre (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;
&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;
{{DP}}&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Accueil&amp;diff=14181</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Accueil&amp;diff=14181"/>
		<updated>2007-01-07T17:37:10Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Léa à Linux Solution 2007 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Bonne année 2007 ! ===&lt;br /&gt;
&lt;br /&gt;
Léa souhaite une bonne année 2007 à toutes et à tous. &lt;br /&gt;
&lt;br /&gt;
Nous souhaitons que cette année 2007 marque la fin des brevets logiciels, que l&#039;EUCD soit révoqué, que l&#039;utilisation des DRM soit déclaré illégale, que les constructeurs de matériel décident de livrer les spécifications de leurs matériels, que les développeur de jeux décident d&#039;utiliser OpenAL et portent leurs jeux sous Linux ... &#039;&#039;C&#039;est beau de rêver&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;imglink&amp;gt;http://eucd.info![[Image:Copier_différent_de_pirater.png|http://eucd.info]]&amp;lt;/imglink&amp;gt;&lt;br /&gt;
&amp;lt;cadre&amp;gt;Ça y est ! C&#039;est fait ! La loi sur le &#039;&#039;&#039;Droit d&#039;Auteur et les Droits Voisins dans la Société de l&#039;Information&#039;&#039;&#039; est votée. Nos droits à l&#039;interopérabilité se retrouvent donc bridés. Nous risquons maintenant des amendes à utiliser le Peer To Peer (comment détermineront-ils si nous en faisons une utilisation légale ou pas ?). Merci à nos parlementaires d&#039;avoir si bien su défendre l&#039;intérêt général.&amp;lt;/cadre&amp;gt;&lt;br /&gt;
= Bienvenue sur Léa =&lt;br /&gt;
&lt;br /&gt;
=== Léa à Linux Solution 2007 ===&lt;br /&gt;
[[Image:sl2007.jpg]]&lt;br /&gt;
&lt;br /&gt;
Comme les années précédentes, Léa sera présente à [http://www.solutionslinux.fr/fr/exposer_associations.php Solution Linux 2007]. N&#039;hésitez pas à passer nous voir ! Si vous souhaitez participer à la vie du stand, envoyez un mail à admin at lea-linux.org.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez plus d&#039;informations [ http://www.assoces-libres.org ici]&lt;br /&gt;
&lt;br /&gt;
{{Lea_Linux:Les_nouvelles}}&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Léa est un Wiki ! ==&lt;br /&gt;
Autrefois, contribuer à Léa était assez compliqué (ce qui n&#039;a pas empêché de nombreux auteurs de nous soumettre leurs articles).&lt;br /&gt;
&lt;br /&gt;
Aujourd&#039;hui, nous avons adopté la technologie de Wikipédia, &lt;br /&gt;
&lt;br /&gt;
Tout le monde peut donc créer et modifier 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 : les modifications 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;
&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 a 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;
&amp;lt;newbox&amp;gt;Les nouvelles du libre (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;
&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;
{{DP}}&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Qemu&amp;diff=14099</id>
		<title>Qemu</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Qemu&amp;diff=14099"/>
		<updated>2006-12-17T22:55:31Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Emuler]]&lt;br /&gt;
= Installer et utiliser Qemu =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;leatitre&amp;quot;&amp;gt;Installer et utiliser Qemu&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par David Roux, avec la collaboration de Joël Tarlao et Alain Rivest, relu et complété par Erwan Velu&lt;br /&gt;
&lt;br /&gt;
Voici un petit guide pour utiliser Qemu facilement&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que Qemu? ==&lt;br /&gt;
&lt;br /&gt;
Dans le monde des émulateurs, Qemu a actuellement le vent en poupe, et nombreux sont ceux qui l&#039;ont adopté pour faire tourner les applications indisponibles pour leur système d&#039;exploitation. Dans notre cas, on appréciera de pouvoir utiliser des logiciels conçus pour Microsoft Windows ou Mac OS sous Linux, mais il sera également possible de faire l&#039;inverse. Son autre avantage est qu&#039;il peut émuler plusieurs architectures, du x86 au PowerPC en passant par le Sun-SPARC, ce qui permet de lancer une foule d&#039;OS différents. De plus, il est important de signaler que Qemu est disponible sous licence GNU LGPL. Pour en savoir plus, le mieux est d&#039;aller faire un tour [http://fabrice.bellard.free.fr/qemu/ ici]&amp;lt;nowiki&amp;gt;; quand à nous, rentrons dans le vif du sujet...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== L&#039;installation ==&lt;br /&gt;
&lt;br /&gt;
{{Preferer un paquetage|qemu}}&lt;br /&gt;
&lt;br /&gt;
Il est également préférable d&#039;utiliser la dernière version de QEMU, (0.7.2 au moment de la rédaction de ces lignes) qui doit être disponible en format deb pour testing et RPM pour Mandriva LE 2005-2006. On peut également la trouver la version 0.7.0 dans les branches &amp;quot;unstable&amp;quot; des distributions Linux (Sid, Cooker...). Quoiqu&#039;il en soit, l&#039;installation par cette méthode (urpmi, apt-get,...etc) ne devrait pas poser de problème.&lt;br /&gt;
&lt;br /&gt;
Cependant, pour les possesseurs de machines PC (architecture i386), ce serait passer à côté d&#039;un formidable accélérateur de performance : &#039;&#039;&#039;Kqemu&#039;&#039;&#039;, un module du noyau que Fabrice Bellard souhaite rentabiliser avant de le libérer. Il n&#039;est donc pas libre et vous ne le trouverez pas dans vos distributions. &#039;&#039;&#039;Selon les machines, le gain va de 200% à 600%&#039;&#039;&#039; !!!!! Mais il faut compiler à la main : &lt;br /&gt;
&lt;br /&gt;
La compilation passe par les traditionnels &amp;lt;code&amp;gt;./configure&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# make install&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Cependant, la version 0.7.2 ne peut se compiler qu&#039;avec gcc-3.xx alors que la plupart des distributions acutelles sont en GCC-4 (gcc est le compilateur). La coexistence des 2 gcc ne pose généralement pas de problèmes. Donc : &lt;br /&gt;
&lt;br /&gt;
Installer gcc-3.3&lt;br /&gt;
&lt;br /&gt;
extraire qemu. Extraire kqemu en étant dans le répertoire de qemu.&lt;br /&gt;
&lt;br /&gt;
préciser le compilateur utilisé : &amp;lt;code&amp;gt;./configure --cc=gcc-3.3.6&lt;br /&gt;
make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici, il peut y avoir un soucis, car votre noyau risque de ne pas être compilé avec ce GCC là... et donc le système refusera de mettre en mémoire le module Kqemu. Il faut donc compiler le module avec gcc 4 : &lt;br /&gt;
&amp;lt;code&amp;gt;cd kqemu&lt;br /&gt;
make clean  &lt;br /&gt;
make&amp;lt;/code&amp;gt;&lt;br /&gt;
ensuite vous pouvez installer le tout : &lt;br /&gt;
&amp;lt;code&amp;gt;make install&amp;lt;/code&amp;gt; (en root)&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite faire quelques manipulations pour créer un périphérique un peu particulier : &lt;br /&gt;
&amp;lt;code&amp;gt;modprobe kqemu&lt;br /&gt;
mknod /dev/kqemu c 250 0&lt;br /&gt;
chmod 666 /dev/kqemu&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci peut être placé dans un fichier pour être effectué au lancement du système : dans /etc/rc.local par exemple.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour les dépendances de Qemu 0.6.1, vous aurez besoin des paquets suivants: libc6 (&amp;gt;=2.3.2-ds1-4), libsdl (&amp;gt;=1.2), zlib1g (&amp;gt;=1.1.2.1), vgabios (&amp;gt;=0.4c), bochsbios (&amp;gt;=2.1.1). Les noms des paquets peuvent varier suivant les distributions.&lt;br /&gt;
&lt;br /&gt;
== Comment ça marche? ==&lt;br /&gt;
&lt;br /&gt;
=== Premiers pas avec un live-CD ===&lt;br /&gt;
&lt;br /&gt;
On va se faire la main avec un truc tout simple, l&#039;émulation d&#039;un système d&#039;exploitation en live-CD. Il ne sera pas nécessaire d&#039;écrire sur le disque dur ni même graver le fichier ISO que l&#039;on vient de télécharger sur un site internet. Dans la suite de cet article, ce fichier ISO s&#039;appelera &amp;quot;live.iso&amp;quot;. Pour démarrer cette image iso avec Qemu, Il suffit de se rendre dans le répertoire qui contient l&#039;image et lancer Qemu, en tapant:&lt;br /&gt;
&lt;br /&gt;
cd /home/toto/repertoire_ou_est_l&#039;image_iso&amp;lt;br /&amp;gt; qemu -cdrom live.iso&lt;br /&gt;
&lt;br /&gt;
Il n&#039;est pas nécessaire d&#039;être « root » pour exécuter QEMU, tout peut être fait par un simple utilisateur.&lt;br /&gt;
&lt;br /&gt;
Une fenêtre s&#039;ouvre et le système émulé se lance. Pour utiliser la souris de votre système virtuel, il suffit de cliquer dans la fenêtre d&#039;émulation. Pour libérer la souris de la fênetre d&#039;émulation, il suffit d&#039;appuyer sur les touches &#039;ctrl&#039; &amp;amp; &#039;alt&#039; en même temps. Pour le pavé numérique, Qemu le considèrera toujours comme inactif donc il faudra presser la touche &amp;quot;VerrNum&amp;quot;. Attention aux mots de passe car on peut se retrouver avec le clavier numérique vérouiller avec le voyant &amp;quot;numlock&amp;quot; éteint&#039;&#039;&#039; ! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on souhaite démarrer sur un vrai céderom, il suffit d&#039;utiliser la syntaxe &amp;lt;code&amp;gt;-cdrom /dev/cdrom&amp;lt;/code&amp;gt; . Qemu utilise directement le périphérique bloc, il ne faut donc pas monter le cédérom avant l&#039;éxecution de Qemu.&lt;br /&gt;
&lt;br /&gt;
Le système virtuel peut également accéder au réseau grâce à l&#039;option &amp;lt;code&amp;gt;-user-net&amp;lt;/code&amp;gt; : dans ce mode, Qemu utilisera vos interfaces réseaux pour accéder a votre réseau local ou a Internet par exemple. La carte son virtuelle, une carte-son SB16, peut être activée avec l&#039;option &amp;lt;code&amp;gt;-enable-audio&amp;lt;/code&amp;gt;. Compte-tenu que le système émulé est tout de même plus lent que lors d&#039;une utilisation normale, et que la charge sur le processeur de l&#039;hôte est importante, faites d&#039;abord un essai avec un live-CD &amp;quot;léger&amp;quot;, genre DamnSmall Linux et ce surtout si votre machine n&#039;est pas de la première jeunesse;&lt;br /&gt;
&lt;br /&gt;
Qemu offre par défaut au système émulé 128 Mo de mémoire vive, il faut donc au moins en avoir le double sur la machine hôte (plus, c&#039;est mieux). Pour info, j&#039;ai fait tous ces tests sur un Athlon XP1800+ avec 512 Mo de RAM, et mon processeur tournait à 100% tout le temps: n&#039;essayez pas sur un 486 ;-)&lt;br /&gt;
&lt;br /&gt;
=== Installation d&#039;un système &amp;quot;en dur&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Dans ce mode, Qemu est capable d&#039;utiliser un fichier de votre disque dur et de le transformer en un disque dur virtuel. Pour l&#039;exemple, on installera un Microsoft Windows 98, sur une image de disque dur de 2Go que l&#039;on appelle &amp;quot;hd.img&amp;quot; et située dans un répertoire /home/toto/invite/.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;mkdir /home/toto/invite/&amp;lt;br /&amp;gt; cd /home/toto/invite/&amp;lt;br /&amp;gt; qemu-img create hd.img 2G&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande qemu-img permet de créer une image disque de la taille spécifiée mais on aurais pu également le faire avec l&#039;outil dd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;dd if=/dev/zero of=hd.img bs=2048 count=1000000&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans notre répertoire « invite », on placera aussi une image du CD d&#039;installation nommée msw.iso ainsi qu&#039;une image de sa disquette de boot « mswboot.img ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;qemu -k fr -fda mswboot.img -cdrom msw.iso -hda hd.img -user-net -boot a&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande permet donc de demarrer Qemu avec une disquette, un disque dur et un cdrom virtuel correspondant respectivement a la disquette d&#039;amorcage de Microsoft Windows 98, le disque virtuel que l&#039;on a créé et l&#039;image ISO de Windows 98. L&#039;option « boot a » indique que l&#039;on souhaite démarrer le système virtuel depuis le lecteur de disquette virtuel. Il n&#039;est pas nécessaire d&#039;utiliser une disquette d&#039;amorçage si l&#039;image ISO est « amorçable ».&lt;br /&gt;
&lt;br /&gt;
Vous remarquez que j&#039;ai mis des options dont je n&#039;ai pas forcément besoin tout de suite (-cdrom, -user-net), mais comme on va devoir redémarrer notre système virtuel de nombreuses fois pendant l&#039;installation, et donc relancer Qemu, on fera un copier-coller de la commande au lieu de tout retaper. j&#039;ai aussi mis le clavier en français avec &amp;lt;code&amp;gt;-k fr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
L&#039;installation de Windows débute, on va tout d&#039;abord créer notre partition et l&#039;activer avec Fdisk puis on reboot. On formatte ensuite le disque C: puis on reboot a nouveau. Ceci fait partie de la procédure standard d&#039;installation de Windows, ce n&#039;est pas spécifique a Qemu. Attention, le lecteur de cdrom porte parfois la lettre R: (donc pas de panique si ça ne marche pas avec D:). On est arrive ensuite dans la partie graphique de l&#039;installation, je ne rentre pas dans les détails. Au reboot suivant, on relancera le système en partant du disque dur virtuel et non plus à partir de la disquette en remplaçant &amp;lt;code&amp;gt;-boot a&amp;lt;/code&amp;gt; par &amp;lt;code&amp;gt;-boot c&amp;lt;/code&amp;gt;. Lorsque l&#039;installation est terminée, on a accès au système virtuel avec la commande suivante, toujours en étant dans le répertoire où se trouve l&#039;image-disque:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;qemu -k fr -hda hd.img -cdrom /dev/cdrom -user-net -boot c&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir démarrer avec l&#039;option &amp;lt;code&amp;gt;-cdrom /dev/cdrom&amp;lt;/code&amp;gt;, assurez vous qu&#039;un céderom est présent dans le lecteur avant le démarrage de Qemu.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai volontairement oublié certaines options que l&#039;on va détailler dans le chapitre suivant.&lt;br /&gt;
&lt;br /&gt;
== Les principales options ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;-hda [image]&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;-hda [périphérique]&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: sert à spécifier l&#039;image de disque dur qui va servir pendant l&#039;émulation; il peut aussi s&#039;agir d&#039;un périphérique ou d&#039;une partition, comme /dev/hda1; Il y a aussi &amp;lt;/nowiki&amp;gt;&amp;lt;code&amp;gt;-hdb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-hdc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-hdd&amp;lt;/code&amp;gt;, pour simuler d&#039;autres partitions, mais on ne peut pas utiliser &amp;lt;code&amp;gt;-hdc&amp;lt;/code&amp;gt; en même temps que &amp;lt;code&amp;gt;-cdrom&amp;lt;/code&amp;gt;.&#039;&#039;&#039; L&#039;utilisation de partitions &amp;quot;réelles&amp;quot; présente des risques pour le disque dur, préfèrez les images&#039;&#039;&#039;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-cdrom [image]&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;-cdrom [périphérique]&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: même chose que précèdemment, mais là il est question du cdrom. le périphérique peut être un lien (/dev/cdrom) ou sa cible (/dev/hdc); &amp;lt;/nowiki&amp;gt;&amp;lt;code&amp;gt;-cdrom&amp;lt;/code&amp;gt; peut utiliser n&#039;importe quel hdX qui correspond à un lecteur cédérom qui contient un cédérom mais qui n&#039;est pas monté.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fda [image]&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;-fda [périphérique]&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: comme pour -cdrom, version disquette, et il y a aussi &amp;lt;/nowiki&amp;gt;&amp;lt;code&amp;gt;-fdb&amp;lt;/code&amp;gt;, et donc certainement la possibilité d&#039;utiliser 2 lecteurs de disquettes.&lt;br /&gt;
* &amp;lt;code&amp;gt;-boot X&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: où X peut être a (floppy ou image), c (partition virtuelle), ou d (lecteur CD ou image), soit le périphérique sur lequel on va démarrer. Si l&#039;on utilise qu&#039;un seul périphérique (voir options précédentes), cette option est inutile. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-enable-audio&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: permet le support du son en émulant une carte-son SB16. celà pose quelques problèmes avec l&#039;OS de Bill, qui, suivant les versions, peut avoir des soucis avec cette carte. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-m [memoire]&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: permet de spécifier la quantité de mémoire vive pour le système émulé; ne mettez pas la taille totale de votre mémoire car il faut en laisser pour le système hôte. Par défaut, cette valeur est de 128. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-k [lang]&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: (à partir de Qemu 0.6.1) précise le schéma du clavier: en-gb, en-us, fr, fr-ca, fr-be, fr-ch,...etc. par défaut, c&#039;est en-us, mais une fois le système émulé lancé, c&#039;est lui qui choisira le schéma (sauf pour les consoles virtuelles de Qemu). &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-snapshot&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: pour écrire dans un fichier temporaire, au lieu d&#039;une partition ou d&#039;une image disque. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-nographic&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: désactive l&#039;interface graphique, la sortie devenant la console ou a été lancé Qemu; c&#039;est utile pour les systèmes en mode texte (Linux texte, Msdos...). &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-full-screen&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: l&#039;option parle d&#039;elle même. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le réseau ===&lt;br /&gt;
&lt;br /&gt;
Par défaut, le réseau de l&#039;OS invité transitera sur l&#039;hôte par le biais de l&#039;interface &amp;lt;code&amp;gt;/dev/net/tun0&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;; toutefois, ce n&#039;est pas le procédé le plus simple, car celle-ci n&#039;est pas forcément présente sur le système et la créer peut nécessiter une compilation du noyau (rarement avec les distributions récentes). Je lui préfèrerai donc, pour plus de compatibilité, le mode &amp;quot;user&amp;quot;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;-user-net&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: active le mode &amp;quot;user&amp;quot; pour le réseau; Qemu se comporte comme un serveur DHCP, qui attribue au système émulé l&#039;adresse 10.0.2.15; ce système se connecte via une passerelle virtuelle à 10.0.2.2, et le DNS est à 10.0.2.3. L&#039;inconvénient de ce procédé est que le système invité &amp;quot;voit&amp;quot; l&#039;hôte, mais pas l&#039;inverse. Attention, Microsoft Windows ne trouve pas toujours le serveur DHCP, il vaudra mieux le configurer avec une IP fixe. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-smb [dossier]&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: permet à l&#039;invité d&#039;accéder à un dossier partagé sur l&#039;hôte, qui devra être équipé d&#039;un serveur Samba; l&#039;adresse de ce serveur pour l&#039;invité est 10.0.2.4. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-tftp [préfixe]&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: active un serveur TFTP à l&#039;adresse 10.0.2.2. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Les raccourcis clavier et le moniteur ===&lt;br /&gt;
&lt;br /&gt;
Il est aussi possible d&#039;utiliser des raccourcis clavier, pour accéder à des fonctions supplémentaires:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ctrl-alt-f&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: passe en plein-écran. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ctrl-alt-1&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: affichage graphique de l&#039;invité. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ctrl-alt-2&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: passage au moniteur Qemu; attention, dans ces deux options, le 1 et le 2 sont à taper sur les chiffres hauts du clavier, pas sur le pavé numérique. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ctrl-alt&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: pour arrêter le contrôle de la souris dans l&#039;invité, alors que pour l&#039;activer, on avait cliqué dans la fenêtre de Qemu. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le moniteur propose quelques commandes supplémentaires:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;info&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: affiche une liste des sous-rubriques d&#039;informations. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;eject [périphérique amovible]&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: éjecte un CD ou une disquette; on peut ajouter l&#039;option &amp;lt;/nowiki&amp;gt;&amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; pour forcer l&#039;éjection.&lt;br /&gt;
* &amp;lt;code&amp;gt;change [périphérique ou image]&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: permet de changer de média amovible, périphérique ou image. &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt;&amp;lt;nowiki&amp;gt;: pour quitter Qemu (sans arrêter l&#039;OS émulé proprement). &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant la version 0.6.1, les raccourcis clavier étaient à base de &amp;quot;ctrl-shift...&amp;quot;.Il existe d&#039;autres commandes, il n&#039;a été présenté que celles qui sont réellement indispensables. Pour plus de détails, je vous recommande de lire le très complet manuel de Qemu qui se trouve dans &amp;lt;code&amp;gt;/usr/share/doc/qemu/&amp;lt;/code&amp;gt;si vous avez installé un paquet binaire, ou dans &amp;lt;code&amp;gt;/usr/local/share/doc/qemu/&amp;lt;/code&amp;gt; si vous avez installé à partir des sources. Le site officiel propose aussi une FAQ, et un forum. Enfin, les archives de la liste de diffusion de Lea-aide fourmillent de questions et de réponses, qui sont d&#039;ailleurs à la base de cet article.&lt;br /&gt;
&lt;br /&gt;
=== Une petite astuce ===&lt;br /&gt;
&lt;br /&gt;
Si on utilise très souvent Qemu, il peut être pénible de taper toujours la même longue commande. On s&#039;en sort en faisant un script-shell très simple, avec son éditeur de texte favori:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt; cd /chemin/du/dossier_ou_est_image/&amp;lt;br /&amp;gt; qemu -k fr -cdrom cd_de_OS.iso -hda&amp;lt;br /&amp;gt; hd.img -user-net -smb /home/toto/partage -boot c&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On sauvegarde ce fichier puis on le rend le exécutable. On se fait un raccourci dans son menu, ou sur le bureau, avec le chemin complet du script en guise de commande: on vient de se simplifier la vie. Notez que je charge l&#039;image du CD d&#039;installation, au lieu de penser à mettre un CD dans le lecteur: si j&#039;ai besoin, je pourrais changer via le moniteur de Qemu.&lt;br /&gt;
&lt;br /&gt;
== Plus... ==&lt;br /&gt;
&lt;br /&gt;
Sachez enfin qu&#039;il existe un module additionnel pour accélérer l&#039;émulation, Kqemu; celui-ci n&#039;est, hélas, pas libre.Il n&#039;est disponible qu&#039;en tar.gz, et doit être placé dans le dossier où l&#039;on a extrait les sources de Qemu avant la compilation de l&#039;ensemble.Il faut préciser que Qemu ne présente normalement aucun risque pour le système hôte, mais vu la charge sur le processeur, je recommande de s&#039;assurer que celui-ci est convenablement refroidi, et éventuellement de surveiller la température avec un utilitaire adéquat (Gkrellm par exemple); mon Athlon prend facilement 5°C dans ce cas, et c&#039;est un modèle plutôt stable: inutile de préciser que c&#039;est à vos risques et périls, vous êtes seul responsable de votre matériel. L&#039;utilisation de Kqemu permet un gain de performance allant jusqu&#039;a X 10 : dans ce contexte, la différence de temps d&#039;exécution entre un OS natif et d&#039;un OS émulé par Qemu est de l&#039;orde de 20%.&lt;br /&gt;
&lt;br /&gt;
Remarque : kqemu est disponible en rpm dans le media plf de la mandriva 2007.&lt;br /&gt;
&lt;br /&gt;
Voilà, j&#039;espère que cet article est assez complet et simple à comprendre: c&#039;était le but recherché.&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 David Roux le 20/05/2005.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Copyright =&lt;br /&gt;
Copyright &amp;amp;copy; 20/05/2005, David Roux&lt;br /&gt;
{{CC-BY-NC-SA}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Autres ressources=&lt;br /&gt;
&lt;br /&gt;
* [http://lea-linux.org/cached/index/Fiches:Windows-ficheqemu.html Exemples] de génération et de démarrage de systèmes virtuels DOS et Windows sous GNU/Linux avec QEMU.&lt;br /&gt;
&lt;br /&gt;
* [http://fabrice.bellard.free.fr/qemu/ La page de QEmu]&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Trucs:Cr%C3%A9er_une_disquette_de_boot&amp;diff=14098</id>
		<title>Trucs:Créer une disquette de boot</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Trucs:Cr%C3%A9er_une_disquette_de_boot&amp;diff=14098"/>
		<updated>2006-12-17T22:53:46Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;Léa (Fred)&amp;lt;fred@lea-linux.org&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... depuis le CD de sa distribution ... &amp;lt;br /&amp;gt;Ou comment installer une distribution quand son pc refuse de booter sur le CD-Rom.&lt;br /&gt;
&lt;br /&gt;
Sur le cd de votre distribution linux se trouve plus que surement un utilitaire &amp;quot;DOS et/ou Windows&amp;quot; nommé &amp;quot;rawrite.exe&amp;quot;. Cet utilitaire sert à copier une &amp;quot;image&amp;quot; de disquette. Vous trouverez aussi des images de disquette de boot, souvant dans le répertoire &amp;quot;D:\images\&amp;quot; du CD, ces images ont des noms se terminant par &amp;quot;.img&amp;quot;, comme &amp;quot;boot.img&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Supposons que &amp;quot;rawrite.exe&amp;quot; soit dans le répertoire &amp;quot;D:\dosutils\&amp;quot;, que les images soient dans &amp;quot;D:\images\&amp;quot;, et que vous souhaitiez utiliser l&#039;image &amp;quot;boot.img&amp;quot; de ce répertoire. Voilà, alors comment procéder, depuis une fenêtre de commandes MS-DOS :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;C:\&amp;gt; &#039;&#039;&#039;d:&#039;&#039;&#039;&amp;lt;br /&amp;gt;D:\&amp;gt; &#039;&#039;&#039;cd \images&#039;&#039;&#039;&amp;lt;br /&amp;gt;D:\images&amp;gt; &#039;&#039;&#039;..\dosutils\rawrite&#039;&#039;&#039;&amp;lt;br /&amp;gt;Enter disk image source file name: &#039;&#039;&#039;boot.img&#039;&#039;&#039;&amp;lt;br /&amp;gt;Enter target diskette drive: a: &amp;lt;br /&amp;gt;Please insert a formatted diskette into drive A: and press --ENTER-- :&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Et voilà, vous avez en votre possession une belle disquette de boot pour installer votre linux tout frais.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pour faire la même chose sous Linux ===&lt;br /&gt;
Sur le cd linux, cherchez le fichier &amp;lt;tt&amp;gt;boot.img&amp;lt;/tt&amp;gt; : notez précisément son adresse, par exemple :&lt;br /&gt;
&amp;lt;tt&amp;gt;/media/cdrom/SUPTUX4DSMAL/boot.img&amp;lt;/tt&amp;gt;&lt;br /&gt;
ou bien&lt;br /&gt;
&amp;lt;tt&amp;gt;/mnt/cdrom2/images/boot.img&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ouvrez une console  et tapez cette adresse précise à la place de &amp;lt;tt&amp;gt;/ADRESSE/boot.img&amp;lt;/tt&amp;gt; dans la commande suivante :&lt;br /&gt;
&amp;lt;code&amp;gt;dd if=/ADRESSE/boot.img of=/dev/fd0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
où &amp;lt;tt&amp;gt;/dev/fd0&amp;lt;/tt&amp;gt; est l&#039;adresse de votre disquette dans la plupart des cas.&lt;br /&gt;
&lt;br /&gt;
La aussi, vous avez en votre possession une belle disquette de boot pour installer votre linux tout frais.&lt;br /&gt;
--[[Utilisateur:Jpmgir|Jpmgir]] 13 déc 2006 à 11:28 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Trucs_Installation]]&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Trucs:En_cas_de_perte_d%27un_mot_de_passe&amp;diff=14097</id>
		<title>Trucs:En cas de perte d&#039;un mot de passe</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Trucs:En_cas_de_perte_d%27un_mot_de_passe&amp;diff=14097"/>
		<updated>2006-12-17T22:47:55Z</updated>

		<summary type="html">&lt;p&gt;Ennael : restitution de la dernière modification de PingouinMigrateur&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;Jonesy&amp;lt;jonesy_at_wanadoo_dot_fr&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il peut vous arriver de perdre d&#039;une façon ou d&#039;une autre le mot de passe (password) d&#039;un de vos utilisateurs (user).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Si cet utilisateur n&#039;est pas l&#039;utilisateur &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&amp;lt;br /&amp;gt;C&#039;est le cas le plus simple. Il vous suffit de vous loguer en &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; et vous affectez directement un nouveau mot de passe &#039;&#039;idiot&#039;&#039; à l&#039;utilisateur en faisant : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;passwd toto&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Puis là, l&#039;utilisateur &#039;toto&#039; pourra rechanger son mot de passe comme il l&#039;entend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Si cet utilisateur est le &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt;&#039;&#039;&#039; ( aie ! Ca fait mal... :-) ) &amp;lt;br /&amp;gt;Dans ce cas, cela se complique &#039;&#039;un peu&#039;&#039;. Ce que je propose impose d&#039;avoir un accès physique à la machine, si ce n&#039;est pas le cas je &#039;&#039;ne sais pas&#039;&#039; comment faire.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vous en sortir si :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;u&amp;gt;Vous avez un autre système d&#039;exploitation sur votre machine capable de lire et écrire sur la partition &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt;&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt;Cet autre système d&#039;exploitation peut etre un autre GNU/Linux, un BSD Libre (NetBSD, FreeBSD, OpenBSD, ...) ou un MS Windows avec les outils nécessaires et si votre partition &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt; est en &amp;lt;tt&amp;gt;EXT2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* &amp;lt;u&amp;gt;Vous avez une mini-distribution ou une distribution sur CDROM&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt;Une mini distribution genre : Tom&#039;s RtBt (voir [http://lea-linux.org/software/toms1.php3 cet article]) &amp;lt;br /&amp;gt;Une distribution sur CDROM genre : DemoLinux.&lt;br /&gt;
* &amp;lt;u&amp;gt;Votre distribution fournit sur l&#039;un de ses CDROMs un mode &#039;rescue&#039; (secours)&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt;Pour accéder au mode &#039;rescue&#039; sur le CDROM d&#039;installation de la Mandrake, par exemple, il suffit d&#039;appuyer sur la touche &#039;F1&#039;, au lieu de &#039;entrée&#039;, à la première invite puis de taper &#039;rescue&#039; et de valider. A la fin du processus d&#039;initialisation vous vous retrouverez avec une invite de commande, comme sous un terminal ou lorsque vous bootez en mode non graphique.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;La procédure à suivre&#039;&#039;&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;explication, je pars du principe que votre partition &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt; est sur le disque dur maitre de la nappe IDE 1 sur la deuxième partition principale, soit &amp;lt;tt&amp;gt;/dev/hda2&amp;lt;/tt&amp;gt;. De plus, je suppose aussi que vous utilisez un autre système GNU/Linux pour réparer. Ceci pour faciliter l&#039;explication et pour qu&#039;elle reste claire. &amp;lt;br /&amp;gt;A vous d&#039;adapter la suite en fonction de votre cas particulier... Mais l&#039;idée générale est là. &amp;lt;br /&amp;gt;Pour finir avec les &#039;&#039;conventions&#039;&#039;, les commandes dans VI sont des séries de lettres à taper à la suite sans appuyer sur la touche &#039;entrée&#039; entre les lettres et sans les espaces, qui ne sont là que pour regrouper les commandes &#039;&#039;logiquement&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
La première chose à faire est de rebooter sur le système (autre GNU/Linux, DemoLinux, CD de rescue, ...) vous permettant ainsi de lire et d&#039;écrire sur votre partition &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une fois que vous êtes sous une invite de commande...&lt;br /&gt;
&lt;br /&gt;
Il vous sera peut être nécessaire de configurer votre clavier en francais, pour cela faites : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;/usr/bin/loadkeys fr-latin1.map&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après, il vous faut monter votre partition &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt; avec les commandes suivantes : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;mkdir -p /mnt/mysys &amp;lt;br /&amp;gt;mount /dev/hda2 /mnt/mysys&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Si votre partition a un système de fichiers particulier, ou que la commande &amp;lt;tt&amp;gt;mount&amp;lt;/tt&amp;gt; ne marche pas, alors utilisez l&#039;option &amp;lt;tt&amp;gt;-t &amp;lt;type&amp;gt;&amp;lt;/tt&amp;gt; afin de spécifier votre système de fichiers. Si cela ne marche toujours pas, cela signifie que le noyau du système que vous utilisez pour réparer n&#039;a pas le support de votre système de fichiers. &amp;lt;br /&amp;gt;&amp;lt;u&amp;gt;Note &amp;lt;/u&amp;gt;&amp;lt;nowiki&amp;gt;: A l&#039;heure actuelle c&#039;est souvent &amp;lt;/nowiki&amp;gt;&amp;lt;tt&amp;gt;EXT3&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Maintenant que la partition est montée, nous allons modifier le fichier &amp;lt;tt&amp;gt;/etc/passwd&amp;lt;/tt&amp;gt; afin de supprimer le mot de passe root en enlevant l&#039;étoile : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;br /&amp;gt;cd /mnt/mysys/etc &amp;lt;br /&amp;gt;vi passwd &amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;#---- Dans VI ---- &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;#---- &amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;Sur la ligne :&amp;lt;tt&amp;gt; root:x:0:0:,,,:/root:/bin/ksh &amp;lt;br /&amp;gt;2w x :wq&amp;lt;la touche entrée&amp;gt; &amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;#---- Hors VI ---- &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;cd / &amp;lt;br /&amp;gt;umount /mnt/mysys &amp;lt;br /&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Remarque : Nous utilisons ici l&#039;éditeur &#039;vi&#039;, car c&#039;est le seul éditeur de texte que nous sommes sûr de trouver quelque soit le système utilisé, sauf MS Windows :-). De plus généralement, l&#039;utilisateur &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; est la première ligne du fichier &amp;lt;tt&amp;gt;/etc/passwd&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;gt;Enfin, il ne vous reste plus qu&#039;à rebooter sur votre système &amp;quot;malade&amp;quot;. &amp;lt;br /&amp;gt;Une fois connecté à votre système avec un utilisateur normal, faites : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;br /&amp;gt;su - root &amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;Normalement aucun mot de passe ne vous sera demandé.&amp;lt;tt&amp;gt;&amp;lt;br /&amp;gt;cd /etc &amp;lt;br /&amp;gt;vi passwd &amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;#---- Dans VI ---- &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;#---- &amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;Sur la ligne :&amp;lt;tt&amp;gt; root::0:0:,,,:/root:/bin/ksh &amp;lt;br /&amp;gt;w ax&amp;lt;la touche escape&amp;gt; :wq&amp;lt;la touche entrée&amp;gt; &amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;#---- Hors VI ---- &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;passwd &amp;lt;br /&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois ici, il va vous demander le nouveau mot de passe du &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt;. Une fois le mot de passe défini, ça y est, vous avez fini ! Le système est réparé, vous pouvez vous déconnecter et reconnecter en &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; sans problème. Ouff ! :-)&lt;br /&gt;
[[Catégorie:Trucs_Au secours]]&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Accueil&amp;diff=14096</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Accueil&amp;diff=14096"/>
		<updated>2006-12-17T22:45:03Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Léa à Linux Solution 2007 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;imglink&amp;gt;http://eucd.info![[Image:Copier_différent_de_pirater.png|http://eucd.info]]&amp;lt;/imglink&amp;gt;&lt;br /&gt;
&amp;lt;cadre&amp;gt;Ça y est ! C&#039;est fait ! La loi sur le &#039;&#039;&#039;Droit d&#039;Auteur et les Droits Voisins dans la Société de l&#039;Information&#039;&#039;&#039; est votée. Nos droits à l&#039;interopérabilité se retrouvent donc bridés. Nous risquons maintenant des amendes à utiliser le Peer To Peer (comment détermineront-ils si nous en faisons une utilisation légale ou pas ?). Merci à nos parlementaires d&#039;avoir si bien su défendre l&#039;intérêt général.&amp;lt;/cadre&amp;gt;&lt;br /&gt;
= Bienvenue sur Léa =&lt;br /&gt;
&lt;br /&gt;
=== Léa à Linux Solution 2007 ===&lt;br /&gt;
[[Image:sl2007.jpg]]&lt;br /&gt;
&lt;br /&gt;
Comme les années précédentes, Léa sera présente à [http://www.solutionslinux.fr/fr/exposer_associations.php Solution Linux 2007]. N&#039;hésitez pas à passer nous voir ! Si vous souhaitez participer à la vie du stand, envoyez un mail à admin at lea-linux.org.&lt;br /&gt;
&lt;br /&gt;
{{Lea_Linux:Les_nouvelles}}&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Léa est un Wiki ! ==&lt;br /&gt;
Autrefois, contribuer à Léa était assez compliqué (ce qui n&#039;a pas empêché de nombreux auteurs de nous soumettre leurs articles).&lt;br /&gt;
&lt;br /&gt;
Aujourd&#039;hui, nous avons adopté la technologie de Wikipédia, &lt;br /&gt;
&lt;br /&gt;
Tout le monde peut donc créer et modifier 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 : les modifications 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;
&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 a 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;
&amp;lt;newbox&amp;gt;Les nouvelles du libre (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;
&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;
{{DP}}&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Accueil&amp;diff=14095</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Accueil&amp;diff=14095"/>
		<updated>2006-12-17T22:44:40Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Léa à Linux Solution 2007 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;imglink&amp;gt;http://eucd.info![[Image:Copier_différent_de_pirater.png|http://eucd.info]]&amp;lt;/imglink&amp;gt;&lt;br /&gt;
&amp;lt;cadre&amp;gt;Ça y est ! C&#039;est fait ! La loi sur le &#039;&#039;&#039;Droit d&#039;Auteur et les Droits Voisins dans la Société de l&#039;Information&#039;&#039;&#039; est votée. Nos droits à l&#039;interopérabilité se retrouvent donc bridés. Nous risquons maintenant des amendes à utiliser le Peer To Peer (comment détermineront-ils si nous en faisons une utilisation légale ou pas ?). Merci à nos parlementaires d&#039;avoir si bien su défendre l&#039;intérêt général.&amp;lt;/cadre&amp;gt;&lt;br /&gt;
= Bienvenue sur Léa =&lt;br /&gt;
&lt;br /&gt;
=== Léa à Linux Solution 2007 ===&lt;br /&gt;
[[Image:sl2007.jpg]]&lt;br /&gt;
&lt;br /&gt;
Comme les années précédentes, Léa sera présente à [http://www.solutionslinux.fr/fr/exposer_associations.php Solution Linux 2007]. N&#039;hésitez pas à passer nous voir !&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez participer à la vie du stand, envoyez un mail à admin at lea-linux.org.&lt;br /&gt;
&lt;br /&gt;
{{Lea_Linux:Les_nouvelles}}&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Léa est un Wiki ! ==&lt;br /&gt;
Autrefois, contribuer à Léa était assez compliqué (ce qui n&#039;a pas empêché de nombreux auteurs de nous soumettre leurs articles).&lt;br /&gt;
&lt;br /&gt;
Aujourd&#039;hui, nous avons adopté la technologie de Wikipédia, &lt;br /&gt;
&lt;br /&gt;
Tout le monde peut donc créer et modifier 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 : les modifications 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;
&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 a 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;
&amp;lt;newbox&amp;gt;Les nouvelles du libre (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;
&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;
{{DP}}&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Fichier:Sl2007.jpg&amp;diff=14094</id>
		<title>Fichier:Sl2007.jpg</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Fichier:Sl2007.jpg&amp;diff=14094"/>
		<updated>2006-12-17T22:41:11Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Accueil&amp;diff=14093</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Accueil&amp;diff=14093"/>
		<updated>2006-12-17T22:17:50Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;imglink&amp;gt;http://eucd.info![[Image:Copier_différent_de_pirater.png|http://eucd.info]]&amp;lt;/imglink&amp;gt;&lt;br /&gt;
&amp;lt;cadre&amp;gt;Ça y est ! C&#039;est fait ! La loi sur le &#039;&#039;&#039;Droit d&#039;Auteur et les Droits Voisins dans la Société de l&#039;Information&#039;&#039;&#039; est votée. Nos droits à l&#039;interopérabilité se retrouvent donc bridés. Nous risquons maintenant des amendes à utiliser le Peer To Peer (comment détermineront-ils si nous en faisons une utilisation légale ou pas ?). Merci à nos parlementaires d&#039;avoir si bien su défendre l&#039;intérêt général.&amp;lt;/cadre&amp;gt;&lt;br /&gt;
= Bienvenue sur Léa =&lt;br /&gt;
&lt;br /&gt;
=== Léa à Linux Solution 2007 ===&lt;br /&gt;
[[Image:sl2007.jpg]]&lt;br /&gt;
&lt;br /&gt;
Comme les années précédentes, Léa sera présente à [http://www.solutionslinux.fr/fr/exposer_associations.php Solution Linux 2007]&lt;br /&gt;
&lt;br /&gt;
{{Lea_Linux:Les_nouvelles}}&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Léa est un Wiki ! ==&lt;br /&gt;
Autrefois, contribuer à Léa était assez compliqué (ce qui n&#039;a pas empêché de nombreux auteurs de nous soumettre leurs articles).&lt;br /&gt;
&lt;br /&gt;
Aujourd&#039;hui, nous avons adopté la technologie de Wikipédia, &lt;br /&gt;
&lt;br /&gt;
Tout le monde peut donc créer et modifier 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 : les modifications 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;
&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 a 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;
&amp;lt;newbox&amp;gt;Les nouvelles du libre (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;
&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;
{{DP}}&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Discussion_utilisateur:Arnold59_(phorum)&amp;diff=13079</id>
		<title>Discussion utilisateur:Arnold59 (phorum)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Discussion_utilisateur:Arnold59_(phorum)&amp;diff=13079"/>
		<updated>2006-07-16T16:32:41Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Page en cours de réécriture&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Discussion:Installer_Linux_Mandrake_10.0_official&amp;diff=13078</id>
		<title>Discussion:Installer Linux Mandrake 10.0 official</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Discussion:Installer_Linux_Mandrake_10.0_official&amp;diff=13078"/>
		<updated>2006-07-16T09:45:39Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un tutorial bien complet, mais mandrake est à présent devenue Mandriva, donc la Mandrake 10.0 official risque fort de n&#039;être plus disponible... &lt;br /&gt;
&lt;br /&gt;
Mandriva : www.mandriva.com&lt;br /&gt;
&lt;br /&gt;
Après proposition d&#039;un contributeur, je suis en train de réécrire la page :) - Anne&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Accueil&amp;diff=13077</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Accueil&amp;diff=13077"/>
		<updated>2006-07-16T08:57:23Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* RMLL2006 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;imglink&amp;gt;http://eucd.info![[Image:Copier_différent_de_pirater.png|http://eucd.info]]&amp;lt;/imglink&amp;gt;&lt;br /&gt;
&amp;lt;cadre&amp;gt;Ça y est ! C&#039;est fait ! La loi sur le &#039;&#039;&#039;Droit d&#039;Auteur et les Droits Voisins dans la Société de l&#039;Information&#039;&#039;&#039; est votée. Nos droits à l&#039;interopérabilité se retrouvent donc bridés. Nous risquons maintenant des amendes à utiliser le Peer To Peer (comment détermineront-ils si nous en faisons une utilisation légale ou pas ?). Le droit d&#039;auteur est négligé au profit du CopyRight&amp;amp;copy; Merci à nos parlementaires d&#039;avoir si bien su défendre l&#039;intérêt général.&amp;lt;/cadre&amp;gt;&lt;br /&gt;
= Bienvenue sur Léa =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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 a 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;
&amp;lt;newbox&amp;gt;Les nouvelles du libre (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;
&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;
{{DP}}&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12811</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12811"/>
		<updated>2006-06-19T16:47:23Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &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;br /&gt;
&lt;br /&gt;
= Copyright =&lt;br /&gt;
&lt;br /&gt;
{{LDL}}&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12810</id>
		<title>Découvrez les ressources de votre machine (La suite)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12810"/>
		<updated>2006-06-19T16:46:45Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Les plus du matériel]]&lt;br /&gt;
= Découvrez les ressources de votre machine (La suite) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A nouvelle année, nouvelles résolutions ! Paru dans le numéro 68, un premier article dédié à la découverte des outils disponibles pour la récupération des configurations de votre machine promettait une suite.  Je vous propose donc de reprendre ce voyage au centre de votre ordinateur. &lt;br /&gt;
&lt;br /&gt;
Cet article sera articulé autour du diagnostic de pannes et des correctifs associés mais aussi de « trucs &amp;amp; astuces » permettant d&#039;optimiser votre configuration.&lt;br /&gt;
&lt;br /&gt;
== Savez-vous planter les choux ? ==&lt;br /&gt;
&lt;br /&gt;
Les choux peut-être pas mais les ordinateurs je pense que c&#039;est arrivé au moins une fois à chaque lecteur qui lit cet article. Rien de plus énervant qu&#039;un écran qui se fige, le pointeur de souris qui ne se déplace plus, le clavier qui ne répond plus non plus.... Planté ! Ce constat est assez facile à établir mais en trouver la cause reste un problème nettement plus complexe tellement le nombre de causes possibles est important.&lt;br /&gt;
&lt;br /&gt;
Deux solutions : ignorer le problème et relancer le système en se disant que ça « passera », ou alors chercher la cause du problème en essayant de trouver une méthode reproduisant le « plantage » tant redouté.&lt;br /&gt;
&lt;br /&gt;
La première solution fonctionne assez bien mais si l&#039;on à faire à un « vrai » problème de configuration matérielle ou logicielle, on arrivera assez vite à ne plus pouvoir éviter la seconde voire la troisième. J&#039;allais oublier cette troisième solution destinée aux plus riches d&#039;entre vous : changer de matériel. Cette solution coûteuse peut parfois se révéler efficace, parfois pas du tout. A quoi bon changer un composant sans savoir si c&#039;était bien celui-ci qui posait problème ?&lt;br /&gt;
Quelque soit la solution retenue, il sera de toute manière nécessaire de localiser la panne pour y apporter la réponse adéquate. Certaines sociétés ou particuliers se sont spécialisés dans ce dépannage ou l&#039;utilisateur est « dépassé » par les événements.&lt;br /&gt;
&lt;br /&gt;
Cet article vous fera, je l&#039;espère, découvrir quelques outils et méthodes pour valider un par un les composants de votre ordinateur. Cela vous permettra j&#039;espère d&#039;être un peu moins dépourvu quand un problème surviendra. L&#039;article reproduira les étapes qu&#039;il faut suivre pour isoler le « fautif ».&lt;br /&gt;
&lt;br /&gt;
== Les causes possibles d&#039;un « plantage » ==&lt;br /&gt;
&lt;br /&gt;
On retrouve deux grandes catégories de pannes provoquant des dysfonctionnements importants sur un système informatique.&lt;br /&gt;
* une panne du matériel&lt;br /&gt;
* une erreur logicielle au niveau du noyau et des pilotes (drivers)&lt;br /&gt;
&lt;br /&gt;
Il faudra donc être capable de séparer la panne matérielle qui « force » l&#039;ordinateur à entrer dans un mode de fonctionnement non prévu et instable, de l&#039;erreur logicielle qui équivaut à demander à l&#039;ordinateur de faire « n&#039;importe quoi » et qui va donc se « planter ».&lt;br /&gt;
&lt;br /&gt;
Le terme « planté » utilisé ici équivaut à un arrêt du système à cause d&#039;erreurs sévères : instruction illégale ou composants défaillants. Le terme de « plantage » est aussi utilisé pour décrire le fonctionnement d&#039;une application qui se ferme inopinément. Ce cas est plus souvent lié à une erreur de programmation de l&#039;application qu&#039;à une erreur du système. Nous ne parlerons donc pas de ce second cas dans cet article.&lt;br /&gt;
&lt;br /&gt;
== La mémoire qui flanche ? ==&lt;br /&gt;
&lt;br /&gt;
Une cause « classique » des dysfonctionnements se situe au niveau de la gestion de la mémoire de votre machine. Je ne parle pas d&#039;allocation mémoire réalisée par votre système d&#039;exploitation favori mais bien de la manière avec laquelle la carte mère configure et utilise vos barrettes de mémoire. Les applications chargent en mémoire des données et des instructions destinées au processeur. Voici un scénario qui peut provoquer l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Votre application favorite est lancée depuis la ligne de commande ou une interface graphique via un « clic » de souris. Votre système d&#039;exploitation va donc charger ce programme en mémoire puis en exécuter les instructions. Au plus bas niveau de votre système, le processeur exécute des instructions en langage machine (assembleur) présente en mémoire.&lt;br /&gt;
Malheureusement, votre mémoire est défaillante et elle n&#039;arrive pas à maintenir un état stable des informations qui lui sont confiées. Par exemple, la lettre C est représentée par le code 67, ou « 1000011 » en binaire. Si la zone mémoire change d&#039;état, alors le contenu de la valeur stocké à cet endroit changera : on pourrait se retrouver avec « 1000010 ». Un seul bit a changé, mais on passe de la lettre &#039;C&#039; (67) à la lettre &#039;B&#039;(66). Le résultat ne se fait pas attendre, le processeur se retrouve à exécuter des instructions qui n&#039;ont plus de sens, provoquant l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Les pannes de mémoires sont généralement dues à des composants endommagés, des barrettes incompatibles ou un  « timing d&#039;accès » à la mémoire (nommé CAS (Column Address Strobe) dans la plupart des BIOS) trop agressif permettant des lectures dans des zones mémoires avant que les écritures aient eu le temps de se stabiliser pour en garantir le contenu.&lt;br /&gt;
&lt;br /&gt;
Il est assez simple de valider votre configuration mémoire grâce à l&#039;utilitaire memtest (http://www.memtest.org). Cet utilitaire de taille très modeste, 96 Kilo-octets, est écrit en assembleur ce qui lui permet de s&#039;exécuter indépendamment du système d&#039;exploitation. Ceci garantit un test « proche » du matériel, sans sur-couche pouvant apporter d&#039;autres problèmes. &lt;br /&gt;
La version 1.65 actuelle est téléchargeable sous deux formes : une iso que l&#039;on peut graver sur un CDRW de préférence vu la petite taille du programme ou sous la forme d&#039;une amorce système (pre-compiled bootable binary). Il suffira de décompresser l&#039;archive puis d&#039;exécuter la commande suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;dd if=memtest.bin of=/dev/fda&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Ceci écrasera le contenu de votre disquette pour y  copier memtest. &lt;br /&gt;
Rebootez l&#039;ordinateur avec la disquette placée dans le lecteur, memtest devrait se lancer. &lt;br /&gt;
&lt;br /&gt;
[[Image:memtest.jpg]]&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus, est une capture d&#039;écran de memtest en fonctionnement. Le barre de progression principale affichée en haut à droite de l&#039;écran (2% dans cet exemple) permet de suivre la progression du test. Les erreurs apparaissent dans la partie inférieure de l&#039;écran. Il suffit de laisser fonctionner memtest au moins une fois jusqu&#039;à 100%. Si aucune ligne ne s&#039;est affichée alors vou pouvez considérer que la mémoire est fonctionnelle. Dans le cas contraire,  il faudra soit procéder à son remplacement s&#039;il s&#039;agit d&#039;une seule barrette mémoire, soit tester les barrettes indépendamment (l&#039;une puis l&#039;autre) avec ce logiciel. Dans le cas de 2 ou 3 barrettes qui ne fonctionnement pas correctement ensemble mais qui fonctionnement correctement individuellement, il faudra vérifier qu&#039;elles sont bien de même modèle/marque et remettre le Bios dans une configuration initiale.&lt;br /&gt;
&lt;br /&gt;
Votre mémoire est bonne ? Testons les autres composants de votre machine pour traquer la source de ce plantage.&lt;br /&gt;
&lt;br /&gt;
== Il ne fait pas un peu chaud là ? ==&lt;br /&gt;
&lt;br /&gt;
Ces dix dernières années la puissance consommée et dissipée par nos ordinateurs a littéralement explosé ! Du 486 qui ne nécessitait quasiment pas de ventilateur, on est arrivé à des stations de travail/jeu avec des alimentations pouvant atteindre 1KiloWatt pour les dernières et 500watt pour des modèles plus « grand public ». Le processeur est un des composants gourmands de la machine. Certains modèles peuvent consommer plus de 130W ! Autant dire que si le système est mal ventilé, la montée en charge du processeur peut provoquer un échauffement important provoquant une surchauffe de celui-ci. S&#039;il dépasse ces caractéristiques de fonctionnement, il va alors exécuter du code incorrect provocant  un plantage du système.&lt;br /&gt;
&lt;br /&gt;
Un bon test pour vérifier que votre processeur n&#039;est pas la cause de votre instabilité : commencez par relever la température de votre machine au repos à l&#039;aide des informations fournies soit par l&#039;acpi soit pas lm_sensors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[erwan@R1 ~]$ cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             42 C&lt;br /&gt;
[erwan@R1 ~]$ &lt;br /&gt;
&lt;br /&gt;
[root@konilope ~]# sensors | grep Temp&lt;br /&gt;
M/B Temp:    +39°C  (low  =   +15°C, high =   +40°C)   sensor = thermistor   &lt;br /&gt;
CPU Temp:   +127°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
Temp3:       +44°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
[root@konilope ~]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode utilisant lm_sensors nécessite une interprétation de la part de l&#039;utilisateur. Dans cet exemple, il apparaît évidant que le processeur ne peut avoir une température de fonctionnement aussi élevée (127°C). L&#039;erreur est du à un mauvais calcul de la part de lm_sensors. Il se base sur le type de capteurs thermiques utilisé par la carte mère pour calculer la température des différents composants. Malheureusement, le montage électrique autour du capteur de température peut varier d&#039;un modèle de carte à un autre, ce qui fausse les calculs. On considéra donc, que pour cette machine (konilope) sa température se situe aux alentours de 42° : valeur moyenne entre les deux valeurs « cohérentes » relevées par lm_sensors. On pourra cependant vérifier cette approximation en relevant la température du disque sur à l&#039;aide de smartmontools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# smartctl -A /dev/hda | grep Temperature&lt;br /&gt;
194 Temperature_Celsius     0x0022   042   052   000    Old_age   Always       -       42&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, il est préférable de maintenir sa machine en dessous des 55° et celle de son processeur en dessous de 70°C. Au delà, le système risque d&#039;être instable. Si ce n&#039;est pas le cas, effectuez les modification nécessaire pour y parvenir : meilleure ventilation du processeur ou du boîtier par exemple.&lt;br /&gt;
&lt;br /&gt;
Ensuite, téléchargez l&#039;utilitaire cpuburn depuis un mirroir  (http://pages.sbcglobal.net/redelm/cpuburn_1_4_tar.gz)  ou depuis votre distribution linux favorite (oui, oui, urpmi cpuburn ça fonctionne ;o)).&lt;br /&gt;
&lt;br /&gt;
Vous y trouverez plusieurs programmes nommés burnXX ou XX représente votre processeur. La version P6 sera à utiliser sur les processeurs Intel Pentium 4, la version K7 pour les processeurs Athlon x86. Pour les processeurs plus récents, utilisez la version P6.&lt;br /&gt;
Ce logiciel réalise des boucles en langage assembleur ayant pour but de stresser votre processeur de manière importante et donc le faire chauffer. Lancez cpuburn autant de fois que vous avez de processeur sur votre machine puis observez la température de votre machine. Si lors de la montée en température votre système se fige, alors vous avez un problème de thermie. Si cpuburn ne fait pas planter votre ordinateur au bout de 10mn, vous pouvez considérez que votre système est stable de ce coté là. Vous pouvez aussi utiliser ce test pour vérifier que vos ventilateurs d&#039;ordinateurs portable se déclenchent bien en cas de surchauffe.&lt;br /&gt;
Sur un portable récent, on obtient le résultat suivant au bout de quelques minutes de cpuburn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             80 C&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Malgré la température très élevée du processeur, le système est resté stable ce qui permet de valider qu&#039;il est capable d&#039;encaisser une montée en température élevée. Bien entendu, plus votre machine sera « chaude » plus elle s&#039;usera rapidement. Il ne faut pas oublier que les autres composants peuvent souffrir de la chaleur dégagée par le processeur par exemple : les disques durs en sont un bon exemple car les plateaux ne supportent pas la chaleur.&lt;br /&gt;
Ce test est bon aussi ? A priori, les composants de base de votre système sont en bon état, vous pouvez commencer à regarder du coté configuration logicielle.&lt;br /&gt;
&lt;br /&gt;
== APIC es tu là ? ==&lt;br /&gt;
&lt;br /&gt;
Le manque de stabilité peut aussi s&#039;expliquer par la gestion des interruptions. &lt;br /&gt;
L&#039;architecture PIC (Programmable Interrupt Controllers)  représentée par la famille de composants Intel 8259, permettait une gestion de 8 interruptions pour un unique processeur. On les associe par 2 pour obtenir les 16 niveaux d&#039;interruptions nécessaire depuis nos vieux 80286 (milieu des années 80). Avec l&#039;arrivée des systèmes multi-processeurs, l&#039;architecture APIC (Advanced Programmable Interrupt Controllers) (Intel 82093) à été ajoutée pour permettre une gestion plus fine des interruptions. En effet, dans un contexte multi-processeurs, il est nécessaire de pouvoir choisir quel processeur traitera quelle interruption pour ne pas rester figé dans l&#039;ancien modèle (PIC) où le processeur de  « boot » est assigné à un ensemble d&#039;interruptions. &lt;br /&gt;
&lt;br /&gt;
De plus, l&#039;architecture APIC apporte une gestion de 24 interruptions, une gestion de priorité des interruptions et le routage de l&#039;interruption sur le bon processeur, contre un simple routage de 2*8 interruptions dans le modèle PIC sur un seul processeur. Depuis une dizaine d&#039;années, Intel propose le modèle APIC comme nouvelle architecture, y compris pour les systèmes mono-processeurs. Les ordinateurs récents, y compris les portables, sont maintenant équipés uniquement de composants APIC même si l&#039;on peut obtenir un comportement de type PIC avec ceux-ci.&lt;br /&gt;
&lt;br /&gt;
L&#039;architecture APIC est constituée d&#039;un ou plusieurs composants situé physiquement dans le southbridge (IO-APIC), généralement un par bus, et un composant situé dans le processeur : le Local APIC (LAPIC). Le LAPIC va permettre la gestion des interruptions au niveau du processeur local. Il permet aussi de générer des interruptions par exemple pour transmettre des interruptions à des processeurs voisins dans le contexte d&#039;un système multi-processeurs, ces messages sont appelés IPI (Inter Processor Interrupts). &lt;br /&gt;
&lt;br /&gt;
De plus le Local APIC (LAPIC) inclut un « timer » de précision cadencé à la fréquence du bus, généralement il peut être utilisé par l&#039;ordonnanceur de votre système d&#039;exploitation favori ou d&#039;autres outils de haut niveau (profiler kernel : oprofile, vtune). Les LAPIC et l&#039;IO-APIC sont reliés par un bus spécifique pour permettre un échange rapide des informations. &lt;br /&gt;
&lt;br /&gt;
Schema logique d&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
[[image:acpi.jpg]]&lt;br /&gt;
&lt;br /&gt;
Les IO-APIC vont donc se charger de collecter les interruptions provenant des périphériques systèmes et d&#039;en assurer le transfert vers le ou les processeur(s) suivant une route préalablement programmée par le BIOS et/ou le système d&#039;exploitation.&lt;br /&gt;
&lt;br /&gt;
Cependant, l&#039;implémentation des APIC dans les BIOS peut provoquer certaines instabilités sur votre système Linux. Par expérience, il n&#039;y a pas de règle pour trouver la configuration qui peut aider votre machine à se stabiliser car cela dépend de chaque machine. Des différences peuvent même exister entre  deux versions de BIOS d&#039;un même ordinateur. Cependant, dans la série 2.6 du noyau Linux et les version 2.4 récentes nous disposons d&#039;outils permettant de re-paramétrer cette configuration en activant/désactivant les IO-APIC ou les LAPIC.&lt;br /&gt;
&lt;br /&gt;
Chaque composant possède un activateur ou un inhibiteur, on aura donc d&#039;un coté « apic » et « noapic » pour la gestion des IO-APIC, « nolapic » et « lapic » de l&#039;autre pour la gestion des LAPIC. Ces 4 options sont à utiliser sur la ligne de commande du noyau, c&#039;est à dire au moment où le « bootloader » (lilo ou grub par exemple) va charger le noyau en mémoire. L&#039;utilisation de « apic » et « lapic » permet d&#039;activer ces composants qui ne l&#039;ont pas été par le BIOS. L&#039;activateur « apic » n&#039;est disponible que les architectures de type x86_64 car celui-ci est déjà activé sur les systèmes de type x86. On désactivera les APIC dans le cas où le système affiche des messages d&#039;erreurs sur les APIC comme : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;« APIC error on CPU0: 40(40) »&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ou&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;MP-BIOS bug: 8254 timer not connected to IO-APIC&lt;br /&gt;
failed.&lt;br /&gt;
timer doesn&#039;t work through the IO-APIC - disabling NMI Watchdog!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La désactivation des IO-APIC permet par exemple de corriger le comportement parfois récalcitrant de certaines cartes vidéos qui ne parviennent pas à afficher correctement en mode 2D/3D (écran noir par exemple).&lt;br /&gt;
&lt;br /&gt;
La non activation des LAPIC peut avoir comme conséquence un dysfonctionnement de l&#039;ACPI (gestion d&#039;énergie avancée). Ce cas est traité par le noyau, vous retrouverez dans les messages de démarrage la ligne suivante : « &amp;quot;Local APIC disabled by BIOS you can enable it with lapic ».&lt;br /&gt;
&lt;br /&gt;
Pour résumer, si votre machine, en général à architecture mono-processeur, a tendance à se bloquer lors de l&#039;utilisation de périphériques tels que le port usb, la carte graphique ou la carte son, essayez de désactiver le LAPIC puis l&#039; IO-APIC puis les 2.  Pour exemple, les cartes mère A7N8X de chez Asus ont largement tendance à se bloquer si l&#039;on ne spécifie pas « nolapic » lors du boot. Sur certaines machines, il faudra faire le contraire à savoir forcer l&#039;activation des LAPIC. Ceci dépendra de votre machine et de sa conception.&lt;br /&gt;
&lt;br /&gt;
== A vos marques, rebootez ! ==&lt;br /&gt;
&lt;br /&gt;
Certains machines peuvent présenter quelques soucis pour redémarrer. Encore une fois, on retrouve au coeur de ce problème l&#039;interaction entre le noyau et le matériel notamment l&#039;ACPI. Les ordinateurs portables dont le modèle HP nc6120 ont par exemple le bon goût de rester bloqués sur le message « No reboot fixup found for your hardware ». Ceci indique que le noyau ne connaît pas de contournement pour ce matériel (ce qui est le cas de la quasi totalité des ordinateurs) mais puisque vous voyez ce message c&#039;est que votre machine n&#039;a pas réussi à rebooter. Heureusement, il existe des contournements pour permettre un redémarrage plus « bas niveau ». Le noyau défini les modes suivants : « b » « c » « h » « s » et « w ».&lt;br /&gt;
Le mode de reboot peut être défini sur la ligne de commande du noyau suivant la forme « reboot=&amp;lt;mode&amp;gt; ». Le mode « s » est réservé au systèmes multi-processeurs, elle va réinitialiser chacun des processeurs.&lt;br /&gt;
&lt;br /&gt;
Le mode « b » permet quant à lui de rebooter en faisant un appel direct au bios qui se chargera de faire redémarrer la machine. Ce mode fonctionne plutôt bien car dans le cas d&#039;un BIOS posant problème sur l&#039;ACPI, on peut espérer avoir un reboot correct. C&#039;est le cas sur de notre portable cité précédement.&lt;br /&gt;
&lt;br /&gt;
Le mode « h » se chargera de faire redémarrer la machine en réinitialisant le processeur. C&#039;est l&#039;équivalent du mode « s » pour les environnements mono-processeurs.  Pour finir, les modes « c » et « w » correspondent aux modes « cold » et « warn » : ces modes sont plus connus sous le nom de « reboot à froid »  et « reboot à chaud ». Le premier effectuera les tests de mémoire tandis que le second exécutera un reboot plus court.&lt;br /&gt;
&lt;br /&gt;
De manière générale, on utilisera plutôt le mode « b » ou « h » pour les systèmes mono-processeurs récalcitrant et le mode « s » pour les systèmes multi-processeurs.&lt;br /&gt;
&lt;br /&gt;
== Toujours plus de performance ==&lt;br /&gt;
Votre configuration est bien stable depuis un certain temps. Toutefois vous trouvez qu&#039;elle est un peu lente, elle ne vous donne pas satisfaction par rapport à ce qu&#039;elle devrait fournir.&lt;br /&gt;
Cette partie de l&#039;article va explorer comment vérifier et corriger les problèmes de performance des différents composants.&lt;br /&gt;
Note: certaines configuration mono-processeur nécessitent de désactiver LAPIC (nolapic)&lt;br /&gt;
&lt;br /&gt;
=== Le disque dur ===&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le disque dur semble un peu lent et pénalise le système dans son ensemble. Hdparm est là pour vous aider à y voir plus clair. Hdparm est à l&#039;origine conçu pour les systèmes de disques IDE de type PATA. Le nouveau système de disque SATA, ne permet pas toujours en fonction de l&#039;implémentation, l&#039;appel à toutes ces astuces. Cependant les nouvelles séries de kernel à partir du 2.6.15 devrait permettre une gestion plus unifiée des systèmes de disques PATA et SATA.&lt;br /&gt;
&lt;br /&gt;
Le test « hdparm -t /dev/&amp;lt;mon_device&amp;gt; » permet de tester la vitesse de lecture depuis le disque dur jusqu&#039;en mémoire. Une valeur de 25Mo/sec est un minimum pour des machines récentes. Plusieurs paramètres peuvent influencer les performances d&#039;un disque IDE. &lt;br /&gt;
La commande « hdparm -cd » permet de vérifier que les entrées/sorties sont réalisées en 16-bit (le mode 32-bit n&#039;offre pas de performance supplémentaire) alors que le DMA (Direct Memory Access) est activé. Ceci permet la minimisation de l&#039;utilisation du processeur pendant les accès au disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -cd /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
 IO_support   =  0 (default 16-bit)&lt;br /&gt;
 using_dma    =  1 (on)&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande « hdparm -c0d1 /dev/&amp;lt;mon_device&amp;gt; » permet de configurer le périphérique dans ce mode. Le noyau de votre distribution Linux devrait le réaliser de manière automatique.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -I » permet d&#039;obtenir plus d&#039;informations sur la configuration de votre disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -I /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
ATA device, with non-removable media&lt;br /&gt;
	Model Number:       FUJITSU MHT2040AT                       &lt;br /&gt;
	Serial Number:      NN77T3C13KB9&lt;br /&gt;
	Firmware Revision:  0022    &lt;br /&gt;
Standards:&lt;br /&gt;
	Used: ATA/ATAPI-6 T13 1410D revision 3a &lt;br /&gt;
	Supported: 6 5 4 3 &lt;br /&gt;
Configuration:&lt;br /&gt;
	Logical		max	current&lt;br /&gt;
	cylinders	16383	16383&lt;br /&gt;
	heads		16	16&lt;br /&gt;
	sectors/track	63	63&lt;br /&gt;
	--&lt;br /&gt;
	CHS current addressable sectors:   16514064&lt;br /&gt;
	LBA    user addressable sectors:   78140160&lt;br /&gt;
	device size with M = 1024*1024:       38154 MBytes&lt;br /&gt;
	device size with M = 1000*1000:       40007 MBytes (40 GB)&lt;br /&gt;
Capabilities:&lt;br /&gt;
	LBA, IORDY(cannot be disabled)&lt;br /&gt;
	bytes avail on r/w long: 4	Queue depth: 1&lt;br /&gt;
	Standby timer values: spec&#039;d by Standard, no device specific minimum&lt;br /&gt;
	R/W multiple sector transfer: Max = 16	Current = 16&lt;br /&gt;
	Advanced power management level: 128 (0x80)&lt;br /&gt;
	Recommended acoustic management value: 254, current value: 254&lt;br /&gt;
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 &lt;br /&gt;
	     Cycle time: min=120ns recommended=120ns&lt;br /&gt;
	PIO: pio0 pio1 pio2 pio3 pio4 &lt;br /&gt;
	     Cycle time: no flow control=240ns  IORDY flow control=120ns&lt;br /&gt;
Commands/features:&lt;br /&gt;
	Enabled	Supported:&lt;br /&gt;
	   *	READ BUFFER cmd&lt;br /&gt;
	   *	WRITE BUFFER cmd&lt;br /&gt;
	   *	Host Protected Area feature set&lt;br /&gt;
	   *	Look-ahead&lt;br /&gt;
	   *	Write cache&lt;br /&gt;
	   *	Power Management feature set&lt;br /&gt;
		Security Mode feature set&lt;br /&gt;
	   *	SMART feature set&lt;br /&gt;
	   *	Mandatory FLUSH CACHE command &lt;br /&gt;
	   *	Device Configuration Overlay feature set &lt;br /&gt;
	   *	Automatic Acoustic Management feature set &lt;br /&gt;
	   *	SET MAX security extension&lt;br /&gt;
		Power-Up In Standby feature set&lt;br /&gt;
	   *	Advanced Power Management feature set&lt;br /&gt;
	   *	DOWNLOAD MICROCODE cmd&lt;br /&gt;
	   *	SMART self-test &lt;br /&gt;
	   *	SMART error logging &lt;br /&gt;
Security: &lt;br /&gt;
		supported&lt;br /&gt;
	not	enabled&lt;br /&gt;
	not	locked&lt;br /&gt;
		frozen&lt;br /&gt;
	not	expired: security count&lt;br /&gt;
	not	supported: enhanced erase&lt;br /&gt;
	40min for SECURITY ERASE UNIT. &lt;br /&gt;
HW reset results:&lt;br /&gt;
	CBLID- above Vih&lt;br /&gt;
	Device num = 0 determined by the jumper&lt;br /&gt;
Checksum: correct&lt;br /&gt;
[root@R1 ~]#&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On y retrouve le modèle, le numéro de série et la version du firmware qui peuvent être utiles en cas de contact avec le Service Après-Vente ou de mise à jour pour une série de firmwares défaillante.&lt;br /&gt;
&lt;br /&gt;
La ligne commençant par « DMA » dans la partie « Capabilities » permet d&#039;afficher la vitesse de transfert négociée entre le disque dur et le driver IDE de Linux. L&#039;étoile précède la valeur actuelle. Dans cet exemple, le mode udma5 est sélectionné : ceci est conforme aux machines disponibles sur le marché depuis environ 3 ans.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, voici le tableau de conversion entre le mode DMA et la vitesse maximale associée.&lt;br /&gt;
&lt;br /&gt;
{|border=1|&lt;br /&gt;
||Type de fonctionnement|||Vitesse Maximale en MO/sec&lt;br /&gt;
|-&lt;br /&gt;
||UltraDMA 0|||16,6&lt;br /&gt;
|-&lt;br /&gt;
||UltraDMA 1||25&lt;br /&gt;
|-&lt;br /&gt;
||UltraDMA 2||33,3&lt;br /&gt;
|-&lt;br /&gt;
||UltraDMA 3||44,4&lt;br /&gt;
|-&lt;br /&gt;
||UltraDMA 4||66,6&lt;br /&gt;
|-&lt;br /&gt;
||UltraDMA 5||100&lt;br /&gt;
|-&lt;br /&gt;
||UltraDMA 6||133,33&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Une configuration actuelle ne devrait pas être en dessous de UDMA5. Si ce n&#039;était pas le cas, on peut essayer de renégocier la vitesse de transfert à l&#039;aide de la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hdparm -X udma5 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celle-ci permet de forcer le mode UltraDMA5. Il faut utiliser cette commande avec précaution car elle pourrait générer des pertes ou de la corruption de données en cas de transfert pendant ce changement de mode.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi impacter les performances de votre disque dur en modifiant sa vitesse de rotation. Cette fonctionnalité connue sous le nom de Automatic Acoustic Management (AAM) est utilisable avec l&#039;option « -M » de hdparm. La valeur 128 représentera la vitesse la plus faible avec un disque silencieux, la valeur 254 la vitesse la plus élevée mais avec comme contre-partie un disque plus bruyant. On pourra noter des différences de quelques Mo/sec selon les configurations.&lt;br /&gt;
&lt;br /&gt;
Il est aussi à noter que l&#039;utilisation de logiciels permettant une meilleure gestion d&#039;énergie (cpufreq, laptop-mode) peut dégrader les performances d&#039;un disque dur de manière notable.&lt;br /&gt;
&lt;br /&gt;
=== Configuration bas niveau du réseau ===&lt;br /&gt;
&lt;br /&gt;
Le réseau local filaire peut parfois être un peu lent. Voici quelques tests pour vérifier si la lenteur provient du logiciel, du noyau ou du matériel. Tout d&#039;abord, explorons la trousse à outils indispensable pour analyser votre carte réseau : ethtool. Digne successeur de mii-tool, il permet de s&#039;informer sur la configuration de votre carte réseau. &lt;br /&gt;
&lt;br /&gt;
Il suffit de lancer « ethtool &amp;lt;votre_interface&amp;gt; » » pour obtenir la configuration matérielle de votre carte. On y retrouve les modes supportés par votre carte (Supported Link Modes ainsi que la vitesse actuelle (Speed), obtenue par auto-négociation dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
On peut également savoir si le câble réseau est connecté à la carte grâce à la ligne « Link Detected ». Le type de « duplex » utilisé permet également de savoir si la négociation avec l&#039; élément actif au bout de votre câble (commutateur, concentrateur ou une autre machine) a correctement fonctionné. Le duplex définit le mode de  transmission : le mode half-duplex indique que l&#039;on émet puis on reçoit des données, le mode full-duplex indique que l&#039;on peut émettre et recevoir en même temps des données. Le mode full-duplex est donc plus que recommandé pour vos équipements réseaux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# ethtool  eth1&lt;br /&gt;
Settings for eth1:&lt;br /&gt;
	Supported ports: [ TP MII ]&lt;br /&gt;
	Supported link modes:   10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Supports auto-negotiation: Yes&lt;br /&gt;
	Advertised link modes:  10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Advertised auto-negotiation: Yes&lt;br /&gt;
	Speed: 100Mb/s&lt;br /&gt;
	Duplex: Full&lt;br /&gt;
	Port: MII&lt;br /&gt;
	PHYAD: 1&lt;br /&gt;
	Transceiver: internal&lt;br /&gt;
	Auto-negotiation: on&lt;br /&gt;
	Current message level: 0x000020c1 (8385)&lt;br /&gt;
	Link detected: yes&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesurer les {contre}performances de votre réseau ===&lt;br /&gt;
&lt;br /&gt;
Une fois vérifiée la bonne configuration de votre matériel, nous pouvons passer à la vérification des performances entre deux machines.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire netpipe (http://www.scl.ameslab.gov/netpipe/) permet de réaliser des tests de performance mais aussi d&#039;intégrité entre deux machines. Il permet de tester les performances du réseau au travers la couche IP et non pas depuis un mode plus bas niveau comme pourrait l&#039;être un test utilisant directement le driver Ethernet. Ce test permet donc de valider que la configuration matérielle mais aussi logicielle est correcte.&lt;br /&gt;
&lt;br /&gt;
Sur la première machine, exécutez « NPtcp » : netpipe se positionne en mode « serveur ».&lt;br /&gt;
Sur la seconde machine, exécutez « NPtcp -h &amp;lt;machine1&amp;gt; » : netpipe se connecte au serveur netpipe de la machine nommée machine1 pour effectuer le test de performance.&lt;br /&gt;
&lt;br /&gt;
Le test par défaut teste les communication allant de 1 octet jusqu&#039;à 8 Mo. Il peut prendre plusieurs minutes si le réseau est « lent ». Le test va montrer pour chaque taille de paquet la performance obtenue. Il est normal d&#039;obtenir des performances faibles pour des paquets d&#039;une taille inférieure à 8 Ko. Transporter des petits paquets nécessite de réaliser beaucoup d&#039;opérations pour le processeur pour une quantité d&#039;information minime. Les performances seront meilleures à partir d&#039;environ 16 Ko et maximales à partir de 128 Ko. Sur un système utilisant du gigabit ethernet, on constatera une performance de 39Mbps à 256 octets, 287Mbps à 4Ko, 614Mbps à 16Ko, 845Mbps à 128Ko, 895Mbps à 8Mo.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ainsi vérifier et comparer facilement les performances de votre configuration réseau. Netpipe permet également de tester la vitesse du réseau pour une taille de paquets définie entre la taille indiqué par l&#039;option « -l » et la taille indiquée par l&#039;option « -u ». Ainsi, NPtcp -l 16384 -u 16384 permet de tester la bande passante réseau pour une taille de paquet égale à 16Ko.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -n &amp;lt;nb-cycle&amp;gt; » permet de définir le nombre de boucles à réaliser pour le test (50 par défaut). Enfin, pour réaliser des tests « full-duplex », on utilisera l&#039;option « -2 ». Ce test permet de s&#039;assurer du bon fonctionnement du mode de communication permettant l&#039;écriture et la lecture simultanées.&lt;br /&gt;
&lt;br /&gt;
Attention, même si ce test donne de bons résultats, cela ne veut pas dire que la configuration est exempte d&#039;erreur de configuration. Par exemple, les performances réseaux peuvent être très bonnes en point à point mais mauvaises lorsque l&#039;on aura une charge réseau avec plusieurs clients. Dans cette situation, il faut vérifier que le contrôle de flux est bien activé sur toutes les machines. L&#039;option « ethtool -a » permet de vérifier que les champs « rx » et « tx » sont placés sur « on ». Si ce n&#039;était pas le cas activez-les avec la commande « ethtool -A eth0 rx on » et « ethtool -A eth0 tx on ».&lt;br /&gt;
&lt;br /&gt;
Les cartes réseaux, des serveurs essentiellement, permettent maintenant de réaliser le « tcp segment offload ». Cette technique permet de décharger une partie du traitement TCP directement dans l&#039;électronique de la carte réseau. Ceci à pour effet de décharger le processeur central d&#039;un traitement fastidieux. L&#039;option « -k » d&#039;ethtool permet de consulter l&#039;état de cette fonctionnalité (off/on). On pourra l&#039;activer sur des serveurs générant un gros trafic réseau par exemple : « ethtool -K eth0 tso on ».&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant équipé de nouveau outils pour traquer la perte de performances de votre installation réseau. Ceci couplé aux habituels tcpdump/ethereal, voilà une belle panoplie du zorro du réseau.&lt;br /&gt;
&lt;br /&gt;
=== Quand la latence s&#039;en mêle ===&lt;br /&gt;
&lt;br /&gt;
La latence représente le temps nécessaire à un système pour prendre en compte un événement.&lt;br /&gt;
&lt;br /&gt;
Il arrive que certains périphériques de votre machine nécessitant des débits importants ou une latence assez faible sur le bus PCI soient « poussifs ». On retrouve dans cette catégorie les cartes vidéos accélératrice 3D, les cartes son et les cartes d&#039;acquisition firewire ou DVB (récepteur de télévision numérique terrestre : TNT).&lt;br /&gt;
&lt;br /&gt;
Un périphérique branché sur le bus PCI doit attendre que le bus soit libre pour émettre les données vers la mémoire centrale. Le bus PCI qui est le coeur de communication des périphériques est donc soumis en permanence à un arbitrage qui permet de décider qui doit émettre des données et qui doit attendre. Cet arbitrage est en partie réalisé grâce au « latency_timer ».&lt;br /&gt;
&lt;br /&gt;
Chaque périphérique possède une valeur de « latency_timer » comprise en 0 et 248 cycles d&#039;horloge du bus. Plus la valeur sera importante plus le périphérique disposera de temps pour transmettre des informations. Une latence de 248 cycles permet d&#039;obtenir une priorité forte sur le bus, ce qui permet un débit important. A contrario, une latence de 0 indiquera au périphérique qu&#039;il doit cesser ses transmissions si un autre composant à besoin du bus : ceci se traduira par une perte de bande passante importante.&lt;br /&gt;
&lt;br /&gt;
La configuration réalisée par défaut sur votre machine doit être correcte mais il peut arriver qu&#039;une carte 3D ou DVB soit configurée avec une latence trop faible, ce qui  aurait pour conséquence d&#039;offrir une image saccadée et peu fluide. Une carte son offrirait également le même type de symptômes avec un son hâché ou excessivement métallique.&lt;br /&gt;
&lt;br /&gt;
Heureusement, une série d&#039;outils est là pour vous aider à diagnostiquer le problème mais aussi à le résoudre. Le projet pciutils  (http://atrey.karlin.mff.cuni.cz/~mj/linux.shtml#pciutils) contient deux outils indispensables: lspci et setpci. Bien entendu, votre distribution favorite devrait posséder ce logiciel, il vous suffira de l&#039;installer avec  votre gestionnaire de paquet favori (urpmi, apt, smart).&lt;br /&gt;
&lt;br /&gt;
La commande « lspci » vous permet de lister les périphériques PCI disponibles sur votre ordinateur (cf article paru dans le numéro 68).  Cet exemple se basera sur une carte vidéo  ayant pour adresse sur le bus PCI « 01:00.0 ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@lagirafe] lspci -v -s 01:00.0&lt;br /&gt;
01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go5200 32M/64M] (rev a1) (prog-if 00 [VGA])&lt;br /&gt;
	Subsystem: Samsung Electronics Co Ltd: Unknown device c00f&lt;br /&gt;
	Flags: bus master, 66Mhz, medium devsel, latency 16, IRQ 11&lt;br /&gt;
	Memory at c8000000 (32-bit, non-prefetchable) [size=16M]&lt;br /&gt;
	Memory at d8000000 (32-bit, prefetchable) [size=128M]&lt;br /&gt;
	Expansion ROM at &amp;lt;unassigned&amp;gt; [disabled] [size=128K]&lt;br /&gt;
	Capabilities: [60] Power Management version 2&lt;br /&gt;
	Capabilities: [44] AGP version 3.0&lt;br /&gt;
[root@lagirafe]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On retiendra dans cette ligne, la valeur &#039;latency 16&#039;. Ceci risque de poser problème lorsque celle-ci aura besoin d&#039;un fort débit pendant un jeu par exemple. Augmenter la latence va donc se révéler nécessaire pour ce périphérique.&lt;br /&gt;
&lt;br /&gt;
La commande setpci permet de modifier les paramètres PCI d&#039;un périphérique ou d&#039;un bus complet avec tous ses périphériques. &lt;br /&gt;
&lt;br /&gt;
La commande « setpci -v -d 01:* latency_timer=20 » permet de positionner tous les périphériques  du bus 01 à une valeur de 32 cycles. Il est à noter que la commande setpci utilise des valeurs en hexadécimal mais lspci affichera les valeurs en décimal.&lt;br /&gt;
&lt;br /&gt;
Pour en revenir à nos moutons, la correction de la latence de cette carte graphique se fera avec la commande «  setpci -v -d 01:00.0 latency_timer=f8 ». Ceci positionne donc la carte sur la plus grande valeur de latence possible, ce qui lui garantira la plus grande bande passante possible. Il est possible d&#039;utiliser la valeur « ff » comme paramètre pour « latency_timer » mais celui-ci sera converti à la volée par la commande setpci en « 0xf8 ».&lt;br /&gt;
&lt;br /&gt;
Attention, certains composants de votre machine doivent rester en « latency_timer=0 » pour garantir une bon fonctionnement de votre système : il ne faudra donc pas modifier les latences des contrôleurs mémoire et des ponts PCI connectés généralement sur le bus « 0:* ».&lt;br /&gt;
&lt;br /&gt;
== DSDT : le cauchemar continue ! ==&lt;br /&gt;
&lt;br /&gt;
Cette partie de l&#039;article a pour but d&#039;expliquer le problème que peut représenter la table DSDT pour un certain nombre de machines et surtout les ordinateurs portables. &lt;br /&gt;
&lt;br /&gt;
La norme ACPI 3.0 de Septembre 2004 disponible gratuitement à l&#039;adresse http://www.acpi.info/DOWNLOADS/ACPIspec30.pdf définit la DSDT comme une table remplie par un OEM permettant au système d&#039;exploitation de découvrir les ressources pour la gestion de l&#039;énergie avancée, de la gestion thermique ainsi que la gestion du Plug&#039;nPlay des ressources définies par l&#039;ACPI.&lt;br /&gt;
&lt;br /&gt;
Voici une description certes un peu théorique mais nécessaire pour bien comprendre la problématique et ses conséquences. Le constructeur de l&#039;ordinateur doit donc définir dans le BIOS une table contenant une liste de ressources et leurs configuration et ce pour que le système d&#039;exploitation puisse s&#039;en servir. Noble cause n&#039;est il pas ? Tout au long des 618 pages de ce document sont spécifiés les éléments du langage à utiliser ainsi que sa syntaxe. L&#039; « ACPI Source Language » permettra donc aux développeurs d&#039;écrire des DSDT puis de les compiler dans un format nommé « ACPI Machine Language » en utilisant un compilateur adéquat. Le système d&#039;exploitation utilisera la table compilée (AML) pour accéder aux ressources ACPI. &lt;br /&gt;
Sur la plupart des ordinateurs portables, la table DSDT ne respecte pas la norme ACPI dans sa syntaxe. Ceci est très gênant car cela bloque le code de l&#039;interpréteur ACPI du noyau Linux qui essaie de la lire. Le résultat est sans appel, pas d&#039;ACPI, pas de gestion d&#039;énergie avancée, plus de ventilation automatique sur certains modèles d&#039;ordinateurs, plus de touche de gestion de contraste/luminosité sur d&#039;autres etc...&lt;br /&gt;
&lt;br /&gt;
Ceci est très gênant sur un ordinateur portable. Alors que faire ? Dans un premier temps, prévenir le constructeur que son BIOS est incorrect et ne respecte pas la norme ACPI. La réponse se fait toujours attendre pour tous ceux qui « osent » poser la question au support technique : à savoir, les constructeurs ignorent tout simplement les mails de ce type.&lt;br /&gt;
La seconde étape puisque vous êtes devant le fait accompli d&#039;une machine non conforme, il va falloir corriger cette table. Il suffit de récupérer la table actuelle via la commande &#039;cat /proc/acpi/dsdt &amp;gt; dsdt.aml&#039; si vous avez la chance d&#039;avoir un répertoire /proc/acpi malgré une table DSDT endommagée, sinon utilisez la commande &#039;acpidump -b -t dsdt -o dsdt.aml&#039;. La commande acpidump est  fournit dans le projet pmtools (ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools-20050926.tar.bz2) &lt;br /&gt;
Vous avez donc extrait la table DSDT de votre système. Il ne reste plus qu&#039;à essayer de la recompiler. Pour cela, le compilateur IASL de la société Intel (http://developer.intel.com/technology/iapc/acpi/downloads.htm) offre sous Linux et Windows une plate-forme de compilation pour le langage ASL.&lt;br /&gt;
&lt;br /&gt;
Suivez les instructions du site pour télécharger et compiler la version unix d&#039;iasl. Ensuite, décompilez la table avec la commande « iasl -d dsdt.aml ». Le fichier dsdt.dsl vient d&#039;être créé par le décompilateur. Il suffit de le recompiler avec la commande « iasl -tc dsdt.dsl » pour constater les dégâts ! La DSDT que vous avez dans votre BIOS est généralement compilée par le compilateur de Microsoft qui semble autoriser une syntaxe plus qu&#039;approximative.&lt;br /&gt;
Si vous avez de la chance, votre DSDT s&#039;est recompilée sans erreurs, vous obtenez donc un fichier dsdt.hex et un fichier dsdt.aml. Il ne reste plus qu&#039;à injecter cette dsdt dans le noyau Linux et le tour sera joué.&lt;br /&gt;
&lt;br /&gt;
Si vous avez moins de chance, votre DSDT est syntaxiquement incorrecte et génère des erreurs. Les expliquer plus en détails nécessiterait un article complet, il ne sera cité que les plus « habituelles » (sic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2626:                     Field (ECR, DWordAcc, Lock, Preserve) &lt;br /&gt;
Error    1048 -                              ^ Host Operation Region requires ByteAcc access &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette erreur présente à ligne 2626 du fichier dsdt.asl indique une erreur de type dans la déclaration du champ ECR. Il suffit dans ce cas de changer le mot « DWordAcc » par « ByteAcc ». Celle-ci reste assez simple à corriger, on se demande donc pourquoi les constructeurs ne prennent pas le temps de vérifier et de corriger leur BIOS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2672:                     Method (_GLK, 1, NotSerialized) &lt;br /&gt;
Warning  2024 -                                ^ Reserved method has too many arguments ( _GLK requires 0) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode _GLK n&#039;a besoin que de 0 paramètre tandis que ce code en utilise 2 ! La correction est assez simple : il suffit de remplacer la ligne 2672 par « Method(_GLK) ».&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur la correction des erreurs de compilation de votre table dsdt, je vous recommande les tutoriaux disponibles depuis la page http://acpi.sourceforge.net/dsdt/index.php du projet ACPI.&lt;br /&gt;
&lt;br /&gt;
Votre DSDT est compilée avec succès, il ne vous reste plus qu&#039;à l&#039;ajouter pour que votre noyau puisse l&#039;utiliser à la place de celle fourni par le BIOS (modifiable uniquement par le constructeur, via une mise à jour).&lt;br /&gt;
&lt;br /&gt;
Il existe trois possibilités pour inclure une table DSDT : la modification du noyau Linux ( noyau &amp;lt; 2.6.9), l&#039;injection de la DSDT dans la configuration du noyau (noyau &amp;gt;= 2.6.9), l&#039;intégration de la table DSDT dans l&#039;initrd qui nécessite un patch kernel disponible à l&#039;adresse http://gaugusch.at/kernel.shtml.&lt;br /&gt;
&lt;br /&gt;
Pour les noyaux 2.6.9 et supérieur, copiez votre fichier dsdt.hex sous le nom «/usr/src/linux/include/acpi/dsdt_table.h » puis reconfigurez votre noyau.&lt;br /&gt;
Insérer « dsdt_table.h » dans l&#039;option « Include you custom DSDT » disponible dans le menu « Power Management/ACPI/ ». Recompilez votre noyau et redémarrez avec votre nouveau noyau.&lt;br /&gt;
Pour les noyaux inférieurs à 2.6.9, il est possible de modifier le code source de votre noyau pour intégrer votre DSDT mais il est préférable d&#039;utiliser le patch permettant l&#039;insertion de la table DSDT dans l&#039;initrd. Recompilez votre noyau avec ce patch, puis suivez la procédure décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Certaines distributions Linux comme « Mandriva Linux » possèdent le patch qui permet de n&#039;avoir qu&#039;à reconstruire l&#039;initrd avec la commande « mkinitrd –dsdt=/boot/dsdt.aml /boot/initrd-`uname -r`.img `uname -r`  » puis de relancer lilo avant de redémarrer votre machine. Lors du démarrage de celle-ci vous devriez voir le message suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ACPI: Looking for DSDT in initrd... found (at offset 0x4f8d9).&lt;br /&gt;
ACPI-0294: *** Info: Table [DSDT] replaced by host OS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant avec une table DSDT correcte et un ACPI fonctionnel. La question qui reste ouverte est pourquoi les constructeurs n&#039;utilisent pas un compilateur digne de ce nom pour permettre à leur clients de pouvoir utiliser d&#039;autres systèmes d&#039;exploitation que Windows de Microsoft. &lt;br /&gt;
&lt;br /&gt;
Pour la petite histoire, si vous cherchez dans votre dsdt vous risquez de tomber ce genre de lignes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows NT&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft WindowsME: Millennium Edition&amp;quot;), Zero))&lt;br /&gt;
 If (LEqual (SizeOf (\_OS), 0x27)) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque qu&#039;un système d&#039;exploitation souhaite utiliser les ressources ACPI du BIOS, il utilise son nom de système d&#039;exploitation (acpi_os_name). On retrouve donc dans les bios des parties qui ne seront exécutées que pour certains systèmes d&#039;exploitation de Microsoft. On retrouve même certains tests où c&#039;est la longueur du nom qui compte...... Ceci prouve bien que les constructeurs d&#039;ordinateurs savent corriger des tables DSDT pour les systèmes d&#039;exploitation mais pas forcément pour le notre malheureusement. Depuis le noyau 2.6.9, le noyau Linux utilise « Windows NT » comme « acpi_os_name »  pour assurer une meilleure compatibilité matérielle dixit Len Bron d&#039;Intel dans le changelog de cette version.&lt;br /&gt;
&lt;br /&gt;
== Comment trouver le pilote qui va avec votre matériel ? ==&lt;br /&gt;
&lt;br /&gt;
Cette question on se la pose souvent mais uniquement lorsque l&#039;on essaye de brancher un nouveau périphérique sur sa machine. Les distributions récentes permettent de détecter automatiquement votre matériel et de lui associer un pilote avec sa configuration. Ce mécanisme fonctionne plutôt bien mais cela n&#039;évite pas les dysfonctionnements voir l&#039;absence de fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Pour vérifier si votre noyau Linux est capable de supporter un nouveau périphérique PCI par exemple, il suffit d&#039;en récupérer les identifiants PCI (constructeur et produit) puis de les rechercher dans le fichier « /lib/modules/`uname -r`/modules.pcimap » qui est auto-généré lors de la commande depmod.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire « lspcidrake -v » vous permet de trouver les identifiants PCI de votre carte, la commande « lspci » vous permet de trouver le nom de votre périphérique puis faites un « lspci -n » pour en trouver la correspondance numérique. On utilisera la position du périphérique sur le bus pour retrouver la correspondance numérique « 02:05.0 » dans cet exemple.&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome] lspci&lt;br /&gt;
[....]&lt;br /&gt;
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)&lt;br /&gt;
[root@pumphome] lspci -n&lt;br /&gt;
[...]&lt;br /&gt;
02:05.0 Class 0200: 14e4:4401 (rev 01)&lt;br /&gt;
[root@pumphome]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi cette carte réseau possède les identifiants 14e4 (constructeur) et 4401 (produit). Il suffit de rechercher cette valeur dans le modules.pcimap, ce qui nous donnera la correspondance en module (pilote).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome]  grep &amp;quot;0x000014e4 0x00004401&amp;quot; /lib/modules/2.6.12-12mdk-i686-up-4GB/modules.pcimap &lt;br /&gt;
b44               0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
bcm4400      0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit ici que cette carte peut utiliser le driver b44 ou le driver bcm4400. On ne trouve pas toujours les identifiants PCI de produit sous leur forme directe, on peut également trouver « 0Xffffffff » qui indique que tous les cartes du constructeur sont gérées par un module.&lt;br /&gt;
Il ne vous restera plus qu&#039;à effectuer la configuration associée à ce périphérique pour qu&#039;il fonctionne correctement.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
La fin de cet article conclut une toute petite série de deux articles ayant pour but de vulgariser l&#039;architecture de nos machines, de découvrir les outils disponibles pour mieux comprendre leur configuration et au besoin régler les problèmes de configuration matérielle qui ont souvent le don de nous pourrir la vie.&lt;br /&gt;
&lt;br /&gt;
Merci à LaurentJ de #Mandrivafr pour ses tests complémentaires sur les problèmes d&#039;IO-APIC. Un énorme merci à Nicolas Planel pour sa relecture pointue et également Anne pour sa patience de girafe à relire et « quaurigé »mes « photes »,  ainsi qu&#039;à tous ceux qui m&#039;ont aidé à découvrir ce que je restitue dans cet article.&lt;br /&gt;
&lt;br /&gt;
Erwan Velu&lt;br /&gt;
&lt;br /&gt;
Cet article a été publié dans Linux Magazine France n°78. Il est publié sur Léa avec l&#039;aimable autorisation de l&#039;éditeur.&lt;br /&gt;
&lt;br /&gt;
= Copyright =&lt;br /&gt;
&lt;br /&gt;
{{LDL}}&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Lea_Linux:Les_nouvelles&amp;diff=12785</id>
		<title>Lea Linux:Les nouvelles</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Lea_Linux:Les_nouvelles&amp;diff=12785"/>
		<updated>2006-06-11T20:41:54Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Les nouvelles de Léa */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--Cette page n&#039;est pas destinée à être éditée--&amp;gt;&lt;br /&gt;
=== Les nouvelles de Léa ===&lt;br /&gt;
; [[Hardware-hard_plus-matos_bis|Découvrez votre configuration matérielle, la suite]] : Erwan vous propose la suite de l&#039;article vous permettant de partir à la découverte de votre configuration matérielle&lt;br /&gt;
; [[HOWTO_Dkms|HowTo DKMS]] : Découvrez DKMS et simplifiez-vous la gestion des pilotes sur Linux avec Pascal Terjan&lt;br /&gt;
; [[Trucs:Passer à X11R7 (gentoo)]] : passer de la version monolithique à la version modulaire de votre serveur X&lt;br /&gt;
; [[Créer un point d&#039;accès sécurisé avec hostAPd]] : configuration d&#039;une carte Wifi en point d&#039;accès.&lt;br /&gt;
; [[Trucs:Utiliser les boutons de son scanneur|Utiliser les boutons de son scanneur]] : comment utiliser les boutons des scanners actuels&lt;br /&gt;
; [[Tunnels ethernet avec openssh]] : [[Utilisateur:Misc|Misc]] nous explique comment configurer des tunnels ssh avec openssh 4.3&lt;br /&gt;
; [[Hardware-hard_autres-clavier_multimedia#xev_ne_r.C3.A9agit_pas_.C3.A0_vos_touches|Clavier multimedia]] : une mise à jour spécifique aux claviers récalcitrants qui ne veulent rien dire à &amp;lt;code&amp;gt;xev&amp;lt;/code&amp;gt;&lt;br /&gt;
; [[Utiliser la carte wifi Intel PRO Wireless 2200BG]] : accéder à un réseau Wifi avec cette carte Intel.&lt;br /&gt;
; [[Trucs:Correction_orthographique_dans_votre_navigateur|Correction orthographique dans votre navigateur]] : Comment éviter de faire des fautes dans les forums.&lt;br /&gt;
; [[Epson Perfection 3490]] : [[Utilisateur:Martin.riondet|Martin.riondet]] nous explique comment paramétrer ce scanner.&lt;br /&gt;
; [[Utiliser groff]] : Marc Ujma nous fait une petite introduction à cet outil méconnu qu&#039;est groff.&lt;br /&gt;
; [[Lea_Linux:AG 2005]] : L&#039;assemblée générale des adhérents de Léa aura lieu le samedi 3 Décembre 2005.&lt;br /&gt;
; [[Attributs étendus]] : une introduction aux attributs étendus disponibles sur certain système de fichiers par [[Utilisateur:Vincent Ramos|Vincent Ramos]].&lt;br /&gt;
; [[Gestion des ACL]] : une introduction à la gestion des ACL (Access Control List)&lt;br /&gt;
; [[Fiches:Windows-ficheoffice|Lire ses documents Office]] : une nouvelle fiche pratique par AlSim.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12784</id>
		<title>Découvrez les ressources de votre machine (La suite)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12784"/>
		<updated>2006-06-11T20:37:25Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Les plus du matériel]]&lt;br /&gt;
= Découvrez les ressources de votre machine (La suite) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A nouvelle année, nouvelles résolutions ! Paru dans le numéro 68, un premier article dédié à la découverte des outils disponibles pour la récupération des configurations de votre machine promettait une suite.  Je vous propose donc de reprendre ce voyage au centre de votre ordinateur. &lt;br /&gt;
&lt;br /&gt;
Cet article sera articulé autour du diagnostic de pannes et des correctifs associés mais aussi de « trucs &amp;amp; astuces » permettant d&#039;optimiser votre configuration.&lt;br /&gt;
&lt;br /&gt;
== Savez-vous planter les choux ? ==&lt;br /&gt;
&lt;br /&gt;
Les choux peut-être pas mais les ordinateurs je pense que c&#039;est arrivé au moins une fois à chaque lecteur qui lit cet article. Rien de plus énervant qu&#039;un écran qui se fige, le pointeur de souris qui ne se déplace plus, le clavier qui ne répond plus non plus.... Planté ! Ce constat est assez facile à établir mais en trouver la cause reste un problème nettement plus complexe tellement le nombre de causes possibles est important.&lt;br /&gt;
&lt;br /&gt;
Deux solutions : ignorer le problème et relancer le système en se disant que ça « passera », ou alors chercher la cause du problème en essayant de trouver une méthode reproduisant le « plantage » tant redouté.&lt;br /&gt;
&lt;br /&gt;
La première solution fonctionne assez bien mais si l&#039;on à faire à un « vrai » problème de configuration matérielle ou logicielle, on arrivera assez vite à ne plus pouvoir éviter la seconde voire la troisième. J&#039;allais oublier cette troisième solution destinée aux plus riches d&#039;entre vous : changer de matériel. Cette solution coûteuse peut parfois se révéler efficace, parfois pas du tout. A quoi bon changer un composant sans savoir si c&#039;était bien celui-ci qui posait problème ?&lt;br /&gt;
Quelque soit la solution retenue, il sera de toute manière nécessaire de localiser la panne pour y apporter la réponse adéquate. Certaines sociétés ou particuliers se sont spécialisés dans ce dépannage ou l&#039;utilisateur est « dépassé » par les événements.&lt;br /&gt;
&lt;br /&gt;
Cet article vous fera, je l&#039;espère, découvrir quelques outils et méthodes pour valider un par un les composants de votre ordinateur. Cela vous permettra j&#039;espère d&#039;être un peu moins dépourvu quand un problème surviendra. L&#039;article reproduira les étapes qu&#039;il faut suivre pour isoler le « fautif ».&lt;br /&gt;
&lt;br /&gt;
== Les causes possibles d&#039;un « plantage » ==&lt;br /&gt;
&lt;br /&gt;
On retrouve deux grandes catégories de pannes provoquant des dysfonctionnements importants sur un système informatique.&lt;br /&gt;
* une panne du matériel&lt;br /&gt;
* une erreur logicielle au niveau du noyau et des pilotes (drivers)&lt;br /&gt;
&lt;br /&gt;
Il faudra donc être capable de séparer la panne matérielle qui « force » l&#039;ordinateur à entrer dans un mode de fonctionnement non prévu et instable, de l&#039;erreur logicielle qui équivaut à demander à l&#039;ordinateur de faire « n&#039;importe quoi » et qui va donc se « planter ».&lt;br /&gt;
&lt;br /&gt;
Le terme « planté » utilisé ici équivaut à un arrêt du système à cause d&#039;erreurs sévères : instruction illégale ou composants défaillants. Le terme de « plantage » est aussi utilisé pour décrire le fonctionnement d&#039;une application qui se ferme inopinément. Ce cas est plus souvent lié à une erreur de programmation de l&#039;application qu&#039;à une erreur du système. Nous ne parlerons donc pas de ce second cas dans cet article.&lt;br /&gt;
&lt;br /&gt;
== La mémoire qui flanche ? ==&lt;br /&gt;
&lt;br /&gt;
Une cause « classique » des dysfonctionnements se situe au niveau de la gestion de la mémoire de votre machine. Je ne parle pas d&#039;allocation mémoire réalisée par votre système d&#039;exploitation favori mais bien de la manière avec laquelle la carte mère configure et utilise vos barrettes de mémoire. Les applications chargent en mémoire des données et des instructions destinées au processeur. Voici un scénario qui peut provoquer l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Votre application favorite est lancée depuis la ligne de commande ou une interface graphique via un « clic » de souris. Votre système d&#039;exploitation va donc charger ce programme en mémoire puis en exécuter les instructions. Au plus bas niveau de votre système, le processeur exécute des instructions en langage machine (assembleur) présente en mémoire.&lt;br /&gt;
Malheureusement, votre mémoire est défaillante et elle n&#039;arrive pas à maintenir un état stable des informations qui lui sont confiées. Par exemple, la lettre C est représentée par le code 67, ou « 1000011 » en binaire. Si la zone mémoire change d&#039;état, alors le contenu de la valeur stocké à cet endroit changera : on pourrait se retrouver avec « 1000010 ». Un seul bit a changé, mais on passe de la lettre &#039;C&#039; (67) à la lettre &#039;B&#039;(66). Le résultat ne se fait pas attendre, le processeur se retrouve à exécuter des instructions qui n&#039;ont plus de sens, provoquant l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Les pannes de mémoires sont généralement dues à des composants endommagés, des barrettes incompatibles ou un  « timing d&#039;accès » à la mémoire (nommé CAS (Column Address Strobe) dans la plupart des BIOS) trop agressif permettant des lectures dans des zones mémoires avant que les écritures aient eu le temps de se stabiliser pour en garantir le contenu.&lt;br /&gt;
&lt;br /&gt;
Il est assez simple de valider votre configuration mémoire grâce à l&#039;utilitaire memtest (http://www.memtest.org). Cet utilitaire de taille très modeste, 96 Kilo-octets, est écrit en assembleur ce qui lui permet de s&#039;exécuter indépendamment du système d&#039;exploitation. Ceci garantit un test « proche » du matériel, sans sur-couche pouvant apporter d&#039;autres problèmes. &lt;br /&gt;
La version 1.65 actuelle est téléchargeable sous deux formes : une iso que l&#039;on peut graver sur un CDRW de préférence vu la petite taille du programme ou sous la forme d&#039;une amorce système (pre-compiled bootable binary). Il suffira de décompresser l&#039;archive puis d&#039;exécuter la commande suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;dd if=memtest.bin of=/dev/fda&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Ceci écrasera le contenu de votre disquette pour y  copier memtest. &lt;br /&gt;
Rebootez l&#039;ordinateur avec la disquette placée dans le lecteur, memtest devrait se lancer. &lt;br /&gt;
&lt;br /&gt;
[[Image:memtest.jpg]]&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus, est une capture d&#039;écran de memtest en fonctionnement. Le barre de progression principale affichée en haut à droite de l&#039;écran (2% dans cet exemple) permet de suivre la progression du test. Les erreurs apparaissent dans la partie inférieure de l&#039;écran. Il suffit de laisser fonctionner memtest au moins une fois jusqu&#039;à 100%. Si aucune ligne ne s&#039;est affichée alors vou pouvez considérer que la mémoire est fonctionnelle. Dans le cas contraire,  il faudra soit procéder à son remplacement s&#039;il s&#039;agit d&#039;une seule barrette mémoire, soit tester les barrettes indépendamment (l&#039;une puis l&#039;autre) avec ce logiciel. Dans le cas de 2 ou 3 barrettes qui ne fonctionnement pas correctement ensemble mais qui fonctionnement correctement individuellement, il faudra vérifier qu&#039;elles sont bien de même modèle/marque et remettre le Bios dans une configuration initiale.&lt;br /&gt;
&lt;br /&gt;
Votre mémoire est bonne ? Testons les autres composants de votre machine pour traquer la source de ce plantage.&lt;br /&gt;
&lt;br /&gt;
== Il ne fait pas un peu chaud là ? ==&lt;br /&gt;
&lt;br /&gt;
Ces dix dernières années la puissance consommée et dissipée par nos ordinateurs a littéralement explosé ! Du 486 qui ne nécessitait quasiment pas de ventilateur, on est arrivé à des stations de travail/jeu avec des alimentations pouvant atteindre 1KiloWatt pour les dernières et 500watt pour des modèles plus « grand public ». Le processeur est un des composants gourmands de la machine. Certains modèles peuvent consommer plus de 130W ! Autant dire que si le système est mal ventilé, la montée en charge du processeur peut provoquer un échauffement important provoquant une surchauffe de celui-ci. S&#039;il dépasse ces caractéristiques de fonctionnement, il va alors exécuter du code incorrect provocant  un plantage du système.&lt;br /&gt;
&lt;br /&gt;
Un bon test pour vérifier que votre processeur n&#039;est pas la cause de votre instabilité : commencez par relever la température de votre machine au repos à l&#039;aide des informations fournies soit par l&#039;acpi soit pas lm_sensors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[erwan@R1 ~]$ cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             42 C&lt;br /&gt;
[erwan@R1 ~]$ &lt;br /&gt;
&lt;br /&gt;
[root@konilope ~]# sensors | grep Temp&lt;br /&gt;
M/B Temp:    +39°C  (low  =   +15°C, high =   +40°C)   sensor = thermistor   &lt;br /&gt;
CPU Temp:   +127°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
Temp3:       +44°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
[root@konilope ~]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode utilisant lm_sensors nécessite une interprétation de la part de l&#039;utilisateur. Dans cet exemple, il apparaît évidant que le processeur ne peut avoir une température de fonctionnement aussi élevée (127°C). L&#039;erreur est du à un mauvais calcul de la part de lm_sensors. Il se base sur le type de capteurs thermiques utilisé par la carte mère pour calculer la température des différents composants. Malheureusement, le montage électrique autour du capteur de température peut varier d&#039;un modèle de carte à un autre, ce qui fausse les calculs. On considéra donc, que pour cette machine (konilope) sa température se situe aux alentours de 42° : valeur moyenne entre les deux valeurs « cohérentes » relevées par lm_sensors. On pourra cependant vérifier cette approximation en relevant la température du disque sur à l&#039;aide de smartmontools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# smartctl -A /dev/hda | grep Temperature&lt;br /&gt;
194 Temperature_Celsius     0x0022   042   052   000    Old_age   Always       -       42&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, il est préférable de maintenir sa machine en dessous des 55° et celle de son processeur en dessous de 70°C. Au delà, le système risque d&#039;être instable. Si ce n&#039;est pas le cas, effectuez les modification nécessaire pour y parvenir : meilleure ventilation du processeur ou du boîtier par exemple.&lt;br /&gt;
&lt;br /&gt;
Ensuite, téléchargez l&#039;utilitaire cpuburn depuis un mirroir  (http://pages.sbcglobal.net/redelm/cpuburn_1_4_tar.gz)  ou depuis votre distribution linux favorite (oui, oui, urpmi cpuburn ça fonctionne ;o)).&lt;br /&gt;
&lt;br /&gt;
Vous y trouverez plusieurs programmes nommés burnXX ou XX représente votre processeur. La version P6 sera à utiliser sur les processeurs Intel Pentium 4, la version K7 pour les processeurs Athlon x86. Pour les processeurs plus récents, utilisez la version P6.&lt;br /&gt;
Ce logiciel réalise des boucles en langage assembleur ayant pour but de stresser votre processeur de manière importante et donc le faire chauffer. Lancez cpuburn autant de fois que vous avez de processeur sur votre machine puis observez la température de votre machine. Si lors de la montée en température votre système se fige, alors vous avez un problème de thermie. Si cpuburn ne fait pas planter votre ordinateur au bout de 10mn, vous pouvez considérez que votre système est stable de ce coté là. Vous pouvez aussi utiliser ce test pour vérifier que vos ventilateurs d&#039;ordinateurs portable se déclenchent bien en cas de surchauffe.&lt;br /&gt;
Sur un portable récent, on obtient le résultat suivant au bout de quelques minutes de cpuburn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             80 C&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Malgré la température très élevée du processeur, le système est resté stable ce qui permet de valider qu&#039;il est capable d&#039;encaisser une montée en température élevée. Bien entendu, plus votre machine sera « chaude » plus elle s&#039;usera rapidement. Il ne faut pas oublier que les autres composants peuvent souffrir de la chaleur dégagée par le processeur par exemple : les disques durs en sont un bon exemple car les plateaux ne supportent pas la chaleur.&lt;br /&gt;
Ce test est bon aussi ? A priori, les composants de base de votre système sont en bon état, vous pouvez commencer à regarder du coté configuration logicielle.&lt;br /&gt;
&lt;br /&gt;
== APIC es tu là ? ==&lt;br /&gt;
&lt;br /&gt;
Le manque de stabilité peut aussi s&#039;expliquer par la gestion des interruptions. &lt;br /&gt;
L&#039;architecture PIC (Programmable Interrupt Controllers)  représentée par la famille de composants Intel 8259, permettait une gestion de 8 interruptions pour un unique processeur. On les associe par 2 pour obtenir les 16 niveaux d&#039;interruptions nécessaire depuis nos vieux 80286 (milieu des années 80). Avec l&#039;arrivée des systèmes multi-processeurs, l&#039;architecture APIC (Advanced Programmable Interrupt Controllers) (Intel 82093) à été ajoutée pour permettre une gestion plus fine des interruptions. En effet, dans un contexte multi-processeurs, il est nécessaire de pouvoir choisir quel processeur traitera quelle interruption pour ne pas rester figé dans l&#039;ancien modèle (PIC) où le processeur de  « boot » est assigné à un ensemble d&#039;interruptions. &lt;br /&gt;
&lt;br /&gt;
De plus, l&#039;architecture APIC apporte une gestion de 24 interruptions, une gestion de priorité des interruptions et le routage de l&#039;interruption sur le bon processeur, contre un simple routage de 2*8 interruptions dans le modèle PIC sur un seul processeur. Depuis une dizaine d&#039;années, Intel propose le modèle APIC comme nouvelle architecture, y compris pour les systèmes mono-processeurs. Les ordinateurs récents, y compris les portables, sont maintenant équipés uniquement de composants APIC même si l&#039;on peut obtenir un comportement de type PIC avec ceux-ci.&lt;br /&gt;
&lt;br /&gt;
L&#039;architecture APIC est constituée d&#039;un ou plusieurs composants situé physiquement dans le southbridge (IO-APIC), généralement un par bus, et un composant situé dans le processeur : le Local APIC (LAPIC). Le LAPIC va permettre la gestion des interruptions au niveau du processeur local. Il permet aussi de générer des interruptions par exemple pour transmettre des interruptions à des processeurs voisins dans le contexte d&#039;un système multi-processeurs, ces messages sont appelés IPI (Inter Processor Interrupts). &lt;br /&gt;
&lt;br /&gt;
De plus le Local APIC (LAPIC) inclut un « timer » de précision cadencé à la fréquence du bus, généralement il peut être utilisé par l&#039;ordonnanceur de votre système d&#039;exploitation favori ou d&#039;autres outils de haut niveau (profiler kernel : oprofile, vtune). Les LAPIC et l&#039;IO-APIC sont reliés par un bus spécifique pour permettre un échange rapide des informations. &lt;br /&gt;
&lt;br /&gt;
Schema logique d&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
[[image:acpi.jpg]]&lt;br /&gt;
&lt;br /&gt;
Les IO-APIC vont donc se charger de collecter les interruptions provenant des périphériques systèmes et d&#039;en assurer le transfert vers le ou les processeur(s) suivant une route préalablement programmée par le BIOS et/ou le système d&#039;exploitation.&lt;br /&gt;
&lt;br /&gt;
Cependant, l&#039;implémentation des APIC dans les BIOS peut provoquer certaines instabilités sur votre système Linux. Par expérience, il n&#039;y a pas de règle pour trouver la configuration qui peut aider votre machine à se stabiliser car cela dépend de chaque machine. Des différences peuvent même exister entre  deux versions de BIOS d&#039;un même ordinateur. Cependant, dans la série 2.6 du noyau Linux et les version 2.4 récentes nous disposons d&#039;outils permettant de re-paramétrer cette configuration en activant/désactivant les IO-APIC ou les LAPIC.&lt;br /&gt;
&lt;br /&gt;
Chaque composant possède un activateur ou un inhibiteur, on aura donc d&#039;un coté « apic » et « noapic » pour la gestion des IO-APIC, « nolapic » et « lapic » de l&#039;autre pour la gestion des LAPIC. Ces 4 options sont à utiliser sur la ligne de commande du noyau, c&#039;est à dire au moment où le « bootloader » (lilo ou grub par exemple) va charger le noyau en mémoire. L&#039;utilisation de « apic » et « lapic » permet d&#039;activer ces composants qui ne l&#039;ont pas été par le BIOS. L&#039;activateur « apic » n&#039;est disponible que les architectures de type x86_64 car celui-ci est déjà activé sur les systèmes de type x86. On désactivera les APIC dans le cas où le système affiche des messages d&#039;erreurs sur les APIC comme : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;« APIC error on CPU0: 40(40) »&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ou&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;MP-BIOS bug: 8254 timer not connected to IO-APIC&lt;br /&gt;
failed.&lt;br /&gt;
timer doesn&#039;t work through the IO-APIC - disabling NMI Watchdog!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La désactivation des IO-APIC permet par exemple de corriger le comportement parfois récalcitrant de certaines cartes vidéos qui ne parviennent pas à afficher correctement en mode 2D/3D (écran noir par exemple).&lt;br /&gt;
&lt;br /&gt;
La non activation des LAPIC peut avoir comme conséquence un dysfonctionnement de l&#039;ACPI (gestion d&#039;énergie avancée). Ce cas est traité par le noyau, vous retrouverez dans les messages de démarrage la ligne suivante : « &amp;quot;Local APIC disabled by BIOS you can enable it with lapic ».&lt;br /&gt;
&lt;br /&gt;
Pour résumer, si votre machine, en général à architecture mono-processeur, a tendance à se bloquer lors de l&#039;utilisation de périphériques tels que le port usb, la carte graphique ou la carte son, essayez de désactiver le LAPIC puis l&#039; IO-APIC puis les 2.  Pour exemple, les cartes mère A7N8X de chez Asus ont largement tendance à se bloquer si l&#039;on ne spécifie pas « nolapic » lors du boot. Sur certaines machines, il faudra faire le contraire à savoir forcer l&#039;activation des LAPIC. Ceci dépendra de votre machine et de sa conception.&lt;br /&gt;
&lt;br /&gt;
== A vos marques, rebootez ! ==&lt;br /&gt;
&lt;br /&gt;
Certains machines peuvent présenter quelques soucis pour redémarrer. Encore une fois, on retrouve au coeur de ce problème l&#039;interaction entre le noyau et le matériel notamment l&#039;ACPI. Les ordinateurs portables dont le modèle HP nc6120 ont par exemple le bon goût de rester bloqués sur le message « No reboot fixup found for your hardware ». Ceci indique que le noyau ne connaît pas de contournement pour ce matériel (ce qui est le cas de la quasi totalité des ordinateurs) mais puisque vous voyez ce message c&#039;est que votre machine n&#039;a pas réussi à rebooter. Heureusement, il existe des contournements pour permettre un redémarrage plus « bas niveau ». Le noyau défini les modes suivants : « b » « c » « h » « s » et « w ».&lt;br /&gt;
Le mode de reboot peut être défini sur la ligne de commande du noyau suivant la forme « reboot=&amp;lt;mode&amp;gt; ». Le mode « s » est réservé au systèmes multi-processeurs, elle va réinitialiser chacun des processeurs.&lt;br /&gt;
&lt;br /&gt;
Le mode « b » permet quant à lui de rebooter en faisant un appel direct au bios qui se chargera de faire redémarrer la machine. Ce mode fonctionne plutôt bien car dans le cas d&#039;un BIOS posant problème sur l&#039;ACPI, on peut espérer avoir un reboot correct. C&#039;est le cas sur de notre portable cité précédement.&lt;br /&gt;
&lt;br /&gt;
Le mode « h » se chargera de faire redémarrer la machine en réinitialisant le processeur. C&#039;est l&#039;équivalent du mode « s » pour les environnements mono-processeurs.  Pour finir, les modes « c » et « w » correspondent aux modes « cold » et « warn » : ces modes sont plus connus sous le nom de « reboot à froid »  et « reboot à chaud ». Le premier effectuera les tests de mémoire tandis que le second exécutera un reboot plus court.&lt;br /&gt;
&lt;br /&gt;
De manière générale, on utilisera plutôt le mode « b » ou « h » pour les systèmes mono-processeurs récalcitrant et le mode « s » pour les systèmes multi-processeurs.&lt;br /&gt;
&lt;br /&gt;
== Toujours plus de performance ==&lt;br /&gt;
Votre configuration est bien stable depuis un certain temps. Toutefois vous trouvez qu&#039;elle est un peu lente, elle ne vous donne pas satisfaction par rapport à ce qu&#039;elle devrait fournir.&lt;br /&gt;
Cette partie de l&#039;article va explorer comment vérifier et corriger les problèmes de performance des différents composants.&lt;br /&gt;
Note: certaines configuration mono-processeur nécessitent de désactiver LAPIC (nolapic)&lt;br /&gt;
&lt;br /&gt;
=== Le disque dur ===&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le disque dur semble un peu lent et pénalise le système dans son ensemble. Hdparm est là pour vous aider à y voir plus clair. Hdparm est à l&#039;origine conçu pour les systèmes de disques IDE de type PATA. Le nouveau système de disque SATA, ne permet pas toujours en fonction de l&#039;implémentation, l&#039;appel à toutes ces astuces. Cependant les nouvelles séries de kernel à partir du 2.6.15 devrait permettre une gestion plus unifiée des systèmes de disques PATA et SATA.&lt;br /&gt;
&lt;br /&gt;
Le test « hdparm -t /dev/&amp;lt;mon_device&amp;gt; » permet de tester la vitesse de lecture depuis le disque dur jusqu&#039;en mémoire. Une valeur de 25Mo/sec est un minimum pour des machines récentes. Plusieurs paramètres peuvent influencer les performances d&#039;un disque IDE. &lt;br /&gt;
La commande « hdparm -cd » permet de vérifier que les entrées/sorties sont réalisées en 16-bit (le mode 32-bit n&#039;offre pas de performance supplémentaire) alors que le DMA (Direct Memory Access) est activé. Ceci permet la minimisation de l&#039;utilisation du processeur pendant les accès au disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -cd /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
 IO_support   =  0 (default 16-bit)&lt;br /&gt;
 using_dma    =  1 (on)&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande « hdparm -c0d1 /dev/&amp;lt;mon_device&amp;gt; » permet de configurer le périphérique dans ce mode. Le noyau de votre distribution Linux devrait le réaliser de manière automatique.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -I » permet d&#039;obtenir plus d&#039;informations sur la configuration de votre disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -I /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
ATA device, with non-removable media&lt;br /&gt;
	Model Number:       FUJITSU MHT2040AT                       &lt;br /&gt;
	Serial Number:      NN77T3C13KB9&lt;br /&gt;
	Firmware Revision:  0022    &lt;br /&gt;
Standards:&lt;br /&gt;
	Used: ATA/ATAPI-6 T13 1410D revision 3a &lt;br /&gt;
	Supported: 6 5 4 3 &lt;br /&gt;
Configuration:&lt;br /&gt;
	Logical		max	current&lt;br /&gt;
	cylinders	16383	16383&lt;br /&gt;
	heads		16	16&lt;br /&gt;
	sectors/track	63	63&lt;br /&gt;
	--&lt;br /&gt;
	CHS current addressable sectors:   16514064&lt;br /&gt;
	LBA    user addressable sectors:   78140160&lt;br /&gt;
	device size with M = 1024*1024:       38154 MBytes&lt;br /&gt;
	device size with M = 1000*1000:       40007 MBytes (40 GB)&lt;br /&gt;
Capabilities:&lt;br /&gt;
	LBA, IORDY(cannot be disabled)&lt;br /&gt;
	bytes avail on r/w long: 4	Queue depth: 1&lt;br /&gt;
	Standby timer values: spec&#039;d by Standard, no device specific minimum&lt;br /&gt;
	R/W multiple sector transfer: Max = 16	Current = 16&lt;br /&gt;
	Advanced power management level: 128 (0x80)&lt;br /&gt;
	Recommended acoustic management value: 254, current value: 254&lt;br /&gt;
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 &lt;br /&gt;
	     Cycle time: min=120ns recommended=120ns&lt;br /&gt;
	PIO: pio0 pio1 pio2 pio3 pio4 &lt;br /&gt;
	     Cycle time: no flow control=240ns  IORDY flow control=120ns&lt;br /&gt;
Commands/features:&lt;br /&gt;
	Enabled	Supported:&lt;br /&gt;
	   *	READ BUFFER cmd&lt;br /&gt;
	   *	WRITE BUFFER cmd&lt;br /&gt;
	   *	Host Protected Area feature set&lt;br /&gt;
	   *	Look-ahead&lt;br /&gt;
	   *	Write cache&lt;br /&gt;
	   *	Power Management feature set&lt;br /&gt;
		Security Mode feature set&lt;br /&gt;
	   *	SMART feature set&lt;br /&gt;
	   *	Mandatory FLUSH CACHE command &lt;br /&gt;
	   *	Device Configuration Overlay feature set &lt;br /&gt;
	   *	Automatic Acoustic Management feature set &lt;br /&gt;
	   *	SET MAX security extension&lt;br /&gt;
		Power-Up In Standby feature set&lt;br /&gt;
	   *	Advanced Power Management feature set&lt;br /&gt;
	   *	DOWNLOAD MICROCODE cmd&lt;br /&gt;
	   *	SMART self-test &lt;br /&gt;
	   *	SMART error logging &lt;br /&gt;
Security: &lt;br /&gt;
		supported&lt;br /&gt;
	not	enabled&lt;br /&gt;
	not	locked&lt;br /&gt;
		frozen&lt;br /&gt;
	not	expired: security count&lt;br /&gt;
	not	supported: enhanced erase&lt;br /&gt;
	40min for SECURITY ERASE UNIT. &lt;br /&gt;
HW reset results:&lt;br /&gt;
	CBLID- above Vih&lt;br /&gt;
	Device num = 0 determined by the jumper&lt;br /&gt;
Checksum: correct&lt;br /&gt;
[root@R1 ~]#&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On y retrouve le modèle, le numéro de série et la version du firmware qui peuvent être utiles en cas de contact avec le Service Après-Vente ou de mise à jour pour une série de firmwares défaillante.&lt;br /&gt;
&lt;br /&gt;
La ligne commençant par « DMA » dans la partie « Capabilities » permet d&#039;afficher la vitesse de transfert négociée entre le disque dur et le driver IDE de Linux. L&#039;étoile précède la valeur actuelle. Dans cet exemple, le mode udma5 est sélectionné : ceci est conforme aux machines disponibles sur le marché depuis environ 3 ans.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, voici le tableau de conversion entre le mode DMA et la vitesse maximale associée.&lt;br /&gt;
&lt;br /&gt;
Type de fonctionnement&lt;br /&gt;
Vitesse Maximale en MO/sec&lt;br /&gt;
UltraDMA 0&lt;br /&gt;
16,6&lt;br /&gt;
UltraDMA 1&lt;br /&gt;
25&lt;br /&gt;
UltraDMA 2&lt;br /&gt;
33,3&lt;br /&gt;
UltraDMA 3&lt;br /&gt;
44,4&lt;br /&gt;
UltraDMA 4&lt;br /&gt;
66,6&lt;br /&gt;
UltraDMA 5&lt;br /&gt;
100&lt;br /&gt;
UltraDMA 6&lt;br /&gt;
133,33&lt;br /&gt;
&lt;br /&gt;
Une configuration actuelle ne devrait pas être en dessous de UDMA5. Si ce n&#039;était pas le cas, on peut essayer de renégocier la vitesse de transfert à l&#039;aide de la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hdparm -X udma5 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celle-ci permet de forcer le mode UltraDMA5. Il faut utiliser cette commande avec précaution car elle pourrait générer des pertes ou de la corruption de données en cas de transfert pendant ce changement de mode.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi impacter les performances de votre disque dur en modifiant sa vitesse de rotation. Cette fonctionnalité connue sous le nom de Automatic Acoustic Management (AAM) est utilisable avec l&#039;option « -M » de hdparm. La valeur 128 représentera la vitesse la plus faible avec un disque silencieux, la valeur 254 la vitesse la plus élevée mais avec comme contre-partie un disque plus bruyant. On pourra noter des différences de quelques Mo/sec selon les configurations.&lt;br /&gt;
&lt;br /&gt;
Il est aussi à noter que l&#039;utilisation de logiciels permettant une meilleure gestion d&#039;énergie (cpufreq, laptop-mode) peut dégrader les performances d&#039;un disque dur de manière notable.&lt;br /&gt;
&lt;br /&gt;
=== Configuration bas niveau du réseau ===&lt;br /&gt;
&lt;br /&gt;
Le réseau local filaire peut parfois être un peu lent. Voici quelques tests pour vérifier si la lenteur provient du logiciel, du noyau ou du matériel. Tout d&#039;abord, explorons la trousse à outils indispensable pour analyser votre carte réseau : ethtool. Digne successeur de mii-tool, il permet de s&#039;informer sur la configuration de votre carte réseau. &lt;br /&gt;
&lt;br /&gt;
Il suffit de lancer « ethtool &amp;lt;votre_interface&amp;gt; » » pour obtenir la configuration matérielle de votre carte. On y retrouve les modes supportés par votre carte (Supported Link Modes ainsi que la vitesse actuelle (Speed), obtenue par auto-négociation dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
On peut également savoir si le câble réseau est connecté à la carte grâce à la ligne « Link Detected ». Le type de « duplex » utilisé permet également de savoir si la négociation avec l&#039; élément actif au bout de votre câble (commutateur, concentrateur ou une autre machine) a correctement fonctionné. Le duplex définit le mode de  transmission : le mode half-duplex indique que l&#039;on émet puis on reçoit des données, le mode full-duplex indique que l&#039;on peut émettre et recevoir en même temps des données. Le mode full-duplex est donc plus que recommandé pour vos équipements réseaux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# ethtool  eth1&lt;br /&gt;
Settings for eth1:&lt;br /&gt;
	Supported ports: [ TP MII ]&lt;br /&gt;
	Supported link modes:   10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Supports auto-negotiation: Yes&lt;br /&gt;
	Advertised link modes:  10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Advertised auto-negotiation: Yes&lt;br /&gt;
	Speed: 100Mb/s&lt;br /&gt;
	Duplex: Full&lt;br /&gt;
	Port: MII&lt;br /&gt;
	PHYAD: 1&lt;br /&gt;
	Transceiver: internal&lt;br /&gt;
	Auto-negotiation: on&lt;br /&gt;
	Current message level: 0x000020c1 (8385)&lt;br /&gt;
	Link detected: yes&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesurer les {contre}performances de votre réseau ===&lt;br /&gt;
&lt;br /&gt;
Une fois vérifiée la bonne configuration de votre matériel, nous pouvons passer à la vérification des performances entre deux machines.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire netpipe (http://www.scl.ameslab.gov/netpipe/) permet de réaliser des tests de performance mais aussi d&#039;intégrité entre deux machines. Il permet de tester les performances du réseau au travers la couche IP et non pas depuis un mode plus bas niveau comme pourrait l&#039;être un test utilisant directement le driver Ethernet. Ce test permet donc de valider que la configuration matérielle mais aussi logicielle est correcte.&lt;br /&gt;
&lt;br /&gt;
Sur la première machine, exécutez « NPtcp » : netpipe se positionne en mode « serveur ».&lt;br /&gt;
Sur la seconde machine, exécutez « NPtcp -h &amp;lt;machine1&amp;gt; » : netpipe se connecte au serveur netpipe de la machine nommée machine1 pour effectuer le test de performance.&lt;br /&gt;
&lt;br /&gt;
Le test par défaut teste les communication allant de 1 octet jusqu&#039;à 8 Mo. Il peut prendre plusieurs minutes si le réseau est « lent ». Le test va montrer pour chaque taille de paquet la performance obtenue. Il est normal d&#039;obtenir des performances faibles pour des paquets d&#039;une taille inférieure à 8 Ko. Transporter des petits paquets nécessite de réaliser beaucoup d&#039;opérations pour le processeur pour une quantité d&#039;information minime. Les performances seront meilleures à partir d&#039;environ 16 Ko et maximales à partir de 128 Ko. Sur un système utilisant du gigabit ethernet, on constatera une performance de 39Mbps à 256 octets, 287Mbps à 4Ko, 614Mbps à 16Ko, 845Mbps à 128Ko, 895Mbps à 8Mo.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ainsi vérifier et comparer facilement les performances de votre configuration réseau. Netpipe permet également de tester la vitesse du réseau pour une taille de paquets définie entre la taille indiqué par l&#039;option « -l » et la taille indiquée par l&#039;option « -u ». Ainsi, NPtcp -l 16384 -u 16384 permet de tester la bande passante réseau pour une taille de paquet égale à 16Ko.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -n &amp;lt;nb-cycle&amp;gt; » permet de définir le nombre de boucles à réaliser pour le test (50 par défaut). Enfin, pour réaliser des tests « full-duplex », on utilisera l&#039;option « -2 ». Ce test permet de s&#039;assurer du bon fonctionnement du mode de communication permettant l&#039;écriture et la lecture simultanées.&lt;br /&gt;
&lt;br /&gt;
Attention, même si ce test donne de bons résultats, cela ne veut pas dire que la configuration est exempte d&#039;erreur de configuration. Par exemple, les performances réseaux peuvent être très bonnes en point à point mais mauvaises lorsque l&#039;on aura une charge réseau avec plusieurs clients. Dans cette situation, il faut vérifier que le contrôle de flux est bien activé sur toutes les machines. L&#039;option « ethtool -a » permet de vérifier que les champs « rx » et « tx » sont placés sur « on ». Si ce n&#039;était pas le cas activez-les avec la commande « ethtool -A eth0 rx on » et « ethtool -A eth0 tx on ».&lt;br /&gt;
&lt;br /&gt;
Les cartes réseaux, des serveurs essentiellement, permettent maintenant de réaliser le « tcp segment offload ». Cette technique permet de décharger une partie du traitement TCP directement dans l&#039;électronique de la carte réseau. Ceci à pour effet de décharger le processeur central d&#039;un traitement fastidieux. L&#039;option « -k » d&#039;ethtool permet de consulter l&#039;état de cette fonctionnalité (off/on). On pourra l&#039;activer sur des serveurs générant un gros trafic réseau par exemple : « ethtool -K eth0 tso on ».&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant équipé de nouveau outils pour traquer la perte de performances de votre installation réseau. Ceci couplé aux habituels tcpdump/ethereal, voilà une belle panoplie du zorro du réseau.&lt;br /&gt;
&lt;br /&gt;
=== Quand la latence s&#039;en mêle ===&lt;br /&gt;
&lt;br /&gt;
La latence représente le temps nécessaire à un système pour prendre en compte un événement.&lt;br /&gt;
&lt;br /&gt;
Il arrive que certains périphériques de votre machine nécessitant des débits importants ou une latence assez faible sur le bus PCI soient « poussifs ». On retrouve dans cette catégorie les cartes vidéos accélératrice 3D, les cartes son et les cartes d&#039;acquisition firewire ou DVB (récepteur de télévision numérique terrestre : TNT).&lt;br /&gt;
&lt;br /&gt;
Un périphérique branché sur le bus PCI doit attendre que le bus soit libre pour émettre les données vers la mémoire centrale. Le bus PCI qui est le coeur de communication des périphériques est donc soumis en permanence à un arbitrage qui permet de décider qui doit émettre des données et qui doit attendre. Cet arbitrage est en partie réalisé grâce au « latency_timer ».&lt;br /&gt;
&lt;br /&gt;
Chaque périphérique possède une valeur de « latency_timer » comprise en 0 et 248 cycles d&#039;horloge du bus. Plus la valeur sera importante plus le périphérique disposera de temps pour transmettre des informations. Une latence de 248 cycles permet d&#039;obtenir une priorité forte sur le bus, ce qui permet un débit important. A contrario, une latence de 0 indiquera au périphérique qu&#039;il doit cesser ses transmissions si un autre composant à besoin du bus : ceci se traduira par une perte de bande passante importante.&lt;br /&gt;
&lt;br /&gt;
La configuration réalisée par défaut sur votre machine doit être correcte mais il peut arriver qu&#039;une carte 3D ou DVB soit configurée avec une latence trop faible, ce qui  aurait pour conséquence d&#039;offrir une image saccadée et peu fluide. Une carte son offrirait également le même type de symptômes avec un son hâché ou excessivement métallique.&lt;br /&gt;
&lt;br /&gt;
Heureusement, une série d&#039;outils est là pour vous aider à diagnostiquer le problème mais aussi à le résoudre. Le projet pciutils  (http://atrey.karlin.mff.cuni.cz/~mj/linux.shtml#pciutils) contient deux outils indispensables: lspci et setpci. Bien entendu, votre distribution favorite devrait posséder ce logiciel, il vous suffira de l&#039;installer avec  votre gestionnaire de paquet favori (urpmi, apt, smart).&lt;br /&gt;
&lt;br /&gt;
La commande « lspci » vous permet de lister les périphériques PCI disponibles sur votre ordinateur (cf article paru dans le numéro 68).  Cet exemple se basera sur une carte vidéo  ayant pour adresse sur le bus PCI « 01:00.0 ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@lagirafe] lspci -v -s 01:00.0&lt;br /&gt;
01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go5200 32M/64M] (rev a1) (prog-if 00 [VGA])&lt;br /&gt;
	Subsystem: Samsung Electronics Co Ltd: Unknown device c00f&lt;br /&gt;
	Flags: bus master, 66Mhz, medium devsel, latency 16, IRQ 11&lt;br /&gt;
	Memory at c8000000 (32-bit, non-prefetchable) [size=16M]&lt;br /&gt;
	Memory at d8000000 (32-bit, prefetchable) [size=128M]&lt;br /&gt;
	Expansion ROM at &amp;lt;unassigned&amp;gt; [disabled] [size=128K]&lt;br /&gt;
	Capabilities: [60] Power Management version 2&lt;br /&gt;
	Capabilities: [44] AGP version 3.0&lt;br /&gt;
[root@lagirafe]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On retiendra dans cette ligne, la valeur &#039;latency 16&#039;. Ceci risque de poser problème lorsque celle-ci aura besoin d&#039;un fort débit pendant un jeu par exemple. Augmenter la latence va donc se révéler nécessaire pour ce périphérique.&lt;br /&gt;
&lt;br /&gt;
La commande setpci permet de modifier les paramètres PCI d&#039;un périphérique ou d&#039;un bus complet avec tous ses périphériques. &lt;br /&gt;
&lt;br /&gt;
La commande « setpci -v -d 01:* latency_timer=20 » permet de positionner tous les périphériques  du bus 01 à une valeur de 32 cycles. Il est à noter que la commande setpci utilise des valeurs en hexadécimal mais lspci affichera les valeurs en décimal.&lt;br /&gt;
&lt;br /&gt;
Pour en revenir à nos moutons, la correction de la latence de cette carte graphique se fera avec la commande «  setpci -v -d 01:00.0 latency_timer=f8 ». Ceci positionne donc la carte sur la plus grande valeur de latence possible, ce qui lui garantira la plus grande bande passante possible. Il est possible d&#039;utiliser la valeur « ff » comme paramètre pour « latency_timer » mais celui-ci sera converti à la volée par la commande setpci en « 0xf8 ».&lt;br /&gt;
&lt;br /&gt;
Attention, certains composants de votre machine doivent rester en « latency_timer=0 » pour garantir une bon fonctionnement de votre système : il ne faudra donc pas modifier les latences des contrôleurs mémoire et des ponts PCI connectés généralement sur le bus « 0:* ».&lt;br /&gt;
&lt;br /&gt;
== DSDT : le cauchemar continue ! ==&lt;br /&gt;
&lt;br /&gt;
Cette partie de l&#039;article a pour but d&#039;expliquer le problème que peut représenter la table DSDT pour un certain nombre de machines et surtout les ordinateurs portables. &lt;br /&gt;
&lt;br /&gt;
La norme ACPI 3.0 de Septembre 2004 disponible gratuitement à l&#039;adresse http://www.acpi.info/DOWNLOADS/ACPIspec30.pdf définit la DSDT comme une table remplie par un OEM permettant au système d&#039;exploitation de découvrir les ressources pour la gestion de l&#039;énergie avancée, de la gestion thermique ainsi que la gestion du Plug&#039;nPlay des ressources définies par l&#039;ACPI.&lt;br /&gt;
&lt;br /&gt;
Voici une description certes un peu théorique mais nécessaire pour bien comprendre la problématique et ses conséquences. Le constructeur de l&#039;ordinateur doit donc définir dans le BIOS une table contenant une liste de ressources et leurs configuration et ce pour que le système d&#039;exploitation puisse s&#039;en servir. Noble cause n&#039;est il pas ? Tout au long des 618 pages de ce document sont spécifiés les éléments du langage à utiliser ainsi que sa syntaxe. L&#039; « ACPI Source Language » permettra donc aux développeurs d&#039;écrire des DSDT puis de les compiler dans un format nommé « ACPI Machine Language » en utilisant un compilateur adéquat. Le système d&#039;exploitation utilisera la table compilée (AML) pour accéder aux ressources ACPI. &lt;br /&gt;
Sur la plupart des ordinateurs portables, la table DSDT ne respecte pas la norme ACPI dans sa syntaxe. Ceci est très gênant car cela bloque le code de l&#039;interpréteur ACPI du noyau Linux qui essaie de la lire. Le résultat est sans appel, pas d&#039;ACPI, pas de gestion d&#039;énergie avancée, plus de ventilation automatique sur certains modèles d&#039;ordinateurs, plus de touche de gestion de contraste/luminosité sur d&#039;autres etc...&lt;br /&gt;
&lt;br /&gt;
Ceci est très gênant sur un ordinateur portable. Alors que faire ? Dans un premier temps, prévenir le constructeur que son BIOS est incorrect et ne respecte pas la norme ACPI. La réponse se fait toujours attendre pour tous ceux qui « osent » poser la question au support technique : à savoir, les constructeurs ignorent tout simplement les mails de ce type.&lt;br /&gt;
La seconde étape puisque vous êtes devant le fait accompli d&#039;une machine non conforme, il va falloir corriger cette table. Il suffit de récupérer la table actuelle via la commande &#039;cat /proc/acpi/dsdt &amp;gt; dsdt.aml&#039; si vous avez la chance d&#039;avoir un répertoire /proc/acpi malgré une table DSDT endommagée, sinon utilisez la commande &#039;acpidump -b -t dsdt -o dsdt.aml&#039;. La commande acpidump est  fournit dans le projet pmtools (ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools-20050926.tar.bz2) &lt;br /&gt;
Vous avez donc extrait la table DSDT de votre système. Il ne reste plus qu&#039;à essayer de la recompiler. Pour cela, le compilateur IASL de la société Intel (http://developer.intel.com/technology/iapc/acpi/downloads.htm) offre sous Linux et Windows une plate-forme de compilation pour le langage ASL.&lt;br /&gt;
&lt;br /&gt;
Suivez les instructions du site pour télécharger et compiler la version unix d&#039;iasl. Ensuite, décompilez la table avec la commande « iasl -d dsdt.aml ». Le fichier dsdt.dsl vient d&#039;être créé par le décompilateur. Il suffit de le recompiler avec la commande « iasl -tc dsdt.dsl » pour constater les dégâts ! La DSDT que vous avez dans votre BIOS est généralement compilée par le compilateur de Microsoft qui semble autoriser une syntaxe plus qu&#039;approximative.&lt;br /&gt;
Si vous avez de la chance, votre DSDT s&#039;est recompilée sans erreurs, vous obtenez donc un fichier dsdt.hex et un fichier dsdt.aml. Il ne reste plus qu&#039;à injecter cette dsdt dans le noyau Linux et le tour sera joué.&lt;br /&gt;
&lt;br /&gt;
Si vous avez moins de chance, votre DSDT est syntaxiquement incorrecte et génère des erreurs. Les expliquer plus en détails nécessiterait un article complet, il ne sera cité que les plus « habituelles » (sic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2626:                     Field (ECR, DWordAcc, Lock, Preserve) &lt;br /&gt;
Error    1048 -                              ^ Host Operation Region requires ByteAcc access &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette erreur présente à ligne 2626 du fichier dsdt.asl indique une erreur de type dans la déclaration du champ ECR. Il suffit dans ce cas de changer le mot « DWordAcc » par « ByteAcc ». Celle-ci reste assez simple à corriger, on se demande donc pourquoi les constructeurs ne prennent pas le temps de vérifier et de corriger leur BIOS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2672:                     Method (_GLK, 1, NotSerialized) &lt;br /&gt;
Warning  2024 -                                ^ Reserved method has too many arguments ( _GLK requires 0) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode _GLK n&#039;a besoin que de 0 paramètre tandis que ce code en utilise 2 ! La correction est assez simple : il suffit de remplacer la ligne 2672 par « Method(_GLK) ».&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur la correction des erreurs de compilation de votre table dsdt, je vous recommande les tutoriaux disponibles depuis la page http://acpi.sourceforge.net/dsdt/index.php du projet ACPI.&lt;br /&gt;
&lt;br /&gt;
Votre DSDT est compilée avec succès, il ne vous reste plus qu&#039;à l&#039;ajouter pour que votre noyau puisse l&#039;utiliser à la place de celle fourni par le BIOS (modifiable uniquement par le constructeur, via une mise à jour).&lt;br /&gt;
&lt;br /&gt;
Il existe trois possibilités pour inclure une table DSDT : la modification du noyau Linux ( noyau &amp;lt; 2.6.9), l&#039;injection de la DSDT dans la configuration du noyau (noyau &amp;gt;= 2.6.9), l&#039;intégration de la table DSDT dans l&#039;initrd qui nécessite un patch kernel disponible à l&#039;adresse http://gaugusch.at/kernel.shtml.&lt;br /&gt;
&lt;br /&gt;
Pour les noyaux 2.6.9 et supérieur, copiez votre fichier dsdt.hex sous le nom «/usr/src/linux/include/acpi/dsdt_table.h » puis reconfigurez votre noyau.&lt;br /&gt;
Insérer « dsdt_table.h » dans l&#039;option « Include you custom DSDT » disponible dans le menu « Power Management/ACPI/ ». Recompilez votre noyau et redémarrez avec votre nouveau noyau.&lt;br /&gt;
Pour les noyaux inférieurs à 2.6.9, il est possible de modifier le code source de votre noyau pour intégrer votre DSDT mais il est préférable d&#039;utiliser le patch permettant l&#039;insertion de la table DSDT dans l&#039;initrd. Recompilez votre noyau avec ce patch, puis suivez la procédure décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Certaines distributions Linux comme « Mandriva Linux » possèdent le patch qui permet de n&#039;avoir qu&#039;à reconstruire l&#039;initrd avec la commande « mkinitrd –dsdt=/boot/dsdt.aml /boot/initrd-`uname -r`.img `uname -r`  » puis de relancer lilo avant de redémarrer votre machine. Lors du démarrage de celle-ci vous devriez voir le message suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ACPI: Looking for DSDT in initrd... found (at offset 0x4f8d9).&lt;br /&gt;
ACPI-0294: *** Info: Table [DSDT] replaced by host OS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant avec une table DSDT correcte et un ACPI fonctionnel. La question qui reste ouverte est pourquoi les constructeurs n&#039;utilisent pas un compilateur digne de ce nom pour permettre à leur clients de pouvoir utiliser d&#039;autres systèmes d&#039;exploitation que Windows de Microsoft. &lt;br /&gt;
&lt;br /&gt;
Pour la petite histoire, si vous cherchez dans votre dsdt vous risquez de tomber ce genre de lignes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows NT&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft WindowsME: Millennium Edition&amp;quot;), Zero))&lt;br /&gt;
 If (LEqual (SizeOf (\_OS), 0x27)) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque qu&#039;un système d&#039;exploitation souhaite utiliser les ressources ACPI du BIOS, il utilise son nom de système d&#039;exploitation (acpi_os_name). On retrouve donc dans les bios des parties qui ne seront exécutées que pour certains systèmes d&#039;exploitation de Microsoft. On retrouve même certains tests où c&#039;est la longueur du nom qui compte...... Ceci prouve bien que les constructeurs d&#039;ordinateurs savent corriger des tables DSDT pour les systèmes d&#039;exploitation mais pas forcément pour le notre malheureusement. Depuis le noyau 2.6.9, le noyau Linux utilise « Windows NT » comme « acpi_os_name »  pour assurer une meilleure compatibilité matérielle dixit Len Bron d&#039;Intel dans le changelog de cette version.&lt;br /&gt;
&lt;br /&gt;
== Comment trouver le pilote qui va avec votre matériel ? ==&lt;br /&gt;
&lt;br /&gt;
Cette question on se la pose souvent mais uniquement lorsque l&#039;on essaye de brancher un nouveau périphérique sur sa machine. Les distributions récentes permettent de détecter automatiquement votre matériel et de lui associer un pilote avec sa configuration. Ce mécanisme fonctionne plutôt bien mais cela n&#039;évite pas les dysfonctionnements voir l&#039;absence de fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Pour vérifier si votre noyau Linux est capable de supporter un nouveau périphérique PCI par exemple, il suffit d&#039;en récupérer les identifiants PCI (constructeur et produit) puis de les rechercher dans le fichier « /lib/modules/`uname -r`/modules.pcimap » qui est auto-généré lors de la commande depmod.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire « lspcidrake -v » vous permet de trouver les identifiants PCI de votre carte, la commande « lspci » vous permet de trouver le nom de votre périphérique puis faites un « lspci -n » pour en trouver la correspondance numérique. On utilisera la position du périphérique sur le bus pour retrouver la correspondance numérique « 02:05.0 » dans cet exemple.&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome] lspci&lt;br /&gt;
[....]&lt;br /&gt;
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)&lt;br /&gt;
[root@pumphome] lspci -n&lt;br /&gt;
[...]&lt;br /&gt;
02:05.0 Class 0200: 14e4:4401 (rev 01)&lt;br /&gt;
[root@pumphome]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi cette carte réseau possède les identifiants 14e4 (constructeur) et 4401 (produit). Il suffit de rechercher cette valeur dans le modules.pcimap, ce qui nous donnera la correspondance en module (pilote).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome]  grep &amp;quot;0x000014e4 0x00004401&amp;quot; /lib/modules/2.6.12-12mdk-i686-up-4GB/modules.pcimap &lt;br /&gt;
b44               0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
bcm4400      0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit ici que cette carte peut utiliser le driver b44 ou le driver bcm4400. On ne trouve pas toujours les identifiants PCI de produit sous leur forme directe, on peut également trouver « 0Xffffffff » qui indique que tous les cartes du constructeur sont gérées par un module.&lt;br /&gt;
Il ne vous restera plus qu&#039;à effectuer la configuration associée à ce périphérique pour qu&#039;il fonctionne correctement.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
La fin de cet article conclut une toute petite série de deux articles ayant pour but de vulgariser l&#039;architecture de nos machines, de découvrir les outils disponibles pour mieux comprendre leur configuration et au besoin régler les problèmes de configuration matérielle qui ont souvent le don de nous pourrir la vie.&lt;br /&gt;
&lt;br /&gt;
Merci à LaurentJ de #Mandrivafr pour ses tests complémentaires sur les problèmes d&#039;IO-APIC. Un énorme merci à Nicolas Planel pour sa relecture pointue et également Anne pour sa patience de girafe à relire et « quaurigé »mes « photes »,  ainsi qu&#039;à tous ceux qui m&#039;ont aidé à découvrir ce que je restitue dans cet article.&lt;br /&gt;
&lt;br /&gt;
Erwan Velu&lt;br /&gt;
&lt;br /&gt;
Cet article a été publié dans Linux Magazine France n°78. Il est publié sur Léa avec l&#039;aimable autorisation de l&#039;éditeur.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12783</id>
		<title>Découvrez les ressources de votre machine (La suite)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12783"/>
		<updated>2006-06-11T20:33:30Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Les plus du matériel]]&lt;br /&gt;
= Découvrez les ressources de votre machine (La suite) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A nouvelle année, nouvelles résolutions ! Paru dans le numéro 68, un premier article dédié à la découverte des outils disponibles pour la récupération des configurations de votre machine promettait une suite.  Je vous propose donc de reprendre ce voyage au centre de votre ordinateur. &lt;br /&gt;
&lt;br /&gt;
Cet article sera articulé autour du diagnostic de pannes et des correctifs associés mais aussi de « trucs &amp;amp; astuces » permettant d&#039;optimiser votre configuration.&lt;br /&gt;
&lt;br /&gt;
== Savez-vous planter les choux ? ==&lt;br /&gt;
&lt;br /&gt;
Les choux peut-être pas mais les ordinateurs je pense que c&#039;est arrivé au moins une fois à chaque lecteur qui lit cet article. Rien de plus énervant qu&#039;un écran qui se fige, le pointeur de souris qui ne se déplace plus, le clavier qui ne répond plus non plus.... Planté ! Ce constat est assez facile à établir mais en trouver la cause reste un problème nettement plus complexe tellement le nombre de causes possibles est important.&lt;br /&gt;
&lt;br /&gt;
Deux solutions : ignorer le problème et relancer le système en se disant que ça « passera », ou alors chercher la cause du problème en essayant de trouver une méthode reproduisant le « plantage » tant redouté.&lt;br /&gt;
&lt;br /&gt;
La première solution fonctionne assez bien mais si l&#039;on à faire à un « vrai » problème de configuration matérielle ou logicielle, on arrivera assez vite à ne plus pouvoir éviter la seconde voire la troisième. J&#039;allais oublier cette troisième solution destinée aux plus riches d&#039;entre vous : changer de matériel. Cette solution coûteuse peut parfois se révéler efficace, parfois pas du tout. A quoi bon changer un composant sans savoir si c&#039;était bien celui-ci qui posait problème ?&lt;br /&gt;
Quelque soit la solution retenue, il sera de toute manière nécessaire de localiser la panne pour y apporter la réponse adéquate. Certaines sociétés ou particuliers se sont spécialisés dans ce dépannage ou l&#039;utilisateur est « dépassé » par les événements.&lt;br /&gt;
&lt;br /&gt;
Cet article vous fera, je l&#039;espère, découvrir quelques outils et méthodes pour valider un par un les composants de votre ordinateur. Cela vous permettra j&#039;espère d&#039;être un peu moins dépourvu quand un problème surviendra. L&#039;article reproduira les étapes qu&#039;il faut suivre pour isoler le « fautif ».&lt;br /&gt;
&lt;br /&gt;
== Les causes possibles d&#039;un « plantage » ==&lt;br /&gt;
&lt;br /&gt;
On retrouve deux grandes catégories de pannes provoquant des dysfonctionnements importants sur un système informatique.&lt;br /&gt;
* une panne du matériel&lt;br /&gt;
* une erreur logicielle au niveau du noyau et des pilotes (drivers)&lt;br /&gt;
&lt;br /&gt;
Il faudra donc être capable de séparer la panne matérielle qui « force » l&#039;ordinateur à entrer dans un mode de fonctionnement non prévu et instable, de l&#039;erreur logicielle qui équivaut à demander à l&#039;ordinateur de faire « n&#039;importe quoi » et qui va donc se « planter ».&lt;br /&gt;
&lt;br /&gt;
Le terme « planté » utilisé ici équivaut à un arrêt du système à cause d&#039;erreurs sévères : instruction illégale ou composants défaillants. Le terme de « plantage » est aussi utilisé pour décrire le fonctionnement d&#039;une application qui se ferme inopinément. Ce cas est plus souvent lié à une erreur de programmation de l&#039;application qu&#039;à une erreur du système. Nous ne parlerons donc pas de ce second cas dans cet article.&lt;br /&gt;
&lt;br /&gt;
== La mémoire qui flanche ? ==&lt;br /&gt;
&lt;br /&gt;
Une cause « classique » des dysfonctionnements se situe au niveau de la gestion de la mémoire de votre machine. Je ne parle pas d&#039;allocation mémoire réalisée par votre système d&#039;exploitation favori mais bien de la manière avec laquelle la carte mère configure et utilise vos barrettes de mémoire. Les applications chargent en mémoire des données et des instructions destinées au processeur. Voici un scénario qui peut provoquer l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Votre application favorite est lancée depuis la ligne de commande ou une interface graphique via un « clic » de souris. Votre système d&#039;exploitation va donc charger ce programme en mémoire puis en exécuter les instructions. Au plus bas niveau de votre système, le processeur exécute des instructions en langage machine (assembleur) présente en mémoire.&lt;br /&gt;
Malheureusement, votre mémoire est défaillante et elle n&#039;arrive pas à maintenir un état stable des informations qui lui sont confiées. Par exemple, la lettre C est représentée par le code 67, ou « 1000011 » en binaire. Si la zone mémoire change d&#039;état, alors le contenu de la valeur stocké à cet endroit changera : on pourrait se retrouver avec « 1000010 ». Un seul bit a changé, mais on passe de la lettre &#039;C&#039; (67) à la lettre &#039;B&#039;(66). Le résultat ne se fait pas attendre, le processeur se retrouve à exécuter des instructions qui n&#039;ont plus de sens, provoquant l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Les pannes de mémoires sont généralement dues à des composants endommagés, des barrettes incompatibles ou un  « timing d&#039;accès » à la mémoire (nommé CAS (Column Address Strobe) dans la plupart des BIOS) trop agressif permettant des lectures dans des zones mémoires avant que les écritures aient eu le temps de se stabiliser pour en garantir le contenu.&lt;br /&gt;
&lt;br /&gt;
Il est assez simple de valider votre configuration mémoire grâce à l&#039;utilitaire memtest (http://www.memtest.org). Cet utilitaire de taille très modeste, 96 Kilo-octets, est écrit en assembleur ce qui lui permet de s&#039;exécuter indépendamment du système d&#039;exploitation. Ceci garantit un test « proche » du matériel, sans sur-couche pouvant apporter d&#039;autres problèmes. &lt;br /&gt;
La version 1.65 actuelle est téléchargeable sous deux formes : une iso que l&#039;on peut graver sur un CDRW de préférence vu la petite taille du programme ou sous la forme d&#039;une amorce système (pre-compiled bootable binary). Il suffira de décompresser l&#039;archive puis d&#039;exécuter la commande suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;dd if=memtest.bin of=/dev/fda&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Ceci écrasera le contenu de votre disquette pour y  copier memtest. &lt;br /&gt;
Rebootez l&#039;ordinateur avec la disquette placée dans le lecteur, memtest devrait se lancer. &lt;br /&gt;
&lt;br /&gt;
[[Image:memtest.jpg]]&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus, est une capture d&#039;écran de memtest en fonctionnement. Le barre de progression principale affichée en haut à droite de l&#039;écran (2% dans cet exemple) permet de suivre la progression du test. Les erreurs apparaissent dans la partie inférieure de l&#039;écran. Il suffit de laisser fonctionner memtest au moins une fois jusqu&#039;à 100%. Si aucune ligne ne s&#039;est affichée alors vou pouvez considérer que la mémoire est fonctionnelle. Dans le cas contraire,  il faudra soit procéder à son remplacement s&#039;il s&#039;agit d&#039;une seule barrette mémoire, soit tester les barrettes indépendamment (l&#039;une puis l&#039;autre) avec ce logiciel. Dans le cas de 2 ou 3 barrettes qui ne fonctionnement pas correctement ensemble mais qui fonctionnement correctement individuellement, il faudra vérifier qu&#039;elles sont bien de même modèle/marque et remettre le Bios dans une configuration initiale.&lt;br /&gt;
&lt;br /&gt;
Votre mémoire est bonne ? Testons les autres composants de votre machine pour traquer la source de ce plantage.&lt;br /&gt;
&lt;br /&gt;
== Il ne fait pas un peu chaud là ? ==&lt;br /&gt;
&lt;br /&gt;
Ces dix dernières années la puissance consommée et dissipée par nos ordinateurs a littéralement explosé ! Du 486 qui ne nécessitait quasiment pas de ventilateur, on est arrivé à des stations de travail/jeu avec des alimentations pouvant atteindre 1KiloWatt pour les dernières et 500watt pour des modèles plus « grand public ». Le processeur est un des composants gourmands de la machine. Certains modèles peuvent consommer plus de 130W ! Autant dire que si le système est mal ventilé, la montée en charge du processeur peut provoquer un échauffement important provoquant une surchauffe de celui-ci. S&#039;il dépasse ces caractéristiques de fonctionnement, il va alors exécuter du code incorrect provocant  un plantage du système.&lt;br /&gt;
&lt;br /&gt;
Un bon test pour vérifier que votre processeur n&#039;est pas la cause de votre instabilité : commencez par relever la température de votre machine au repos à l&#039;aide des informations fournies soit par l&#039;acpi soit pas lm_sensors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[erwan@R1 ~]$ cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             42 C&lt;br /&gt;
[erwan@R1 ~]$ &lt;br /&gt;
&lt;br /&gt;
[root@konilope ~]# sensors | grep Temp&lt;br /&gt;
M/B Temp:    +39°C  (low  =   +15°C, high =   +40°C)   sensor = thermistor   &lt;br /&gt;
CPU Temp:   +127°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
Temp3:       +44°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
[root@konilope ~]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode utilisant lm_sensors nécessite une interprétation de la part de l&#039;utilisateur. Dans cet exemple, il apparaît évidant que le processeur ne peut avoir une température de fonctionnement aussi élevée (127°C). L&#039;erreur est du à un mauvais calcul de la part de lm_sensors. Il se base sur le type de capteurs thermiques utilisé par la carte mère pour calculer la température des différents composants. Malheureusement, le montage électrique autour du capteur de température peut varier d&#039;un modèle de carte à un autre, ce qui fausse les calculs. On considéra donc, que pour cette machine (konilope) sa température se situe aux alentours de 42° : valeur moyenne entre les deux valeurs « cohérentes » relevées par lm_sensors. On pourra cependant vérifier cette approximation en relevant la température du disque sur à l&#039;aide de smartmontools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# smartctl -A /dev/hda | grep Temperature&lt;br /&gt;
194 Temperature_Celsius     0x0022   042   052   000    Old_age   Always       -       42&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, il est préférable de maintenir sa machine en dessous des 55° et celle de son processeur en dessous de 70°C. Au delà, le système risque d&#039;être instable. Si ce n&#039;est pas le cas, effectuez les modification nécessaire pour y parvenir : meilleure ventilation du processeur ou du boîtier par exemple.&lt;br /&gt;
&lt;br /&gt;
Ensuite, téléchargez l&#039;utilitaire cpuburn depuis un mirroir  (http://pages.sbcglobal.net/redelm/cpuburn_1_4_tar.gz)  ou depuis votre distribution linux favorite (oui, oui, urpmi cpuburn ça fonctionne ;o)).&lt;br /&gt;
&lt;br /&gt;
Vous y trouverez plusieurs programmes nommés burnXX ou XX représente votre processeur. La version P6 sera à utiliser sur les processeurs Intel Pentium 4, la version K7 pour les processeurs Athlon x86. Pour les processeurs plus récents, utilisez la version P6.&lt;br /&gt;
Ce logiciel réalise des boucles en langage assembleur ayant pour but de stresser votre processeur de manière importante et donc le faire chauffer. Lancez cpuburn autant de fois que vous avez de processeur sur votre machine puis observez la température de votre machine. Si lors de la montée en température votre système se fige, alors vous avez un problème de thermie. Si cpuburn ne fait pas planter votre ordinateur au bout de 10mn, vous pouvez considérez que votre système est stable de ce coté là. Vous pouvez aussi utiliser ce test pour vérifier que vos ventilateurs d&#039;ordinateurs portable se déclenchent bien en cas de surchauffe.&lt;br /&gt;
Sur un portable récent, on obtient le résultat suivant au bout de quelques minutes de cpuburn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             80 C&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Malgré la température très élevée du processeur, le système est resté stable ce qui permet de valider qu&#039;il est capable d&#039;encaisser une montée en température élevée. Bien entendu, plus votre machine sera « chaude » plus elle s&#039;usera rapidement. Il ne faut pas oublier que les autres composants peuvent souffrir de la chaleur dégagée par le processeur par exemple : les disques durs en sont un bon exemple car les plateaux ne supportent pas la chaleur.&lt;br /&gt;
Ce test est bon aussi ? A priori, les composants de base de votre système sont en bon état, vous pouvez commencer à regarder du coté configuration logicielle.&lt;br /&gt;
&lt;br /&gt;
== APIC es tu là ? ==&lt;br /&gt;
&lt;br /&gt;
Le manque de stabilité peut aussi s&#039;expliquer par la gestion des interruptions. &lt;br /&gt;
L&#039;architecture PIC (Programmable Interrupt Controllers)  représentée par la famille de composants Intel 8259, permettait une gestion de 8 interruptions pour un unique processeur. On les associe par 2 pour obtenir les 16 niveaux d&#039;interruptions nécessaire depuis nos vieux 80286 (milieu des années 80). Avec l&#039;arrivée des systèmes multi-processeurs, l&#039;architecture APIC (Advanced Programmable Interrupt Controllers) (Intel 82093) à été ajoutée pour permettre une gestion plus fine des interruptions. En effet, dans un contexte multi-processeurs, il est nécessaire de pouvoir choisir quel processeur traitera quelle interruption pour ne pas rester figé dans l&#039;ancien modèle (PIC) où le processeur de  « boot » est assigné à un ensemble d&#039;interruptions. &lt;br /&gt;
&lt;br /&gt;
De plus, l&#039;architecture APIC apporte une gestion de 24 interruptions, une gestion de priorité des interruptions et le routage de l&#039;interruption sur le bon processeur, contre un simple routage de 2*8 interruptions dans le modèle PIC sur un seul processeur. Depuis une dizaine d&#039;années, Intel propose le modèle APIC comme nouvelle architecture, y compris pour les systèmes mono-processeurs. Les ordinateurs récents, y compris les portables, sont maintenant équipés uniquement de composants APIC même si l&#039;on peut obtenir un comportement de type PIC avec ceux-ci.&lt;br /&gt;
&lt;br /&gt;
L&#039;architecture APIC est constituée d&#039;un ou plusieurs composants situé physiquement dans le southbridge (IO-APIC), généralement un par bus, et un composant situé dans le processeur : le Local APIC (LAPIC). Le LAPIC va permettre la gestion des interruptions au niveau du processeur local. Il permet aussi de générer des interruptions par exemple pour transmettre des interruptions à des processeurs voisins dans le contexte d&#039;un système multi-processeurs, ces messages sont appelés IPI (Inter Processor Interrupts). &lt;br /&gt;
&lt;br /&gt;
De plus le Local APIC (LAPIC) inclut un « timer » de précision cadencé à la fréquence du bus, généralement il peut être utilisé par l&#039;ordonnanceur de votre système d&#039;exploitation favori ou d&#039;autres outils de haut niveau (profiler kernel : oprofile, vtune). Les LAPIC et l&#039;IO-APIC sont reliés par un bus spécifique pour permettre un échange rapide des informations. &lt;br /&gt;
&lt;br /&gt;
Schema logique d&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
[[image:acpi.jpg]]&lt;br /&gt;
&lt;br /&gt;
Les IO-APIC vont donc se charger de collecter les interruptions provenant des périphériques systèmes et d&#039;en assurer le transfert vers le ou les processeur(s) suivant une route préalablement programmée par le BIOS et/ou le système d&#039;exploitation.&lt;br /&gt;
&lt;br /&gt;
Cependant, l&#039;implémentation des APIC dans les BIOS peut provoquer certaines instabilités sur votre système Linux. Par expérience, il n&#039;y a pas de règle pour trouver la configuration qui peut aider votre machine à se stabiliser car cela dépend de chaque machine. Des différences peuvent même exister entre  deux versions de BIOS d&#039;un même ordinateur. Cependant, dans la série 2.6 du noyau Linux et les version 2.4 récentes nous disposons d&#039;outils permettant de re-paramétrer cette configuration en activant/désactivant les IO-APIC ou les LAPIC.&lt;br /&gt;
&lt;br /&gt;
Chaque composant possède un activateur ou un inhibiteur, on aura donc d&#039;un coté « apic » et « noapic » pour la gestion des IO-APIC, « nolapic » et « lapic » de l&#039;autre pour la gestion des LAPIC. Ces 4 options sont à utiliser sur la ligne de commande du noyau, c&#039;est à dire au moment où le « bootloader » (lilo ou grub par exemple) va charger le noyau en mémoire. L&#039;utilisation de « apic » et « lapic » permet d&#039;activer ces composants qui ne l&#039;ont pas été par le BIOS. L&#039;activateur « apic » n&#039;est disponible que les architectures de type x86_64 car celui-ci est déjà activé sur les systèmes de type x86. On désactivera les APIC dans le cas où le système affiche des messages d&#039;erreurs sur les APIC comme : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;« APIC error on CPU0: 40(40) »&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ou&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;MP-BIOS bug: 8254 timer not connected to IO-APIC&lt;br /&gt;
failed.&lt;br /&gt;
timer doesn&#039;t work through the IO-APIC - disabling NMI Watchdog!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La désactivation des IO-APIC permet par exemple de corriger le comportement parfois récalcitrant de certaines cartes vidéos qui ne parviennent pas à afficher correctement en mode 2D/3D (écran noir par exemple).&lt;br /&gt;
&lt;br /&gt;
La non activation des LAPIC peut avoir comme conséquence un dysfonctionnement de l&#039;ACPI (gestion d&#039;énergie avancée). Ce cas est traité par le noyau, vous retrouverez dans les messages de démarrage la ligne suivante : « &amp;quot;Local APIC disabled by BIOS you can enable it with lapic ».&lt;br /&gt;
&lt;br /&gt;
Pour résumer, si votre machine, en général à architecture mono-processeur, a tendance à se bloquer lors de l&#039;utilisation de périphériques tels que le port usb, la carte graphique ou la carte son, essayez de désactiver le LAPIC puis l&#039; IO-APIC puis les 2.  Pour exemple, les cartes mère A7N8X de chez Asus ont largement tendance à se bloquer si l&#039;on ne spécifie pas « nolapic » lors du boot. Sur certaines machines, il faudra faire le contraire à savoir forcer l&#039;activation des LAPIC. Ceci dépendra de votre machine et de sa conception.&lt;br /&gt;
&lt;br /&gt;
== A vos marques, rebootez ! ==&lt;br /&gt;
&lt;br /&gt;
Certains machines peuvent présenter quelques soucis pour redémarrer. Encore une fois, on retrouve au coeur de ce problème l&#039;interaction entre le noyau et le matériel notamment l&#039;ACPI. Les ordinateurs portables dont le modèle HP nc6120 ont par exemple le bon goût de rester bloqués sur le message « No reboot fixup found for your hardware ». Ceci indique que le noyau ne connaît pas de contournement pour ce matériel (ce qui est le cas de la quasi totalité des ordinateurs) mais puisque vous voyez ce message c&#039;est que votre machine n&#039;a pas réussi à rebooter. Heureusement, il existe des contournements pour permettre un redémarrage plus « bas niveau ». Le noyau défini les modes suivants : « b » « c » « h » « s » et « w ».&lt;br /&gt;
Le mode de reboot peut être défini sur la ligne de commande du noyau suivant la forme « reboot=&amp;lt;mode&amp;gt; ». Le mode « s » est réservé au systèmes multi-processeurs, elle va réinitialiser chacun des processeurs.&lt;br /&gt;
&lt;br /&gt;
Le mode « b » permet quant à lui de rebooter en faisant un appel direct au bios qui se chargera de faire redémarrer la machine. Ce mode fonctionne plutôt bien car dans le cas d&#039;un BIOS posant problème sur l&#039;ACPI, on peut espérer avoir un reboot correct. C&#039;est le cas sur de notre portable cité précédement.&lt;br /&gt;
&lt;br /&gt;
Le mode « h » se chargera de faire redémarrer la machine en réinitialisant le processeur. C&#039;est l&#039;équivalent du mode « s » pour les environnements mono-processeurs.  Pour finir, les modes « c » et « w » correspondent aux modes « cold » et « warn » : ces modes sont plus connus sous le nom de « reboot à froid »  et « reboot à chaud ». Le premier effectuera les tests de mémoire tandis que le second exécutera un reboot plus court.&lt;br /&gt;
&lt;br /&gt;
De manière générale, on utilisera plutôt le mode « b » ou « h » pour les systèmes mono-processeurs récalcitrant et le mode « s » pour les systèmes multi-processeurs.&lt;br /&gt;
&lt;br /&gt;
== Toujours plus de performance ==&lt;br /&gt;
Votre configuration est bien stable depuis un certain temps. Toutefois vous trouvez qu&#039;elle est un peu lente, elle ne vous donne pas satisfaction par rapport à ce qu&#039;elle devrait fournir.&lt;br /&gt;
Cette partie de l&#039;article va explorer comment vérifier et corriger les problèmes de performance des différents composants.&lt;br /&gt;
Note: certaines configuration mono-processeur nécessitent de désactiver LAPIC (nolapic)&lt;br /&gt;
&lt;br /&gt;
=== Le disque dur ===&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le disque dur semble un peu lent et pénalise le système dans son ensemble. Hdparm est là pour vous aider à y voir plus clair. Hdparm est à l&#039;origine conçu pour les systèmes de disques IDE de type PATA. Le nouveau système de disque SATA, ne permet pas toujours en fonction de l&#039;implémentation, l&#039;appel à toutes ces astuces. Cependant les nouvelles séries de kernel à partir du 2.6.15 devrait permettre une gestion plus unifiée des systèmes de disques PATA et SATA.&lt;br /&gt;
&lt;br /&gt;
Le test « hdparm -t /dev/&amp;lt;mon_device&amp;gt; » permet de tester la vitesse de lecture depuis le disque dur jusqu&#039;en mémoire. Une valeur de 25Mo/sec est un minimum pour des machines récentes. Plusieurs paramètres peuvent influencer les performances d&#039;un disque IDE. &lt;br /&gt;
La commande « hdparm -cd » permet de vérifier que les entrées/sorties sont réalisées en 16-bit (le mode 32-bit n&#039;offre pas de performance supplémentaire) alors que le DMA (Direct Memory Access) est activé. Ceci permet la minimisation de l&#039;utilisation du processeur pendant les accès au disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -cd /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
 IO_support   =  0 (default 16-bit)&lt;br /&gt;
 using_dma    =  1 (on)&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande « hdparm -c0d1 /dev/&amp;lt;mon_device&amp;gt; » permet de configurer le périphérique dans ce mode. Le noyau de votre distribution Linux devrait le réaliser de manière automatique.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -I » permet d&#039;obtenir plus d&#039;informations sur la configuration de votre disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -I /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
ATA device, with non-removable media&lt;br /&gt;
	Model Number:       FUJITSU MHT2040AT                       &lt;br /&gt;
	Serial Number:      NN77T3C13KB9&lt;br /&gt;
	Firmware Revision:  0022    &lt;br /&gt;
Standards:&lt;br /&gt;
	Used: ATA/ATAPI-6 T13 1410D revision 3a &lt;br /&gt;
	Supported: 6 5 4 3 &lt;br /&gt;
Configuration:&lt;br /&gt;
	Logical		max	current&lt;br /&gt;
	cylinders	16383	16383&lt;br /&gt;
	heads		16	16&lt;br /&gt;
	sectors/track	63	63&lt;br /&gt;
	--&lt;br /&gt;
	CHS current addressable sectors:   16514064&lt;br /&gt;
	LBA    user addressable sectors:   78140160&lt;br /&gt;
	device size with M = 1024*1024:       38154 MBytes&lt;br /&gt;
	device size with M = 1000*1000:       40007 MBytes (40 GB)&lt;br /&gt;
Capabilities:&lt;br /&gt;
	LBA, IORDY(cannot be disabled)&lt;br /&gt;
	bytes avail on r/w long: 4	Queue depth: 1&lt;br /&gt;
	Standby timer values: spec&#039;d by Standard, no device specific minimum&lt;br /&gt;
	R/W multiple sector transfer: Max = 16	Current = 16&lt;br /&gt;
	Advanced power management level: 128 (0x80)&lt;br /&gt;
	Recommended acoustic management value: 254, current value: 254&lt;br /&gt;
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 &lt;br /&gt;
	     Cycle time: min=120ns recommended=120ns&lt;br /&gt;
	PIO: pio0 pio1 pio2 pio3 pio4 &lt;br /&gt;
	     Cycle time: no flow control=240ns  IORDY flow control=120ns&lt;br /&gt;
Commands/features:&lt;br /&gt;
	Enabled	Supported:&lt;br /&gt;
	   *	READ BUFFER cmd&lt;br /&gt;
	   *	WRITE BUFFER cmd&lt;br /&gt;
	   *	Host Protected Area feature set&lt;br /&gt;
	   *	Look-ahead&lt;br /&gt;
	   *	Write cache&lt;br /&gt;
	   *	Power Management feature set&lt;br /&gt;
		Security Mode feature set&lt;br /&gt;
	   *	SMART feature set&lt;br /&gt;
	   *	Mandatory FLUSH CACHE command &lt;br /&gt;
	   *	Device Configuration Overlay feature set &lt;br /&gt;
	   *	Automatic Acoustic Management feature set &lt;br /&gt;
	   *	SET MAX security extension&lt;br /&gt;
		Power-Up In Standby feature set&lt;br /&gt;
	   *	Advanced Power Management feature set&lt;br /&gt;
	   *	DOWNLOAD MICROCODE cmd&lt;br /&gt;
	   *	SMART self-test &lt;br /&gt;
	   *	SMART error logging &lt;br /&gt;
Security: &lt;br /&gt;
		supported&lt;br /&gt;
	not	enabled&lt;br /&gt;
	not	locked&lt;br /&gt;
		frozen&lt;br /&gt;
	not	expired: security count&lt;br /&gt;
	not	supported: enhanced erase&lt;br /&gt;
	40min for SECURITY ERASE UNIT. &lt;br /&gt;
HW reset results:&lt;br /&gt;
	CBLID- above Vih&lt;br /&gt;
	Device num = 0 determined by the jumper&lt;br /&gt;
Checksum: correct&lt;br /&gt;
[root@R1 ~]#&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On y retrouve le modèle, le numéro de série et la version du firmware qui peuvent être utiles en cas de contact avec le Service Après-Vente ou de mise à jour pour une série de firmwares défaillante.&lt;br /&gt;
&lt;br /&gt;
La ligne commençant par « DMA » dans la partie « Capabilities » permet d&#039;afficher la vitesse de transfert négociée entre le disque dur et le driver IDE de Linux. L&#039;étoile précède la valeur actuelle. Dans cet exemple, le mode udma5 est sélectionné : ceci est conforme aux machines disponibles sur le marché depuis environ 3 ans.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, voici le tableau de conversion entre le mode DMA et la vitesse maximale associée.&lt;br /&gt;
&lt;br /&gt;
Type de fonctionnement&lt;br /&gt;
Vitesse Maximale en MO/sec&lt;br /&gt;
UltraDMA 0&lt;br /&gt;
16,6&lt;br /&gt;
UltraDMA 1&lt;br /&gt;
25&lt;br /&gt;
UltraDMA 2&lt;br /&gt;
33,3&lt;br /&gt;
UltraDMA 3&lt;br /&gt;
44,4&lt;br /&gt;
UltraDMA 4&lt;br /&gt;
66,6&lt;br /&gt;
UltraDMA 5&lt;br /&gt;
100&lt;br /&gt;
UltraDMA 6&lt;br /&gt;
133,33&lt;br /&gt;
&lt;br /&gt;
Une configuration actuelle ne devrait pas être en dessous de UDMA5. Si ce n&#039;était pas le cas, on peut essayer de renégocier la vitesse de transfert à l&#039;aide de la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hdparm -X udma5 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celle-ci permet de forcer le mode UltraDMA5. Il faut utiliser cette commande avec précaution car elle pourrait générer des pertes ou de la corruption de données en cas de transfert pendant ce changement de mode.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi impacter les performances de votre disque dur en modifiant sa vitesse de rotation. Cette fonctionnalité connue sous le nom de Automatic Acoustic Management (AAM) est utilisable avec l&#039;option « -M » de hdparm. La valeur 128 représentera la vitesse la plus faible avec un disque silencieux, la valeur 254 la vitesse la plus élevée mais avec comme contre-partie un disque plus bruyant. On pourra noter des différences de quelques Mo/sec selon les configurations.&lt;br /&gt;
&lt;br /&gt;
Il est aussi à noter que l&#039;utilisation de logiciels permettant une meilleure gestion d&#039;énergie (cpufreq, laptop-mode) peut dégrader les performances d&#039;un disque dur de manière notable.&lt;br /&gt;
&lt;br /&gt;
=== Configuration bas niveau du réseau ===&lt;br /&gt;
&lt;br /&gt;
Le réseau local filaire peut parfois être un peu lent. Voici quelques tests pour vérifier si la lenteur provient du logiciel, du noyau ou du matériel. Tout d&#039;abord, explorons la trousse à outils indispensable pour analyser votre carte réseau : ethtool. Digne successeur de mii-tool, il permet de s&#039;informer sur la configuration de votre carte réseau. &lt;br /&gt;
&lt;br /&gt;
Il suffit de lancer « ethtool &amp;lt;votre_interface&amp;gt; » » pour obtenir la configuration matérielle de votre carte. On y retrouve les modes supportés par votre carte (Supported Link Modes ainsi que la vitesse actuelle (Speed), obtenue par auto-négociation dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
On peut également savoir si le câble réseau est connecté à la carte grâce à la ligne « Link Detected ». Le type de « duplex » utilisé permet également de savoir si la négociation avec l&#039; élément actif au bout de votre câble (commutateur, concentrateur ou une autre machine) a correctement fonctionné. Le duplex définit le mode de  transmission : le mode half-duplex indique que l&#039;on émet puis on reçoit des données, le mode full-duplex indique que l&#039;on peut émettre et recevoir en même temps des données. Le mode full-duplex est donc plus que recommandé pour vos équipements réseaux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# ethtool  eth1&lt;br /&gt;
Settings for eth1:&lt;br /&gt;
	Supported ports: [ TP MII ]&lt;br /&gt;
	Supported link modes:   10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Supports auto-negotiation: Yes&lt;br /&gt;
	Advertised link modes:  10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Advertised auto-negotiation: Yes&lt;br /&gt;
	Speed: 100Mb/s&lt;br /&gt;
	Duplex: Full&lt;br /&gt;
	Port: MII&lt;br /&gt;
	PHYAD: 1&lt;br /&gt;
	Transceiver: internal&lt;br /&gt;
	Auto-negotiation: on&lt;br /&gt;
	Current message level: 0x000020c1 (8385)&lt;br /&gt;
	Link detected: yes&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesurer les {contre}performances de votre réseau ===&lt;br /&gt;
&lt;br /&gt;
Une fois vérifiée la bonne configuration de votre matériel, nous pouvons passer à la vérification des performances entre deux machines.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire netpipe (http://www.scl.ameslab.gov/netpipe/) permet de réaliser des tests de performance mais aussi d&#039;intégrité entre deux machines. Il permet de tester les performances du réseau au travers la couche IP et non pas depuis un mode plus bas niveau comme pourrait l&#039;être un test utilisant directement le driver Ethernet. Ce test permet donc de valider que la configuration matérielle mais aussi logicielle est correcte.&lt;br /&gt;
&lt;br /&gt;
Sur la première machine, exécutez « NPtcp » : netpipe se positionne en mode « serveur ».&lt;br /&gt;
Sur la seconde machine, exécutez « NPtcp -h &amp;lt;machine1&amp;gt; » : netpipe se connecte au serveur netpipe de la machine nommée machine1 pour effectuer le test de performance.&lt;br /&gt;
&lt;br /&gt;
Le test par défaut teste les communication allant de 1 octet jusqu&#039;à 8 Mo. Il peut prendre plusieurs minutes si le réseau est « lent ». Le test va montrer pour chaque taille de paquet la performance obtenue. Il est normal d&#039;obtenir des performances faibles pour des paquets d&#039;une taille inférieure à 8 Ko. Transporter des petits paquets nécessite de réaliser beaucoup d&#039;opérations pour le processeur pour une quantité d&#039;information minime. Les performances seront meilleures à partir d&#039;environ 16 Ko et maximales à partir de 128 Ko. Sur un système utilisant du gigabit ethernet, on constatera une performance de 39Mbps à 256 octets, 287Mbps à 4Ko, 614Mbps à 16Ko, 845Mbps à 128Ko, 895Mbps à 8Mo.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ainsi vérifier et comparer facilement les performances de votre configuration réseau. Netpipe permet également de tester la vitesse du réseau pour une taille de paquets définie entre la taille indiqué par l&#039;option « -l » et la taille indiquée par l&#039;option « -u ». Ainsi, NPtcp -l 16384 -u 16384 permet de tester la bande passante réseau pour une taille de paquet égale à 16Ko.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -n &amp;lt;nb-cycle&amp;gt; » permet de définir le nombre de boucles à réaliser pour le test (50 par défaut). Enfin, pour réaliser des tests « full-duplex », on utilisera l&#039;option « -2 ». Ce test permet de s&#039;assurer du bon fonctionnement du mode de communication permettant l&#039;écriture et la lecture simultanées.&lt;br /&gt;
&lt;br /&gt;
Attention, même si ce test donne de bons résultats, cela ne veut pas dire que la configuration est exempte d&#039;erreur de configuration. Par exemple, les performances réseaux peuvent être très bonnes en point à point mais mauvaises lorsque l&#039;on aura une charge réseau avec plusieurs clients. Dans cette situation, il faut vérifier que le contrôle de flux est bien activé sur toutes les machines. L&#039;option « ethtool -a » permet de vérifier que les champs « rx » et « tx » sont placés sur « on ». Si ce n&#039;était pas le cas activez-les avec la commande « ethtool -A eth0 rx on » et « ethtool -A eth0 tx on ».&lt;br /&gt;
&lt;br /&gt;
Les cartes réseaux, des serveurs essentiellement, permettent maintenant de réaliser le « tcp segment offload ». Cette technique permet de décharger une partie du traitement TCP directement dans l&#039;électronique de la carte réseau. Ceci à pour effet de décharger le processeur central d&#039;un traitement fastidieux. L&#039;option « -k » d&#039;ethtool permet de consulter l&#039;état de cette fonctionnalité (off/on). On pourra l&#039;activer sur des serveurs générant un gros trafic réseau par exemple : « ethtool -K eth0 tso on ».&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant équipé de nouveau outils pour traquer la perte de performances de votre installation réseau. Ceci couplé aux habituels tcpdump/ethereal, voilà une belle panoplie du zorro du réseau.&lt;br /&gt;
&lt;br /&gt;
=== Quand la latence s&#039;en mêle ===&lt;br /&gt;
&lt;br /&gt;
La latence représente le temps nécessaire à un système pour prendre en compte un événement.&lt;br /&gt;
&lt;br /&gt;
Il arrive que certains périphériques de votre machine nécessitant des débits importants ou une latence assez faible sur le bus PCI soient « poussifs ». On retrouve dans cette catégorie les cartes vidéos accélératrice 3D, les cartes son et les cartes d&#039;acquisition firewire ou DVB (récepteur de télévision numérique terrestre : TNT).&lt;br /&gt;
&lt;br /&gt;
Un périphérique branché sur le bus PCI doit attendre que le bus soit libre pour émettre les données vers la mémoire centrale. Le bus PCI qui est le coeur de communication des périphériques est donc soumis en permanence à un arbitrage qui permet de décider qui doit émettre des données et qui doit attendre. Cet arbitrage est en partie réalisé grâce au « latency_timer ».&lt;br /&gt;
&lt;br /&gt;
Chaque périphérique possède une valeur de « latency_timer » comprise en 0 et 248 cycles d&#039;horloge du bus. Plus la valeur sera importante plus le périphérique disposera de temps pour transmettre des informations. Une latence de 248 cycles permet d&#039;obtenir une priorité forte sur le bus, ce qui permet un débit important. A contrario, une latence de 0 indiquera au périphérique qu&#039;il doit cesser ses transmissions si un autre composant à besoin du bus : ceci se traduira par une perte de bande passante importante.&lt;br /&gt;
&lt;br /&gt;
La configuration réalisée par défaut sur votre machine doit être correcte mais il peut arriver qu&#039;une carte 3D ou DVB soit configurée avec une latence trop faible, ce qui  aurait pour conséquence d&#039;offrir une image saccadée et peu fluide. Une carte son offrirait également le même type de symptômes avec un son hâché ou excessivement métallique.&lt;br /&gt;
&lt;br /&gt;
Heureusement, une série d&#039;outils est là pour vous aider à diagnostiquer le problème mais aussi à le résoudre. Le projet pciutils  (http://atrey.karlin.mff.cuni.cz/~mj/linux.shtml#pciutils) contient deux outils indispensables: lspci et setpci. Bien entendu, votre distribution favorite devrait posséder ce logiciel, il vous suffira de l&#039;installer avec  votre gestionnaire de paquet favori (urpmi, apt, smart).&lt;br /&gt;
&lt;br /&gt;
La commande « lspci » vous permet de lister les périphériques PCI disponibles sur votre ordinateur (cf article paru dans le numéro 68).  Cet exemple se basera sur une carte vidéo  ayant pour adresse sur le bus PCI « 01:00.0 ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@lagirafe] lspci -v -s 01:00.0&lt;br /&gt;
01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go5200 32M/64M] (rev a1) (prog-if 00 [VGA])&lt;br /&gt;
	Subsystem: Samsung Electronics Co Ltd: Unknown device c00f&lt;br /&gt;
	Flags: bus master, 66Mhz, medium devsel, latency 16, IRQ 11&lt;br /&gt;
	Memory at c8000000 (32-bit, non-prefetchable) [size=16M]&lt;br /&gt;
	Memory at d8000000 (32-bit, prefetchable) [size=128M]&lt;br /&gt;
	Expansion ROM at &amp;lt;unassigned&amp;gt; [disabled] [size=128K]&lt;br /&gt;
	Capabilities: [60] Power Management version 2&lt;br /&gt;
	Capabilities: [44] AGP version 3.0&lt;br /&gt;
[root@lagirafe]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On retiendra dans cette ligne, la valeur &#039;latency 16&#039;. Ceci risque de poser problème lorsque celle-ci aura besoin d&#039;un fort débit pendant un jeu par exemple. Augmenter la latence va donc se révéler nécessaire pour ce périphérique.&lt;br /&gt;
&lt;br /&gt;
La commande setpci permet de modifier les paramètres PCI d&#039;un périphérique ou d&#039;un bus complet avec tous ses périphériques. &lt;br /&gt;
&lt;br /&gt;
La commande « setpci -v -d 01:* latency_timer=20 » permet de positionner tous les périphériques  du bus 01 à une valeur de 32 cycles. Il est à noter que la commande setpci utilise des valeurs en hexadécimal mais lspci affichera les valeurs en décimal.&lt;br /&gt;
&lt;br /&gt;
Pour en revenir à nos moutons, la correction de la latence de cette carte graphique se fera avec la commande «  setpci -v -d 01:00.0 latency_timer=f8 ». Ceci positionne donc la carte sur la plus grande valeur de latence possible, ce qui lui garantira la plus grande bande passante possible. Il est possible d&#039;utiliser la valeur « ff » comme paramètre pour « latency_timer » mais celui-ci sera converti à la volée par la commande setpci en « 0xf8 ».&lt;br /&gt;
&lt;br /&gt;
Attention, certains composants de votre machine doivent rester en « latency_timer=0 » pour garantir une bon fonctionnement de votre système : il ne faudra donc pas modifier les latences des contrôleurs mémoire et des ponts PCI connectés généralement sur le bus « 0:* ».&lt;br /&gt;
&lt;br /&gt;
== DSDT : le cauchemar continue ! ==&lt;br /&gt;
&lt;br /&gt;
Cette partie de l&#039;article a pour but d&#039;expliquer le problème que peut représenter la table DSDT pour un certain nombre de machines et surtout les ordinateurs portables. &lt;br /&gt;
&lt;br /&gt;
La norme ACPI 3.0 de Septembre 2004 disponible gratuitement à l&#039;adresse http://www.acpi.info/DOWNLOADS/ACPIspec30.pdf définit la DSDT comme une table remplie par un OEM permettant au système d&#039;exploitation de découvrir les ressources pour la gestion de l&#039;énergie avancée, de la gestion thermique ainsi que la gestion du Plug&#039;nPlay des ressources définies par l&#039;ACPI.&lt;br /&gt;
&lt;br /&gt;
Voici une description certes un peu théorique mais nécessaire pour bien comprendre la problématique et ses conséquences. Le constructeur de l&#039;ordinateur doit donc définir dans le BIOS une table contenant une liste de ressources et leurs configuration et ce pour que le système d&#039;exploitation puisse s&#039;en servir. Noble cause n&#039;est il pas ? Tout au long des 618 pages de ce document sont spécifiés les éléments du langage à utiliser ainsi que sa syntaxe. L&#039; « ACPI Source Language » permettra donc aux développeurs d&#039;écrire des DSDT puis de les compiler dans un format nommé « ACPI Machine Language » en utilisant un compilateur adéquat. Le système d&#039;exploitation utilisera la table compilée (AML) pour accéder aux ressources ACPI. &lt;br /&gt;
Sur la plupart des ordinateurs portables, la table DSDT ne respecte pas la norme ACPI dans sa syntaxe. Ceci est très gênant car cela bloque le code de l&#039;interpréteur ACPI du noyau Linux qui essaie de la lire. Le résultat est sans appel, pas d&#039;ACPI, pas de gestion d&#039;énergie avancée, plus de ventilation automatique sur certains modèles d&#039;ordinateurs, plus de touche de gestion de contraste/luminosité sur d&#039;autres etc...&lt;br /&gt;
&lt;br /&gt;
Ceci est très gênant sur un ordinateur portable. Alors que faire ? Dans un premier temps, prévenir le constructeur que son BIOS est incorrect et ne respecte pas la norme ACPI. La réponse se fait toujours attendre pour tous ceux qui « osent » poser la question au support technique : à savoir, les constructeurs ignorent tout simplement les mails de ce type.&lt;br /&gt;
La seconde étape puisque vous êtes devant le fait accompli d&#039;une machine non conforme, il va falloir corriger cette table. Il suffit de récupérer la table actuelle via la commande &#039;cat /proc/acpi/dsdt &amp;gt; dsdt.aml&#039; si vous avez la chance d&#039;avoir un répertoire /proc/acpi malgré une table DSDT endommagée, sinon utilisez la commande &#039;acpidump -b -t dsdt -o dsdt.aml&#039;. La commande acpidump est  fournit dans le projet pmtools (ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools-20050926.tar.bz2) &lt;br /&gt;
Vous avez donc extrait la table DSDT de votre système. Il ne reste plus qu&#039;à essayer de la recompiler. Pour cela, le compilateur IASL de la société Intel (http://developer.intel.com/technology/iapc/acpi/downloads.htm) offre sous Linux et Windows une plate-forme de compilation pour le langage ASL.&lt;br /&gt;
&lt;br /&gt;
Suivez les instructions du site pour télécharger et compiler la version unix d&#039;iasl. Ensuite, décompilez la table avec la commande « iasl -d dsdt.aml ». Le fichier dsdt.dsl vient d&#039;être créé par le décompilateur. Il suffit de le recompiler avec la commande « iasl -tc dsdt.dsl » pour constater les dégâts ! La DSDT que vous avez dans votre BIOS est généralement compilée par le compilateur de Microsoft qui semble autoriser une syntaxe plus qu&#039;approximative.&lt;br /&gt;
Si vous avez de la chance, votre DSDT s&#039;est recompilée sans erreurs, vous obtenez donc un fichier dsdt.hex et un fichier dsdt.aml. Il ne reste plus qu&#039;à injecter cette dsdt dans le noyau Linux et le tour sera joué.&lt;br /&gt;
&lt;br /&gt;
Si vous avez moins de chance, votre DSDT est syntaxiquement incorrecte et génère des erreurs. Les expliquer plus en détails nécessiterait un article complet, il ne sera cité que les plus « habituelles » (sic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2626:                     Field (ECR, DWordAcc, Lock, Preserve) &lt;br /&gt;
Error    1048 -                              ^ Host Operation Region requires ByteAcc access &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette erreur présente à ligne 2626 du fichier dsdt.asl indique une erreur de type dans la déclaration du champ ECR. Il suffit dans ce cas de changer le mot « DWordAcc » par « ByteAcc ». Celle-ci reste assez simple à corriger, on se demande donc pourquoi les constructeurs ne prennent pas le temps de vérifier et de corriger leur BIOS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2672:                     Method (_GLK, 1, NotSerialized) &lt;br /&gt;
Warning  2024 -                                ^ Reserved method has too many arguments ( _GLK requires 0) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode _GLK n&#039;a besoin que de 0 paramètre tandis que ce code en utilise 2 ! La correction est assez simple : il suffit de remplacer la ligne 2672 par « Method(_GLK) ».&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur la correction des erreurs de compilation de votre table dsdt, je vous recommande les tutoriaux disponibles depuis la page http://acpi.sourceforge.net/dsdt/index.php du projet ACPI.&lt;br /&gt;
&lt;br /&gt;
Votre DSDT est compilée avec succès, il ne vous reste plus qu&#039;à l&#039;ajouter pour que votre noyau puisse l&#039;utiliser à la place de celle fourni par le BIOS (modifiable uniquement par le constructeur, via une mise à jour).&lt;br /&gt;
&lt;br /&gt;
Il existe trois possibilités pour inclure une table DSDT : la modification du noyau Linux ( noyau &amp;lt; 2.6.9), l&#039;injection de la DSDT dans la configuration du noyau (noyau &amp;gt;= 2.6.9), l&#039;intégration de la table DSDT dans l&#039;initrd qui nécessite un patch kernel disponible à l&#039;adresse http://gaugusch.at/kernel.shtml.&lt;br /&gt;
&lt;br /&gt;
Pour les noyaux 2.6.9 et supérieur, copiez votre fichier dsdt.hex sous le nom «/usr/src/linux/include/acpi/dsdt_table.h » puis reconfigurez votre noyau.&lt;br /&gt;
Insérer « dsdt_table.h » dans l&#039;option « Include you custom DSDT » disponible dans le menu « Power Management/ACPI/ ». Recompilez votre noyau et redémarrez avec votre nouveau noyau.&lt;br /&gt;
Pour les noyaux inférieurs à 2.6.9, il est possible de modifier le code source de votre noyau pour intégrer votre DSDT mais il est préférable d&#039;utiliser le patch permettant l&#039;insertion de la table DSDT dans l&#039;initrd. Recompilez votre noyau avec ce patch, puis suivez la procédure décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Certaines distributions Linux comme « Mandriva Linux » possèdent le patch qui permet de n&#039;avoir qu&#039;à reconstruire l&#039;initrd avec la commande « mkinitrd –dsdt=/boot/dsdt.aml /boot/initrd-`uname -r`.img `uname -r`  » puis de relancer lilo avant de redémarrer votre machine. Lors du démarrage de celle-ci vous devriez voir le message suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ACPI: Looking for DSDT in initrd... found (at offset 0x4f8d9).&lt;br /&gt;
ACPI-0294: *** Info: Table [DSDT] replaced by host OS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant avec une table DSDT correcte et un ACPI fonctionnel. La question qui reste ouverte est pourquoi les constructeurs n&#039;utilisent pas un compilateur digne de ce nom pour permettre à leur clients de pouvoir utiliser d&#039;autres systèmes d&#039;exploitation que Windows de Microsoft. &lt;br /&gt;
&lt;br /&gt;
Pour la petite histoire, si vous cherchez dans votre dsdt vous risquez de tomber ce genre de lignes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows NT&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft WindowsME: Millennium Edition&amp;quot;), Zero))&lt;br /&gt;
 If (LEqual (SizeOf (\_OS), 0x27)) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque qu&#039;un système d&#039;exploitation souhaite utiliser les ressources ACPI du BIOS, il utilise son nom de système d&#039;exploitation (acpi_os_name). On retrouve donc dans les bios des parties qui ne seront exécutées que pour certains systèmes d&#039;exploitation de Microsoft. On retrouve même certains tests où c&#039;est la longueur du nom qui compte...... Ceci prouve bien que les constructeurs d&#039;ordinateurs savent corriger des tables DSDT pour les systèmes d&#039;exploitation mais pas forcément pour le notre malheureusement. Depuis le noyau 2.6.9, le noyau Linux utilise « Windows NT » comme « acpi_os_name »  pour assurer une meilleure compatibilité matérielle dixit Len Bron d&#039;Intel dans le changelog de cette version.&lt;br /&gt;
&lt;br /&gt;
== Comment trouver le pilote qui va avec votre matériel ? ==&lt;br /&gt;
&lt;br /&gt;
Cette question on se la pose souvent mais uniquement lorsque l&#039;on essaye de brancher un nouveau périphérique sur sa machine. Les distributions récentes permettent de détecter automatiquement votre matériel et de lui associer un pilote avec sa configuration. Ce mécanisme fonctionne plutôt bien mais cela n&#039;évite pas les dysfonctionnements voir l&#039;absence de fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Pour vérifier si votre noyau Linux est capable de supporter un nouveau périphérique PCI par exemple, il suffit d&#039;en récupérer les identifiants PCI (constructeur et produit) puis de les rechercher dans le fichier « /lib/modules/`uname -r`/modules.pcimap » qui est auto-généré lors de la commande depmod.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire « lspcidrake -v » vous permet de trouver les identifiants PCI de votre carte, la commande « lspci » vous permet de trouver le nom de votre périphérique puis faites un « lspci -n » pour en trouver la correspondance numérique. On utilisera la position du périphérique sur le bus pour retrouver la correspondance numérique « 02:05.0 » dans cet exemple.&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome] lspci&lt;br /&gt;
[....]&lt;br /&gt;
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)&lt;br /&gt;
[root@pumphome] lspci -n&lt;br /&gt;
[...]&lt;br /&gt;
02:05.0 Class 0200: 14e4:4401 (rev 01)&lt;br /&gt;
[root@pumphome]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi cette carte réseau possède les identifiants 14e4 (constructeur) et 4401 (produit). Il suffit de rechercher cette valeur dans le modules.pcimap, ce qui nous donnera la correspondance en module (pilote).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome]  grep &amp;quot;0x000014e4 0x00004401&amp;quot; /lib/modules/2.6.12-12mdk-i686-up-4GB/modules.pcimap &lt;br /&gt;
b44               0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
bcm4400      0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit ici que cette carte peut utiliser le driver b44 ou le driver bcm4400. On ne trouve pas toujours les identifiants PCI de produit sous leur forme directe, on peut également trouver « 0Xffffffff » qui indique que tous les cartes du constructeur sont gérées par un module.&lt;br /&gt;
Il ne vous restera plus qu&#039;à effectuer la configuration associée à ce périphérique pour qu&#039;il fonctionne correctement.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
La fin de cet article conclut une toute petite série de deux articles ayant pour but de vulgariser l&#039;architecture de nos machines, de découvrir les outils disponibles pour mieux comprendre leur configuration et au besoin régler les problèmes de configuration matérielle qui ont souvent le don de nous pourrir la vie.&lt;br /&gt;
&lt;br /&gt;
Merci à LaurentJ de #Mandrivafr pour ses tests complémentaires sur les problèmes d&#039;IO-APIC. Un énorme merci à Nicolas Planel pour sa relecture pointue et également Anne pour sa patience de girafe à relire et « quaurigé »mes « photes »,  ainsi qu&#039;à tous ceux qui m&#039;ont aidé à découvrir ce que je restitue dans cet article.&lt;br /&gt;
&lt;br /&gt;
Cet article a été publié dans Linux Magazine France n°78. Il est publié sur Léa avec l&#039;aimable autorisation de l&#039;éditeur.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=12782</id>
		<title>Proposition d&#039;article</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=12782"/>
		<updated>2006-06-11T20:32:17Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Rubrique : Matériel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Proposition d&#039;article =&lt;br /&gt;
Indiquer ici les articles qui manquent et que vous vous proposez de créer, puis créez les ! Si vous avez besoin de mettre des images dans votre article, n&#039;hésitez pas à demander à Léa les [[Lea_Linux:Groupe_Editeur|droit d&#039;éditeurs]]. &#039;&#039;&#039;Ne mettez pas&#039;&#039;&#039; des articles que vous désireriez voir écrits par quelqu&#039;un d&#039;autre que vous ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;cadre type=alert&amp;gt;&#039;&#039;&#039;Note :&#039;&#039;&#039; pour proposer un nouveau truc ou une nouvelle astuce, utiliser [[Trucs:Proposition_d&#039;un_truc|cette page]].&amp;lt;/cadre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il suffit d&#039;insérer dans la section qui correspond à votre article, quelque chose du genre : &lt;br /&gt;
* exemple : &amp;lt;nowiki&amp;gt;[[Nom de l&#039;article]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
qui donnera : &lt;br /&gt;
* exemple : [[Nom de l&#039;article]] (SVP ne créez pas l&#039;article &#039;&#039;&#039;Nom de l&#039;article&#039;&#039;&#039;).&lt;br /&gt;
== Rubrique : Installation ==&lt;br /&gt;
* [[UBUNTU et eagle-usb]] [[Utilisateur: mujma|Marc UJMA]]&lt;br /&gt;
* [[Guide d&#039;installation Linux SuSE 10.0 pas à pas]] leibowitz 29 janvier 2006&lt;br /&gt;
* [[Guide d&#039;installation et de configuration de Fluxbox,Conky, Idesk, Fbpager]] pingadaroça 31/01/06&lt;br /&gt;
&lt;br /&gt;
== Rubrique : X Window ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Logiciels ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Matériel ==&lt;br /&gt;
&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
&lt;br /&gt;
* [[Hardware-hard_plus-matos_bis]]&lt;br /&gt;
&lt;br /&gt;
== BarracudaDrive ==&lt;br /&gt;
 une serveur sécurisé par SSL en 1024 bits permettant l&#039;échange de très gros fichiers en toute confidentialité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Le réseau ==&lt;br /&gt;
* [[Streaming mp3 avec Icecast2 et ices]]. --[[Utilisateur:CoKe|CoKe]] 4 avr 2006 à 16:04 (CEST)&lt;br /&gt;
* [[Debian GNU/Linux et IPv6]]. [[Utilisateur: Thomas Carlu|Thomas Carlu]] 25 oct 2005 à 1:15 (CEST)&lt;br /&gt;
* [[Sécurité des réseaux WIFI]]. --[[Utilisateur:Maston28|Maston28]] 13 nov 2005 à 16:30 (CET)&lt;br /&gt;
* [[Configurer le wifi avec une livebox, freebox etc...]] par Samiche, avril 2006&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
* [[Tunnels ethernet avec openssh]]. --[[Utilisateur:Misc|Misc]] 12 fév 2006 à 13:30 (CET)&lt;br /&gt;
* [[Créer un point d&#039;accès sécurisé avec hostAPd]] --[[Utilisateur:Glandos|Glandos]] 26 avr 2006 à 23:16 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Administrer ==&lt;br /&gt;
* [[Arrêter Windows et son routeur Linux]], [[Utilisateur:Vivecom|Vivecom]] 26 nov 2005 à 16:40 (CET)&lt;br /&gt;
* [[S&#039;identifier par une clé USB]], [[Utilisateur:thomas debay]] 28 fév 2006&lt;br /&gt;
&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
* [[Gestion des ACL]] (ou [[ACL]] pour le titre). [[Utilisateur:Vincent Ramos|Vincent Ramos]] 24 oct 2005 à 23:00 (CEST)&lt;br /&gt;
::Fait. Bien qu&#039;améliorable, l&#039;article me semble complet. [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 00:22 (CEST) ;&lt;br /&gt;
* [[Attributs étendus]] (&#039;&#039;chattr&#039;&#039; sur ext2 et ext3, outils efs2progs) [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 17:40 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Noyau et modules ==&lt;br /&gt;
&lt;br /&gt;
* [[RT2500]] : compilation et installation du modules RT2500 Pour les cartes wifi , essai avec la carte &#039;&#039;&#039;PCI PC54G2&#039;&#039;&#039; , Auteur: Laplaine Freddy, Alias mr_pupu[corbeille]&lt;br /&gt;
&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
* [[HOWTO Dkms]] : Utiliser dkms pour gérer ses drivers dynamiquement et facilement&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Développer ==&lt;br /&gt;
&lt;br /&gt;
* [[Ocaml]] : une présentation du langage ocaml&lt;br /&gt;
*[[FreePascal]] : Un langage familier pour nombre de développeurs [[Utilisateur: mujma|Marc UJMA]]&lt;br /&gt;
*[[Trucs:Obtenir le code HTML d&#039;un glyphe]] [[Utilisateur:Nicola|Nicola]] 2 jan 2006 à 19:10 (CET)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Léavancé ==&lt;br /&gt;
&lt;br /&gt;
* [[Virtualisation avec Xen]]&lt;br /&gt;
* [[OpenMosix]] axé Slackware mais applicable à d&#039;autres distributions&lt;br /&gt;
* [[Compilation Distribuée]] ou comment accélérer ses compilations&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Fichier:Acpi.jpg&amp;diff=12781</id>
		<title>Fichier:Acpi.jpg</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Fichier:Acpi.jpg&amp;diff=12781"/>
		<updated>2006-06-11T20:31:15Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12780</id>
		<title>Découvrez les ressources de votre machine (La suite)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12780"/>
		<updated>2006-06-11T20:30:44Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* APIC es tu là ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Découvrez les ressources de votre machine (La suite) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A nouvelle année, nouvelles résolutions ! Paru dans le numéro 68, un premier article dédié à la découverte des outils disponibles pour la récupération des configurations de votre machine promettait une suite.  Je vous propose donc de reprendre ce voyage au centre de votre ordinateur. &lt;br /&gt;
&lt;br /&gt;
Cet article sera articulé autour du diagnostic de pannes et des correctifs associés mais aussi de « trucs &amp;amp; astuces » permettant d&#039;optimiser votre configuration.&lt;br /&gt;
&lt;br /&gt;
== Savez-vous planter les choux ? ==&lt;br /&gt;
&lt;br /&gt;
Les choux peut-être pas mais les ordinateurs je pense que c&#039;est arrivé au moins une fois à chaque lecteur qui lit cet article. Rien de plus énervant qu&#039;un écran qui se fige, le pointeur de souris qui ne se déplace plus, le clavier qui ne répond plus non plus.... Planté ! Ce constat est assez facile à établir mais en trouver la cause reste un problème nettement plus complexe tellement le nombre de causes possibles est important.&lt;br /&gt;
&lt;br /&gt;
Deux solutions : ignorer le problème et relancer le système en se disant que ça « passera », ou alors chercher la cause du problème en essayant de trouver une méthode reproduisant le « plantage » tant redouté.&lt;br /&gt;
&lt;br /&gt;
La première solution fonctionne assez bien mais si l&#039;on à faire à un « vrai » problème de configuration matérielle ou logicielle, on arrivera assez vite à ne plus pouvoir éviter la seconde voire la troisième. J&#039;allais oublier cette troisième solution destinée aux plus riches d&#039;entre vous : changer de matériel. Cette solution coûteuse peut parfois se révéler efficace, parfois pas du tout. A quoi bon changer un composant sans savoir si c&#039;était bien celui-ci qui posait problème ?&lt;br /&gt;
Quelque soit la solution retenue, il sera de toute manière nécessaire de localiser la panne pour y apporter la réponse adéquate. Certaines sociétés ou particuliers se sont spécialisés dans ce dépannage ou l&#039;utilisateur est « dépassé » par les événements.&lt;br /&gt;
&lt;br /&gt;
Cet article vous fera, je l&#039;espère, découvrir quelques outils et méthodes pour valider un par un les composants de votre ordinateur. Cela vous permettra j&#039;espère d&#039;être un peu moins dépourvu quand un problème surviendra. L&#039;article reproduira les étapes qu&#039;il faut suivre pour isoler le « fautif ».&lt;br /&gt;
&lt;br /&gt;
== Les causes possibles d&#039;un « plantage » ==&lt;br /&gt;
&lt;br /&gt;
On retrouve deux grandes catégories de pannes provoquant des dysfonctionnements importants sur un système informatique.&lt;br /&gt;
* une panne du matériel&lt;br /&gt;
* une erreur logicielle au niveau du noyau et des pilotes (drivers)&lt;br /&gt;
&lt;br /&gt;
Il faudra donc être capable de séparer la panne matérielle qui « force » l&#039;ordinateur à entrer dans un mode de fonctionnement non prévu et instable, de l&#039;erreur logicielle qui équivaut à demander à l&#039;ordinateur de faire « n&#039;importe quoi » et qui va donc se « planter ».&lt;br /&gt;
&lt;br /&gt;
Le terme « planté » utilisé ici équivaut à un arrêt du système à cause d&#039;erreurs sévères : instruction illégale ou composants défaillants. Le terme de « plantage » est aussi utilisé pour décrire le fonctionnement d&#039;une application qui se ferme inopinément. Ce cas est plus souvent lié à une erreur de programmation de l&#039;application qu&#039;à une erreur du système. Nous ne parlerons donc pas de ce second cas dans cet article.&lt;br /&gt;
&lt;br /&gt;
== La mémoire qui flanche ? ==&lt;br /&gt;
&lt;br /&gt;
Une cause « classique » des dysfonctionnements se situe au niveau de la gestion de la mémoire de votre machine. Je ne parle pas d&#039;allocation mémoire réalisée par votre système d&#039;exploitation favori mais bien de la manière avec laquelle la carte mère configure et utilise vos barrettes de mémoire. Les applications chargent en mémoire des données et des instructions destinées au processeur. Voici un scénario qui peut provoquer l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Votre application favorite est lancée depuis la ligne de commande ou une interface graphique via un « clic » de souris. Votre système d&#039;exploitation va donc charger ce programme en mémoire puis en exécuter les instructions. Au plus bas niveau de votre système, le processeur exécute des instructions en langage machine (assembleur) présente en mémoire.&lt;br /&gt;
Malheureusement, votre mémoire est défaillante et elle n&#039;arrive pas à maintenir un état stable des informations qui lui sont confiées. Par exemple, la lettre C est représentée par le code 67, ou « 1000011 » en binaire. Si la zone mémoire change d&#039;état, alors le contenu de la valeur stocké à cet endroit changera : on pourrait se retrouver avec « 1000010 ». Un seul bit a changé, mais on passe de la lettre &#039;C&#039; (67) à la lettre &#039;B&#039;(66). Le résultat ne se fait pas attendre, le processeur se retrouve à exécuter des instructions qui n&#039;ont plus de sens, provoquant l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Les pannes de mémoires sont généralement dues à des composants endommagés, des barrettes incompatibles ou un  « timing d&#039;accès » à la mémoire (nommé CAS (Column Address Strobe) dans la plupart des BIOS) trop agressif permettant des lectures dans des zones mémoires avant que les écritures aient eu le temps de se stabiliser pour en garantir le contenu.&lt;br /&gt;
&lt;br /&gt;
Il est assez simple de valider votre configuration mémoire grâce à l&#039;utilitaire memtest (http://www.memtest.org). Cet utilitaire de taille très modeste, 96 Kilo-octets, est écrit en assembleur ce qui lui permet de s&#039;exécuter indépendamment du système d&#039;exploitation. Ceci garantit un test « proche » du matériel, sans sur-couche pouvant apporter d&#039;autres problèmes. &lt;br /&gt;
La version 1.65 actuelle est téléchargeable sous deux formes : une iso que l&#039;on peut graver sur un CDRW de préférence vu la petite taille du programme ou sous la forme d&#039;une amorce système (pre-compiled bootable binary). Il suffira de décompresser l&#039;archive puis d&#039;exécuter la commande suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;dd if=memtest.bin of=/dev/fda&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Ceci écrasera le contenu de votre disquette pour y  copier memtest. &lt;br /&gt;
Rebootez l&#039;ordinateur avec la disquette placée dans le lecteur, memtest devrait se lancer. &lt;br /&gt;
&lt;br /&gt;
[[Image:memtest.jpg]]&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus, est une capture d&#039;écran de memtest en fonctionnement. Le barre de progression principale affichée en haut à droite de l&#039;écran (2% dans cet exemple) permet de suivre la progression du test. Les erreurs apparaissent dans la partie inférieure de l&#039;écran. Il suffit de laisser fonctionner memtest au moins une fois jusqu&#039;à 100%. Si aucune ligne ne s&#039;est affichée alors vou pouvez considérer que la mémoire est fonctionnelle. Dans le cas contraire,  il faudra soit procéder à son remplacement s&#039;il s&#039;agit d&#039;une seule barrette mémoire, soit tester les barrettes indépendamment (l&#039;une puis l&#039;autre) avec ce logiciel. Dans le cas de 2 ou 3 barrettes qui ne fonctionnement pas correctement ensemble mais qui fonctionnement correctement individuellement, il faudra vérifier qu&#039;elles sont bien de même modèle/marque et remettre le Bios dans une configuration initiale.&lt;br /&gt;
&lt;br /&gt;
Votre mémoire est bonne ? Testons les autres composants de votre machine pour traquer la source de ce plantage.&lt;br /&gt;
&lt;br /&gt;
== Il ne fait pas un peu chaud là ? ==&lt;br /&gt;
&lt;br /&gt;
Ces dix dernières années la puissance consommée et dissipée par nos ordinateurs a littéralement explosé ! Du 486 qui ne nécessitait quasiment pas de ventilateur, on est arrivé à des stations de travail/jeu avec des alimentations pouvant atteindre 1KiloWatt pour les dernières et 500watt pour des modèles plus « grand public ». Le processeur est un des composants gourmands de la machine. Certains modèles peuvent consommer plus de 130W ! Autant dire que si le système est mal ventilé, la montée en charge du processeur peut provoquer un échauffement important provoquant une surchauffe de celui-ci. S&#039;il dépasse ces caractéristiques de fonctionnement, il va alors exécuter du code incorrect provocant  un plantage du système.&lt;br /&gt;
&lt;br /&gt;
Un bon test pour vérifier que votre processeur n&#039;est pas la cause de votre instabilité : commencez par relever la température de votre machine au repos à l&#039;aide des informations fournies soit par l&#039;acpi soit pas lm_sensors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[erwan@R1 ~]$ cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             42 C&lt;br /&gt;
[erwan@R1 ~]$ &lt;br /&gt;
&lt;br /&gt;
[root@konilope ~]# sensors | grep Temp&lt;br /&gt;
M/B Temp:    +39°C  (low  =   +15°C, high =   +40°C)   sensor = thermistor   &lt;br /&gt;
CPU Temp:   +127°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
Temp3:       +44°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
[root@konilope ~]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode utilisant lm_sensors nécessite une interprétation de la part de l&#039;utilisateur. Dans cet exemple, il apparaît évidant que le processeur ne peut avoir une température de fonctionnement aussi élevée (127°C). L&#039;erreur est du à un mauvais calcul de la part de lm_sensors. Il se base sur le type de capteurs thermiques utilisé par la carte mère pour calculer la température des différents composants. Malheureusement, le montage électrique autour du capteur de température peut varier d&#039;un modèle de carte à un autre, ce qui fausse les calculs. On considéra donc, que pour cette machine (konilope) sa température se situe aux alentours de 42° : valeur moyenne entre les deux valeurs « cohérentes » relevées par lm_sensors. On pourra cependant vérifier cette approximation en relevant la température du disque sur à l&#039;aide de smartmontools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# smartctl -A /dev/hda | grep Temperature&lt;br /&gt;
194 Temperature_Celsius     0x0022   042   052   000    Old_age   Always       -       42&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, il est préférable de maintenir sa machine en dessous des 55° et celle de son processeur en dessous de 70°C. Au delà, le système risque d&#039;être instable. Si ce n&#039;est pas le cas, effectuez les modification nécessaire pour y parvenir : meilleure ventilation du processeur ou du boîtier par exemple.&lt;br /&gt;
&lt;br /&gt;
Ensuite, téléchargez l&#039;utilitaire cpuburn depuis un mirroir  (http://pages.sbcglobal.net/redelm/cpuburn_1_4_tar.gz)  ou depuis votre distribution linux favorite (oui, oui, urpmi cpuburn ça fonctionne ;o)).&lt;br /&gt;
&lt;br /&gt;
Vous y trouverez plusieurs programmes nommés burnXX ou XX représente votre processeur. La version P6 sera à utiliser sur les processeurs Intel Pentium 4, la version K7 pour les processeurs Athlon x86. Pour les processeurs plus récents, utilisez la version P6.&lt;br /&gt;
Ce logiciel réalise des boucles en langage assembleur ayant pour but de stresser votre processeur de manière importante et donc le faire chauffer. Lancez cpuburn autant de fois que vous avez de processeur sur votre machine puis observez la température de votre machine. Si lors de la montée en température votre système se fige, alors vous avez un problème de thermie. Si cpuburn ne fait pas planter votre ordinateur au bout de 10mn, vous pouvez considérez que votre système est stable de ce coté là. Vous pouvez aussi utiliser ce test pour vérifier que vos ventilateurs d&#039;ordinateurs portable se déclenchent bien en cas de surchauffe.&lt;br /&gt;
Sur un portable récent, on obtient le résultat suivant au bout de quelques minutes de cpuburn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             80 C&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Malgré la température très élevée du processeur, le système est resté stable ce qui permet de valider qu&#039;il est capable d&#039;encaisser une montée en température élevée. Bien entendu, plus votre machine sera « chaude » plus elle s&#039;usera rapidement. Il ne faut pas oublier que les autres composants peuvent souffrir de la chaleur dégagée par le processeur par exemple : les disques durs en sont un bon exemple car les plateaux ne supportent pas la chaleur.&lt;br /&gt;
Ce test est bon aussi ? A priori, les composants de base de votre système sont en bon état, vous pouvez commencer à regarder du coté configuration logicielle.&lt;br /&gt;
&lt;br /&gt;
== APIC es tu là ? ==&lt;br /&gt;
&lt;br /&gt;
Le manque de stabilité peut aussi s&#039;expliquer par la gestion des interruptions. &lt;br /&gt;
L&#039;architecture PIC (Programmable Interrupt Controllers)  représentée par la famille de composants Intel 8259, permettait une gestion de 8 interruptions pour un unique processeur. On les associe par 2 pour obtenir les 16 niveaux d&#039;interruptions nécessaire depuis nos vieux 80286 (milieu des années 80). Avec l&#039;arrivée des systèmes multi-processeurs, l&#039;architecture APIC (Advanced Programmable Interrupt Controllers) (Intel 82093) à été ajoutée pour permettre une gestion plus fine des interruptions. En effet, dans un contexte multi-processeurs, il est nécessaire de pouvoir choisir quel processeur traitera quelle interruption pour ne pas rester figé dans l&#039;ancien modèle (PIC) où le processeur de  « boot » est assigné à un ensemble d&#039;interruptions. &lt;br /&gt;
&lt;br /&gt;
De plus, l&#039;architecture APIC apporte une gestion de 24 interruptions, une gestion de priorité des interruptions et le routage de l&#039;interruption sur le bon processeur, contre un simple routage de 2*8 interruptions dans le modèle PIC sur un seul processeur. Depuis une dizaine d&#039;années, Intel propose le modèle APIC comme nouvelle architecture, y compris pour les systèmes mono-processeurs. Les ordinateurs récents, y compris les portables, sont maintenant équipés uniquement de composants APIC même si l&#039;on peut obtenir un comportement de type PIC avec ceux-ci.&lt;br /&gt;
&lt;br /&gt;
L&#039;architecture APIC est constituée d&#039;un ou plusieurs composants situé physiquement dans le southbridge (IO-APIC), généralement un par bus, et un composant situé dans le processeur : le Local APIC (LAPIC). Le LAPIC va permettre la gestion des interruptions au niveau du processeur local. Il permet aussi de générer des interruptions par exemple pour transmettre des interruptions à des processeurs voisins dans le contexte d&#039;un système multi-processeurs, ces messages sont appelés IPI (Inter Processor Interrupts). &lt;br /&gt;
&lt;br /&gt;
De plus le Local APIC (LAPIC) inclut un « timer » de précision cadencé à la fréquence du bus, généralement il peut être utilisé par l&#039;ordonnanceur de votre système d&#039;exploitation favori ou d&#039;autres outils de haut niveau (profiler kernel : oprofile, vtune). Les LAPIC et l&#039;IO-APIC sont reliés par un bus spécifique pour permettre un échange rapide des informations. &lt;br /&gt;
&lt;br /&gt;
Schema logique d&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
[[image:acpi.jpg]]&lt;br /&gt;
&lt;br /&gt;
Les IO-APIC vont donc se charger de collecter les interruptions provenant des périphériques systèmes et d&#039;en assurer le transfert vers le ou les processeur(s) suivant une route préalablement programmée par le BIOS et/ou le système d&#039;exploitation.&lt;br /&gt;
&lt;br /&gt;
Cependant, l&#039;implémentation des APIC dans les BIOS peut provoquer certaines instabilités sur votre système Linux. Par expérience, il n&#039;y a pas de règle pour trouver la configuration qui peut aider votre machine à se stabiliser car cela dépend de chaque machine. Des différences peuvent même exister entre  deux versions de BIOS d&#039;un même ordinateur. Cependant, dans la série 2.6 du noyau Linux et les version 2.4 récentes nous disposons d&#039;outils permettant de re-paramétrer cette configuration en activant/désactivant les IO-APIC ou les LAPIC.&lt;br /&gt;
&lt;br /&gt;
Chaque composant possède un activateur ou un inhibiteur, on aura donc d&#039;un coté « apic » et « noapic » pour la gestion des IO-APIC, « nolapic » et « lapic » de l&#039;autre pour la gestion des LAPIC. Ces 4 options sont à utiliser sur la ligne de commande du noyau, c&#039;est à dire au moment où le « bootloader » (lilo ou grub par exemple) va charger le noyau en mémoire. L&#039;utilisation de « apic » et « lapic » permet d&#039;activer ces composants qui ne l&#039;ont pas été par le BIOS. L&#039;activateur « apic » n&#039;est disponible que les architectures de type x86_64 car celui-ci est déjà activé sur les systèmes de type x86. On désactivera les APIC dans le cas où le système affiche des messages d&#039;erreurs sur les APIC comme : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;« APIC error on CPU0: 40(40) »&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ou&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;MP-BIOS bug: 8254 timer not connected to IO-APIC&lt;br /&gt;
failed.&lt;br /&gt;
timer doesn&#039;t work through the IO-APIC - disabling NMI Watchdog!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La désactivation des IO-APIC permet par exemple de corriger le comportement parfois récalcitrant de certaines cartes vidéos qui ne parviennent pas à afficher correctement en mode 2D/3D (écran noir par exemple).&lt;br /&gt;
&lt;br /&gt;
La non activation des LAPIC peut avoir comme conséquence un dysfonctionnement de l&#039;ACPI (gestion d&#039;énergie avancée). Ce cas est traité par le noyau, vous retrouverez dans les messages de démarrage la ligne suivante : « &amp;quot;Local APIC disabled by BIOS you can enable it with lapic ».&lt;br /&gt;
&lt;br /&gt;
Pour résumer, si votre machine, en général à architecture mono-processeur, a tendance à se bloquer lors de l&#039;utilisation de périphériques tels que le port usb, la carte graphique ou la carte son, essayez de désactiver le LAPIC puis l&#039; IO-APIC puis les 2.  Pour exemple, les cartes mère A7N8X de chez Asus ont largement tendance à se bloquer si l&#039;on ne spécifie pas « nolapic » lors du boot. Sur certaines machines, il faudra faire le contraire à savoir forcer l&#039;activation des LAPIC. Ceci dépendra de votre machine et de sa conception.&lt;br /&gt;
&lt;br /&gt;
== A vos marques, rebootez ! ==&lt;br /&gt;
&lt;br /&gt;
Certains machines peuvent présenter quelques soucis pour redémarrer. Encore une fois, on retrouve au coeur de ce problème l&#039;interaction entre le noyau et le matériel notamment l&#039;ACPI. Les ordinateurs portables dont le modèle HP nc6120 ont par exemple le bon goût de rester bloqués sur le message « No reboot fixup found for your hardware ». Ceci indique que le noyau ne connaît pas de contournement pour ce matériel (ce qui est le cas de la quasi totalité des ordinateurs) mais puisque vous voyez ce message c&#039;est que votre machine n&#039;a pas réussi à rebooter. Heureusement, il existe des contournements pour permettre un redémarrage plus « bas niveau ». Le noyau défini les modes suivants : « b » « c » « h » « s » et « w ».&lt;br /&gt;
Le mode de reboot peut être défini sur la ligne de commande du noyau suivant la forme « reboot=&amp;lt;mode&amp;gt; ». Le mode « s » est réservé au systèmes multi-processeurs, elle va réinitialiser chacun des processeurs.&lt;br /&gt;
&lt;br /&gt;
Le mode « b » permet quant à lui de rebooter en faisant un appel direct au bios qui se chargera de faire redémarrer la machine. Ce mode fonctionne plutôt bien car dans le cas d&#039;un BIOS posant problème sur l&#039;ACPI, on peut espérer avoir un reboot correct. C&#039;est le cas sur de notre portable cité précédement.&lt;br /&gt;
&lt;br /&gt;
Le mode « h » se chargera de faire redémarrer la machine en réinitialisant le processeur. C&#039;est l&#039;équivalent du mode « s » pour les environnements mono-processeurs.  Pour finir, les modes « c » et « w » correspondent aux modes « cold » et « warn » : ces modes sont plus connus sous le nom de « reboot à froid »  et « reboot à chaud ». Le premier effectuera les tests de mémoire tandis que le second exécutera un reboot plus court.&lt;br /&gt;
&lt;br /&gt;
De manière générale, on utilisera plutôt le mode « b » ou « h » pour les systèmes mono-processeurs récalcitrant et le mode « s » pour les systèmes multi-processeurs.&lt;br /&gt;
&lt;br /&gt;
== Toujours plus de performance ==&lt;br /&gt;
Votre configuration est bien stable depuis un certain temps. Toutefois vous trouvez qu&#039;elle est un peu lente, elle ne vous donne pas satisfaction par rapport à ce qu&#039;elle devrait fournir.&lt;br /&gt;
Cette partie de l&#039;article va explorer comment vérifier et corriger les problèmes de performance des différents composants.&lt;br /&gt;
Note: certaines configuration mono-processeur nécessitent de désactiver LAPIC (nolapic)&lt;br /&gt;
&lt;br /&gt;
=== Le disque dur ===&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le disque dur semble un peu lent et pénalise le système dans son ensemble. Hdparm est là pour vous aider à y voir plus clair. Hdparm est à l&#039;origine conçu pour les systèmes de disques IDE de type PATA. Le nouveau système de disque SATA, ne permet pas toujours en fonction de l&#039;implémentation, l&#039;appel à toutes ces astuces. Cependant les nouvelles séries de kernel à partir du 2.6.15 devrait permettre une gestion plus unifiée des systèmes de disques PATA et SATA.&lt;br /&gt;
&lt;br /&gt;
Le test « hdparm -t /dev/&amp;lt;mon_device&amp;gt; » permet de tester la vitesse de lecture depuis le disque dur jusqu&#039;en mémoire. Une valeur de 25Mo/sec est un minimum pour des machines récentes. Plusieurs paramètres peuvent influencer les performances d&#039;un disque IDE. &lt;br /&gt;
La commande « hdparm -cd » permet de vérifier que les entrées/sorties sont réalisées en 16-bit (le mode 32-bit n&#039;offre pas de performance supplémentaire) alors que le DMA (Direct Memory Access) est activé. Ceci permet la minimisation de l&#039;utilisation du processeur pendant les accès au disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -cd /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
 IO_support   =  0 (default 16-bit)&lt;br /&gt;
 using_dma    =  1 (on)&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande « hdparm -c0d1 /dev/&amp;lt;mon_device&amp;gt; » permet de configurer le périphérique dans ce mode. Le noyau de votre distribution Linux devrait le réaliser de manière automatique.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -I » permet d&#039;obtenir plus d&#039;informations sur la configuration de votre disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -I /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
ATA device, with non-removable media&lt;br /&gt;
	Model Number:       FUJITSU MHT2040AT                       &lt;br /&gt;
	Serial Number:      NN77T3C13KB9&lt;br /&gt;
	Firmware Revision:  0022    &lt;br /&gt;
Standards:&lt;br /&gt;
	Used: ATA/ATAPI-6 T13 1410D revision 3a &lt;br /&gt;
	Supported: 6 5 4 3 &lt;br /&gt;
Configuration:&lt;br /&gt;
	Logical		max	current&lt;br /&gt;
	cylinders	16383	16383&lt;br /&gt;
	heads		16	16&lt;br /&gt;
	sectors/track	63	63&lt;br /&gt;
	--&lt;br /&gt;
	CHS current addressable sectors:   16514064&lt;br /&gt;
	LBA    user addressable sectors:   78140160&lt;br /&gt;
	device size with M = 1024*1024:       38154 MBytes&lt;br /&gt;
	device size with M = 1000*1000:       40007 MBytes (40 GB)&lt;br /&gt;
Capabilities:&lt;br /&gt;
	LBA, IORDY(cannot be disabled)&lt;br /&gt;
	bytes avail on r/w long: 4	Queue depth: 1&lt;br /&gt;
	Standby timer values: spec&#039;d by Standard, no device specific minimum&lt;br /&gt;
	R/W multiple sector transfer: Max = 16	Current = 16&lt;br /&gt;
	Advanced power management level: 128 (0x80)&lt;br /&gt;
	Recommended acoustic management value: 254, current value: 254&lt;br /&gt;
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 &lt;br /&gt;
	     Cycle time: min=120ns recommended=120ns&lt;br /&gt;
	PIO: pio0 pio1 pio2 pio3 pio4 &lt;br /&gt;
	     Cycle time: no flow control=240ns  IORDY flow control=120ns&lt;br /&gt;
Commands/features:&lt;br /&gt;
	Enabled	Supported:&lt;br /&gt;
	   *	READ BUFFER cmd&lt;br /&gt;
	   *	WRITE BUFFER cmd&lt;br /&gt;
	   *	Host Protected Area feature set&lt;br /&gt;
	   *	Look-ahead&lt;br /&gt;
	   *	Write cache&lt;br /&gt;
	   *	Power Management feature set&lt;br /&gt;
		Security Mode feature set&lt;br /&gt;
	   *	SMART feature set&lt;br /&gt;
	   *	Mandatory FLUSH CACHE command &lt;br /&gt;
	   *	Device Configuration Overlay feature set &lt;br /&gt;
	   *	Automatic Acoustic Management feature set &lt;br /&gt;
	   *	SET MAX security extension&lt;br /&gt;
		Power-Up In Standby feature set&lt;br /&gt;
	   *	Advanced Power Management feature set&lt;br /&gt;
	   *	DOWNLOAD MICROCODE cmd&lt;br /&gt;
	   *	SMART self-test &lt;br /&gt;
	   *	SMART error logging &lt;br /&gt;
Security: &lt;br /&gt;
		supported&lt;br /&gt;
	not	enabled&lt;br /&gt;
	not	locked&lt;br /&gt;
		frozen&lt;br /&gt;
	not	expired: security count&lt;br /&gt;
	not	supported: enhanced erase&lt;br /&gt;
	40min for SECURITY ERASE UNIT. &lt;br /&gt;
HW reset results:&lt;br /&gt;
	CBLID- above Vih&lt;br /&gt;
	Device num = 0 determined by the jumper&lt;br /&gt;
Checksum: correct&lt;br /&gt;
[root@R1 ~]#&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On y retrouve le modèle, le numéro de série et la version du firmware qui peuvent être utiles en cas de contact avec le Service Après-Vente ou de mise à jour pour une série de firmwares défaillante.&lt;br /&gt;
&lt;br /&gt;
La ligne commençant par « DMA » dans la partie « Capabilities » permet d&#039;afficher la vitesse de transfert négociée entre le disque dur et le driver IDE de Linux. L&#039;étoile précède la valeur actuelle. Dans cet exemple, le mode udma5 est sélectionné : ceci est conforme aux machines disponibles sur le marché depuis environ 3 ans.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, voici le tableau de conversion entre le mode DMA et la vitesse maximale associée.&lt;br /&gt;
&lt;br /&gt;
Type de fonctionnement&lt;br /&gt;
Vitesse Maximale en MO/sec&lt;br /&gt;
UltraDMA 0&lt;br /&gt;
16,6&lt;br /&gt;
UltraDMA 1&lt;br /&gt;
25&lt;br /&gt;
UltraDMA 2&lt;br /&gt;
33,3&lt;br /&gt;
UltraDMA 3&lt;br /&gt;
44,4&lt;br /&gt;
UltraDMA 4&lt;br /&gt;
66,6&lt;br /&gt;
UltraDMA 5&lt;br /&gt;
100&lt;br /&gt;
UltraDMA 6&lt;br /&gt;
133,33&lt;br /&gt;
&lt;br /&gt;
Une configuration actuelle ne devrait pas être en dessous de UDMA5. Si ce n&#039;était pas le cas, on peut essayer de renégocier la vitesse de transfert à l&#039;aide de la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hdparm -X udma5 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celle-ci permet de forcer le mode UltraDMA5. Il faut utiliser cette commande avec précaution car elle pourrait générer des pertes ou de la corruption de données en cas de transfert pendant ce changement de mode.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi impacter les performances de votre disque dur en modifiant sa vitesse de rotation. Cette fonctionnalité connue sous le nom de Automatic Acoustic Management (AAM) est utilisable avec l&#039;option « -M » de hdparm. La valeur 128 représentera la vitesse la plus faible avec un disque silencieux, la valeur 254 la vitesse la plus élevée mais avec comme contre-partie un disque plus bruyant. On pourra noter des différences de quelques Mo/sec selon les configurations.&lt;br /&gt;
&lt;br /&gt;
Il est aussi à noter que l&#039;utilisation de logiciels permettant une meilleure gestion d&#039;énergie (cpufreq, laptop-mode) peut dégrader les performances d&#039;un disque dur de manière notable.&lt;br /&gt;
&lt;br /&gt;
=== Configuration bas niveau du réseau ===&lt;br /&gt;
&lt;br /&gt;
Le réseau local filaire peut parfois être un peu lent. Voici quelques tests pour vérifier si la lenteur provient du logiciel, du noyau ou du matériel. Tout d&#039;abord, explorons la trousse à outils indispensable pour analyser votre carte réseau : ethtool. Digne successeur de mii-tool, il permet de s&#039;informer sur la configuration de votre carte réseau. &lt;br /&gt;
&lt;br /&gt;
Il suffit de lancer « ethtool &amp;lt;votre_interface&amp;gt; » » pour obtenir la configuration matérielle de votre carte. On y retrouve les modes supportés par votre carte (Supported Link Modes ainsi que la vitesse actuelle (Speed), obtenue par auto-négociation dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
On peut également savoir si le câble réseau est connecté à la carte grâce à la ligne « Link Detected ». Le type de « duplex » utilisé permet également de savoir si la négociation avec l&#039; élément actif au bout de votre câble (commutateur, concentrateur ou une autre machine) a correctement fonctionné. Le duplex définit le mode de  transmission : le mode half-duplex indique que l&#039;on émet puis on reçoit des données, le mode full-duplex indique que l&#039;on peut émettre et recevoir en même temps des données. Le mode full-duplex est donc plus que recommandé pour vos équipements réseaux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# ethtool  eth1&lt;br /&gt;
Settings for eth1:&lt;br /&gt;
	Supported ports: [ TP MII ]&lt;br /&gt;
	Supported link modes:   10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Supports auto-negotiation: Yes&lt;br /&gt;
	Advertised link modes:  10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Advertised auto-negotiation: Yes&lt;br /&gt;
	Speed: 100Mb/s&lt;br /&gt;
	Duplex: Full&lt;br /&gt;
	Port: MII&lt;br /&gt;
	PHYAD: 1&lt;br /&gt;
	Transceiver: internal&lt;br /&gt;
	Auto-negotiation: on&lt;br /&gt;
	Current message level: 0x000020c1 (8385)&lt;br /&gt;
	Link detected: yes&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesurer les {contre}performances de votre réseau ===&lt;br /&gt;
&lt;br /&gt;
Une fois vérifiée la bonne configuration de votre matériel, nous pouvons passer à la vérification des performances entre deux machines.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire netpipe (http://www.scl.ameslab.gov/netpipe/) permet de réaliser des tests de performance mais aussi d&#039;intégrité entre deux machines. Il permet de tester les performances du réseau au travers la couche IP et non pas depuis un mode plus bas niveau comme pourrait l&#039;être un test utilisant directement le driver Ethernet. Ce test permet donc de valider que la configuration matérielle mais aussi logicielle est correcte.&lt;br /&gt;
&lt;br /&gt;
Sur la première machine, exécutez « NPtcp » : netpipe se positionne en mode « serveur ».&lt;br /&gt;
Sur la seconde machine, exécutez « NPtcp -h &amp;lt;machine1&amp;gt; » : netpipe se connecte au serveur netpipe de la machine nommée machine1 pour effectuer le test de performance.&lt;br /&gt;
&lt;br /&gt;
Le test par défaut teste les communication allant de 1 octet jusqu&#039;à 8 Mo. Il peut prendre plusieurs minutes si le réseau est « lent ». Le test va montrer pour chaque taille de paquet la performance obtenue. Il est normal d&#039;obtenir des performances faibles pour des paquets d&#039;une taille inférieure à 8 Ko. Transporter des petits paquets nécessite de réaliser beaucoup d&#039;opérations pour le processeur pour une quantité d&#039;information minime. Les performances seront meilleures à partir d&#039;environ 16 Ko et maximales à partir de 128 Ko. Sur un système utilisant du gigabit ethernet, on constatera une performance de 39Mbps à 256 octets, 287Mbps à 4Ko, 614Mbps à 16Ko, 845Mbps à 128Ko, 895Mbps à 8Mo.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ainsi vérifier et comparer facilement les performances de votre configuration réseau. Netpipe permet également de tester la vitesse du réseau pour une taille de paquets définie entre la taille indiqué par l&#039;option « -l » et la taille indiquée par l&#039;option « -u ». Ainsi, NPtcp -l 16384 -u 16384 permet de tester la bande passante réseau pour une taille de paquet égale à 16Ko.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -n &amp;lt;nb-cycle&amp;gt; » permet de définir le nombre de boucles à réaliser pour le test (50 par défaut). Enfin, pour réaliser des tests « full-duplex », on utilisera l&#039;option « -2 ». Ce test permet de s&#039;assurer du bon fonctionnement du mode de communication permettant l&#039;écriture et la lecture simultanées.&lt;br /&gt;
&lt;br /&gt;
Attention, même si ce test donne de bons résultats, cela ne veut pas dire que la configuration est exempte d&#039;erreur de configuration. Par exemple, les performances réseaux peuvent être très bonnes en point à point mais mauvaises lorsque l&#039;on aura une charge réseau avec plusieurs clients. Dans cette situation, il faut vérifier que le contrôle de flux est bien activé sur toutes les machines. L&#039;option « ethtool -a » permet de vérifier que les champs « rx » et « tx » sont placés sur « on ». Si ce n&#039;était pas le cas activez-les avec la commande « ethtool -A eth0 rx on » et « ethtool -A eth0 tx on ».&lt;br /&gt;
&lt;br /&gt;
Les cartes réseaux, des serveurs essentiellement, permettent maintenant de réaliser le « tcp segment offload ». Cette technique permet de décharger une partie du traitement TCP directement dans l&#039;électronique de la carte réseau. Ceci à pour effet de décharger le processeur central d&#039;un traitement fastidieux. L&#039;option « -k » d&#039;ethtool permet de consulter l&#039;état de cette fonctionnalité (off/on). On pourra l&#039;activer sur des serveurs générant un gros trafic réseau par exemple : « ethtool -K eth0 tso on ».&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant équipé de nouveau outils pour traquer la perte de performances de votre installation réseau. Ceci couplé aux habituels tcpdump/ethereal, voilà une belle panoplie du zorro du réseau.&lt;br /&gt;
&lt;br /&gt;
=== Quand la latence s&#039;en mêle ===&lt;br /&gt;
&lt;br /&gt;
La latence représente le temps nécessaire à un système pour prendre en compte un événement.&lt;br /&gt;
&lt;br /&gt;
Il arrive que certains périphériques de votre machine nécessitant des débits importants ou une latence assez faible sur le bus PCI soient « poussifs ». On retrouve dans cette catégorie les cartes vidéos accélératrice 3D, les cartes son et les cartes d&#039;acquisition firewire ou DVB (récepteur de télévision numérique terrestre : TNT).&lt;br /&gt;
&lt;br /&gt;
Un périphérique branché sur le bus PCI doit attendre que le bus soit libre pour émettre les données vers la mémoire centrale. Le bus PCI qui est le coeur de communication des périphériques est donc soumis en permanence à un arbitrage qui permet de décider qui doit émettre des données et qui doit attendre. Cet arbitrage est en partie réalisé grâce au « latency_timer ».&lt;br /&gt;
&lt;br /&gt;
Chaque périphérique possède une valeur de « latency_timer » comprise en 0 et 248 cycles d&#039;horloge du bus. Plus la valeur sera importante plus le périphérique disposera de temps pour transmettre des informations. Une latence de 248 cycles permet d&#039;obtenir une priorité forte sur le bus, ce qui permet un débit important. A contrario, une latence de 0 indiquera au périphérique qu&#039;il doit cesser ses transmissions si un autre composant à besoin du bus : ceci se traduira par une perte de bande passante importante.&lt;br /&gt;
&lt;br /&gt;
La configuration réalisée par défaut sur votre machine doit être correcte mais il peut arriver qu&#039;une carte 3D ou DVB soit configurée avec une latence trop faible, ce qui  aurait pour conséquence d&#039;offrir une image saccadée et peu fluide. Une carte son offrirait également le même type de symptômes avec un son hâché ou excessivement métallique.&lt;br /&gt;
&lt;br /&gt;
Heureusement, une série d&#039;outils est là pour vous aider à diagnostiquer le problème mais aussi à le résoudre. Le projet pciutils  (http://atrey.karlin.mff.cuni.cz/~mj/linux.shtml#pciutils) contient deux outils indispensables: lspci et setpci. Bien entendu, votre distribution favorite devrait posséder ce logiciel, il vous suffira de l&#039;installer avec  votre gestionnaire de paquet favori (urpmi, apt, smart).&lt;br /&gt;
&lt;br /&gt;
La commande « lspci » vous permet de lister les périphériques PCI disponibles sur votre ordinateur (cf article paru dans le numéro 68).  Cet exemple se basera sur une carte vidéo  ayant pour adresse sur le bus PCI « 01:00.0 ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@lagirafe] lspci -v -s 01:00.0&lt;br /&gt;
01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go5200 32M/64M] (rev a1) (prog-if 00 [VGA])&lt;br /&gt;
	Subsystem: Samsung Electronics Co Ltd: Unknown device c00f&lt;br /&gt;
	Flags: bus master, 66Mhz, medium devsel, latency 16, IRQ 11&lt;br /&gt;
	Memory at c8000000 (32-bit, non-prefetchable) [size=16M]&lt;br /&gt;
	Memory at d8000000 (32-bit, prefetchable) [size=128M]&lt;br /&gt;
	Expansion ROM at &amp;lt;unassigned&amp;gt; [disabled] [size=128K]&lt;br /&gt;
	Capabilities: [60] Power Management version 2&lt;br /&gt;
	Capabilities: [44] AGP version 3.0&lt;br /&gt;
[root@lagirafe]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On retiendra dans cette ligne, la valeur &#039;latency 16&#039;. Ceci risque de poser problème lorsque celle-ci aura besoin d&#039;un fort débit pendant un jeu par exemple. Augmenter la latence va donc se révéler nécessaire pour ce périphérique.&lt;br /&gt;
&lt;br /&gt;
La commande setpci permet de modifier les paramètres PCI d&#039;un périphérique ou d&#039;un bus complet avec tous ses périphériques. &lt;br /&gt;
&lt;br /&gt;
La commande « setpci -v -d 01:* latency_timer=20 » permet de positionner tous les périphériques  du bus 01 à une valeur de 32 cycles. Il est à noter que la commande setpci utilise des valeurs en hexadécimal mais lspci affichera les valeurs en décimal.&lt;br /&gt;
&lt;br /&gt;
Pour en revenir à nos moutons, la correction de la latence de cette carte graphique se fera avec la commande «  setpci -v -d 01:00.0 latency_timer=f8 ». Ceci positionne donc la carte sur la plus grande valeur de latence possible, ce qui lui garantira la plus grande bande passante possible. Il est possible d&#039;utiliser la valeur « ff » comme paramètre pour « latency_timer » mais celui-ci sera converti à la volée par la commande setpci en « 0xf8 ».&lt;br /&gt;
&lt;br /&gt;
Attention, certains composants de votre machine doivent rester en « latency_timer=0 » pour garantir une bon fonctionnement de votre système : il ne faudra donc pas modifier les latences des contrôleurs mémoire et des ponts PCI connectés généralement sur le bus « 0:* ».&lt;br /&gt;
&lt;br /&gt;
== DSDT : le cauchemar continue ! ==&lt;br /&gt;
&lt;br /&gt;
Cette partie de l&#039;article a pour but d&#039;expliquer le problème que peut représenter la table DSDT pour un certain nombre de machines et surtout les ordinateurs portables. &lt;br /&gt;
&lt;br /&gt;
La norme ACPI 3.0 de Septembre 2004 disponible gratuitement à l&#039;adresse http://www.acpi.info/DOWNLOADS/ACPIspec30.pdf définit la DSDT comme une table remplie par un OEM permettant au système d&#039;exploitation de découvrir les ressources pour la gestion de l&#039;énergie avancée, de la gestion thermique ainsi que la gestion du Plug&#039;nPlay des ressources définies par l&#039;ACPI.&lt;br /&gt;
&lt;br /&gt;
Voici une description certes un peu théorique mais nécessaire pour bien comprendre la problématique et ses conséquences. Le constructeur de l&#039;ordinateur doit donc définir dans le BIOS une table contenant une liste de ressources et leurs configuration et ce pour que le système d&#039;exploitation puisse s&#039;en servir. Noble cause n&#039;est il pas ? Tout au long des 618 pages de ce document sont spécifiés les éléments du langage à utiliser ainsi que sa syntaxe. L&#039; « ACPI Source Language » permettra donc aux développeurs d&#039;écrire des DSDT puis de les compiler dans un format nommé « ACPI Machine Language » en utilisant un compilateur adéquat. Le système d&#039;exploitation utilisera la table compilée (AML) pour accéder aux ressources ACPI. &lt;br /&gt;
Sur la plupart des ordinateurs portables, la table DSDT ne respecte pas la norme ACPI dans sa syntaxe. Ceci est très gênant car cela bloque le code de l&#039;interpréteur ACPI du noyau Linux qui essaie de la lire. Le résultat est sans appel, pas d&#039;ACPI, pas de gestion d&#039;énergie avancée, plus de ventilation automatique sur certains modèles d&#039;ordinateurs, plus de touche de gestion de contraste/luminosité sur d&#039;autres etc...&lt;br /&gt;
&lt;br /&gt;
Ceci est très gênant sur un ordinateur portable. Alors que faire ? Dans un premier temps, prévenir le constructeur que son BIOS est incorrect et ne respecte pas la norme ACPI. La réponse se fait toujours attendre pour tous ceux qui « osent » poser la question au support technique : à savoir, les constructeurs ignorent tout simplement les mails de ce type.&lt;br /&gt;
La seconde étape puisque vous êtes devant le fait accompli d&#039;une machine non conforme, il va falloir corriger cette table. Il suffit de récupérer la table actuelle via la commande &#039;cat /proc/acpi/dsdt &amp;gt; dsdt.aml&#039; si vous avez la chance d&#039;avoir un répertoire /proc/acpi malgré une table DSDT endommagée, sinon utilisez la commande &#039;acpidump -b -t dsdt -o dsdt.aml&#039;. La commande acpidump est  fournit dans le projet pmtools (ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools-20050926.tar.bz2) &lt;br /&gt;
Vous avez donc extrait la table DSDT de votre système. Il ne reste plus qu&#039;à essayer de la recompiler. Pour cela, le compilateur IASL de la société Intel (http://developer.intel.com/technology/iapc/acpi/downloads.htm) offre sous Linux et Windows une plate-forme de compilation pour le langage ASL.&lt;br /&gt;
&lt;br /&gt;
Suivez les instructions du site pour télécharger et compiler la version unix d&#039;iasl. Ensuite, décompilez la table avec la commande « iasl -d dsdt.aml ». Le fichier dsdt.dsl vient d&#039;être créé par le décompilateur. Il suffit de le recompiler avec la commande « iasl -tc dsdt.dsl » pour constater les dégâts ! La DSDT que vous avez dans votre BIOS est généralement compilée par le compilateur de Microsoft qui semble autoriser une syntaxe plus qu&#039;approximative.&lt;br /&gt;
Si vous avez de la chance, votre DSDT s&#039;est recompilée sans erreurs, vous obtenez donc un fichier dsdt.hex et un fichier dsdt.aml. Il ne reste plus qu&#039;à injecter cette dsdt dans le noyau Linux et le tour sera joué.&lt;br /&gt;
&lt;br /&gt;
Si vous avez moins de chance, votre DSDT est syntaxiquement incorrecte et génère des erreurs. Les expliquer plus en détails nécessiterait un article complet, il ne sera cité que les plus « habituelles » (sic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2626:                     Field (ECR, DWordAcc, Lock, Preserve) &lt;br /&gt;
Error    1048 -                              ^ Host Operation Region requires ByteAcc access &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette erreur présente à ligne 2626 du fichier dsdt.asl indique une erreur de type dans la déclaration du champ ECR. Il suffit dans ce cas de changer le mot « DWordAcc » par « ByteAcc ». Celle-ci reste assez simple à corriger, on se demande donc pourquoi les constructeurs ne prennent pas le temps de vérifier et de corriger leur BIOS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2672:                     Method (_GLK, 1, NotSerialized) &lt;br /&gt;
Warning  2024 -                                ^ Reserved method has too many arguments ( _GLK requires 0) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode _GLK n&#039;a besoin que de 0 paramètre tandis que ce code en utilise 2 ! La correction est assez simple : il suffit de remplacer la ligne 2672 par « Method(_GLK) ».&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur la correction des erreurs de compilation de votre table dsdt, je vous recommande les tutoriaux disponibles depuis la page http://acpi.sourceforge.net/dsdt/index.php du projet ACPI.&lt;br /&gt;
&lt;br /&gt;
Votre DSDT est compilée avec succès, il ne vous reste plus qu&#039;à l&#039;ajouter pour que votre noyau puisse l&#039;utiliser à la place de celle fourni par le BIOS (modifiable uniquement par le constructeur, via une mise à jour).&lt;br /&gt;
&lt;br /&gt;
Il existe trois possibilités pour inclure une table DSDT : la modification du noyau Linux ( noyau &amp;lt; 2.6.9), l&#039;injection de la DSDT dans la configuration du noyau (noyau &amp;gt;= 2.6.9), l&#039;intégration de la table DSDT dans l&#039;initrd qui nécessite un patch kernel disponible à l&#039;adresse http://gaugusch.at/kernel.shtml.&lt;br /&gt;
&lt;br /&gt;
Pour les noyaux 2.6.9 et supérieur, copiez votre fichier dsdt.hex sous le nom «/usr/src/linux/include/acpi/dsdt_table.h » puis reconfigurez votre noyau.&lt;br /&gt;
Insérer « dsdt_table.h » dans l&#039;option « Include you custom DSDT » disponible dans le menu « Power Management/ACPI/ ». Recompilez votre noyau et redémarrez avec votre nouveau noyau.&lt;br /&gt;
Pour les noyaux inférieurs à 2.6.9, il est possible de modifier le code source de votre noyau pour intégrer votre DSDT mais il est préférable d&#039;utiliser le patch permettant l&#039;insertion de la table DSDT dans l&#039;initrd. Recompilez votre noyau avec ce patch, puis suivez la procédure décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Certaines distributions Linux comme « Mandriva Linux » possèdent le patch qui permet de n&#039;avoir qu&#039;à reconstruire l&#039;initrd avec la commande « mkinitrd –dsdt=/boot/dsdt.aml /boot/initrd-`uname -r`.img `uname -r`  » puis de relancer lilo avant de redémarrer votre machine. Lors du démarrage de celle-ci vous devriez voir le message suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ACPI: Looking for DSDT in initrd... found (at offset 0x4f8d9).&lt;br /&gt;
ACPI-0294: *** Info: Table [DSDT] replaced by host OS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant avec une table DSDT correcte et un ACPI fonctionnel. La question qui reste ouverte est pourquoi les constructeurs n&#039;utilisent pas un compilateur digne de ce nom pour permettre à leur clients de pouvoir utiliser d&#039;autres systèmes d&#039;exploitation que Windows de Microsoft. &lt;br /&gt;
&lt;br /&gt;
Pour la petite histoire, si vous cherchez dans votre dsdt vous risquez de tomber ce genre de lignes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows NT&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft WindowsME: Millennium Edition&amp;quot;), Zero))&lt;br /&gt;
 If (LEqual (SizeOf (\_OS), 0x27)) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque qu&#039;un système d&#039;exploitation souhaite utiliser les ressources ACPI du BIOS, il utilise son nom de système d&#039;exploitation (acpi_os_name). On retrouve donc dans les bios des parties qui ne seront exécutées que pour certains systèmes d&#039;exploitation de Microsoft. On retrouve même certains tests où c&#039;est la longueur du nom qui compte...... Ceci prouve bien que les constructeurs d&#039;ordinateurs savent corriger des tables DSDT pour les systèmes d&#039;exploitation mais pas forcément pour le notre malheureusement. Depuis le noyau 2.6.9, le noyau Linux utilise « Windows NT » comme « acpi_os_name »  pour assurer une meilleure compatibilité matérielle dixit Len Bron d&#039;Intel dans le changelog de cette version.&lt;br /&gt;
&lt;br /&gt;
== Comment trouver le pilote qui va avec votre matériel ? ==&lt;br /&gt;
&lt;br /&gt;
Cette question on se la pose souvent mais uniquement lorsque l&#039;on essaye de brancher un nouveau périphérique sur sa machine. Les distributions récentes permettent de détecter automatiquement votre matériel et de lui associer un pilote avec sa configuration. Ce mécanisme fonctionne plutôt bien mais cela n&#039;évite pas les dysfonctionnements voir l&#039;absence de fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Pour vérifier si votre noyau Linux est capable de supporter un nouveau périphérique PCI par exemple, il suffit d&#039;en récupérer les identifiants PCI (constructeur et produit) puis de les rechercher dans le fichier « /lib/modules/`uname -r`/modules.pcimap » qui est auto-généré lors de la commande depmod.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire « lspcidrake -v » vous permet de trouver les identifiants PCI de votre carte, la commande « lspci » vous permet de trouver le nom de votre périphérique puis faites un « lspci -n » pour en trouver la correspondance numérique. On utilisera la position du périphérique sur le bus pour retrouver la correspondance numérique « 02:05.0 » dans cet exemple.&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome] lspci&lt;br /&gt;
[....]&lt;br /&gt;
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)&lt;br /&gt;
[root@pumphome] lspci -n&lt;br /&gt;
[...]&lt;br /&gt;
02:05.0 Class 0200: 14e4:4401 (rev 01)&lt;br /&gt;
[root@pumphome]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi cette carte réseau possède les identifiants 14e4 (constructeur) et 4401 (produit). Il suffit de rechercher cette valeur dans le modules.pcimap, ce qui nous donnera la correspondance en module (pilote).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome]  grep &amp;quot;0x000014e4 0x00004401&amp;quot; /lib/modules/2.6.12-12mdk-i686-up-4GB/modules.pcimap &lt;br /&gt;
b44               0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
bcm4400      0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit ici que cette carte peut utiliser le driver b44 ou le driver bcm4400. On ne trouve pas toujours les identifiants PCI de produit sous leur forme directe, on peut également trouver « 0Xffffffff » qui indique que tous les cartes du constructeur sont gérées par un module.&lt;br /&gt;
Il ne vous restera plus qu&#039;à effectuer la configuration associée à ce périphérique pour qu&#039;il fonctionne correctement.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
La fin de cet article conclut une toute petite série de deux articles ayant pour but de vulgariser l&#039;architecture de nos machines, de découvrir les outils disponibles pour mieux comprendre leur configuration et au besoin régler les problèmes de configuration matérielle qui ont souvent le don de nous pourrir la vie.&lt;br /&gt;
&lt;br /&gt;
Merci à LaurentJ de #Mandrivafr pour ses tests complémentaires sur les problèmes d&#039;IO-APIC. Un énorme merci à Nicolas Planel pour sa relecture pointue et également Anne pour sa patience de girafe à relire et « quaurigé »mes « photes »,  ainsi qu&#039;à tous ceux qui m&#039;ont aidé à découvrir ce que je restitue dans cet article.&lt;br /&gt;
&lt;br /&gt;
Cet article a été publié dans Linux Magazine France n°78. Il est publié sur Léa avec l&#039;aimable autorisation de l&#039;éditeur.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12779</id>
		<title>Découvrez les ressources de votre machine (La suite)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12779"/>
		<updated>2006-06-11T20:30:12Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* APIC es tu là ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Découvrez les ressources de votre machine (La suite) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A nouvelle année, nouvelles résolutions ! Paru dans le numéro 68, un premier article dédié à la découverte des outils disponibles pour la récupération des configurations de votre machine promettait une suite.  Je vous propose donc de reprendre ce voyage au centre de votre ordinateur. &lt;br /&gt;
&lt;br /&gt;
Cet article sera articulé autour du diagnostic de pannes et des correctifs associés mais aussi de « trucs &amp;amp; astuces » permettant d&#039;optimiser votre configuration.&lt;br /&gt;
&lt;br /&gt;
== Savez-vous planter les choux ? ==&lt;br /&gt;
&lt;br /&gt;
Les choux peut-être pas mais les ordinateurs je pense que c&#039;est arrivé au moins une fois à chaque lecteur qui lit cet article. Rien de plus énervant qu&#039;un écran qui se fige, le pointeur de souris qui ne se déplace plus, le clavier qui ne répond plus non plus.... Planté ! Ce constat est assez facile à établir mais en trouver la cause reste un problème nettement plus complexe tellement le nombre de causes possibles est important.&lt;br /&gt;
&lt;br /&gt;
Deux solutions : ignorer le problème et relancer le système en se disant que ça « passera », ou alors chercher la cause du problème en essayant de trouver une méthode reproduisant le « plantage » tant redouté.&lt;br /&gt;
&lt;br /&gt;
La première solution fonctionne assez bien mais si l&#039;on à faire à un « vrai » problème de configuration matérielle ou logicielle, on arrivera assez vite à ne plus pouvoir éviter la seconde voire la troisième. J&#039;allais oublier cette troisième solution destinée aux plus riches d&#039;entre vous : changer de matériel. Cette solution coûteuse peut parfois se révéler efficace, parfois pas du tout. A quoi bon changer un composant sans savoir si c&#039;était bien celui-ci qui posait problème ?&lt;br /&gt;
Quelque soit la solution retenue, il sera de toute manière nécessaire de localiser la panne pour y apporter la réponse adéquate. Certaines sociétés ou particuliers se sont spécialisés dans ce dépannage ou l&#039;utilisateur est « dépassé » par les événements.&lt;br /&gt;
&lt;br /&gt;
Cet article vous fera, je l&#039;espère, découvrir quelques outils et méthodes pour valider un par un les composants de votre ordinateur. Cela vous permettra j&#039;espère d&#039;être un peu moins dépourvu quand un problème surviendra. L&#039;article reproduira les étapes qu&#039;il faut suivre pour isoler le « fautif ».&lt;br /&gt;
&lt;br /&gt;
== Les causes possibles d&#039;un « plantage » ==&lt;br /&gt;
&lt;br /&gt;
On retrouve deux grandes catégories de pannes provoquant des dysfonctionnements importants sur un système informatique.&lt;br /&gt;
* une panne du matériel&lt;br /&gt;
* une erreur logicielle au niveau du noyau et des pilotes (drivers)&lt;br /&gt;
&lt;br /&gt;
Il faudra donc être capable de séparer la panne matérielle qui « force » l&#039;ordinateur à entrer dans un mode de fonctionnement non prévu et instable, de l&#039;erreur logicielle qui équivaut à demander à l&#039;ordinateur de faire « n&#039;importe quoi » et qui va donc se « planter ».&lt;br /&gt;
&lt;br /&gt;
Le terme « planté » utilisé ici équivaut à un arrêt du système à cause d&#039;erreurs sévères : instruction illégale ou composants défaillants. Le terme de « plantage » est aussi utilisé pour décrire le fonctionnement d&#039;une application qui se ferme inopinément. Ce cas est plus souvent lié à une erreur de programmation de l&#039;application qu&#039;à une erreur du système. Nous ne parlerons donc pas de ce second cas dans cet article.&lt;br /&gt;
&lt;br /&gt;
== La mémoire qui flanche ? ==&lt;br /&gt;
&lt;br /&gt;
Une cause « classique » des dysfonctionnements se situe au niveau de la gestion de la mémoire de votre machine. Je ne parle pas d&#039;allocation mémoire réalisée par votre système d&#039;exploitation favori mais bien de la manière avec laquelle la carte mère configure et utilise vos barrettes de mémoire. Les applications chargent en mémoire des données et des instructions destinées au processeur. Voici un scénario qui peut provoquer l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Votre application favorite est lancée depuis la ligne de commande ou une interface graphique via un « clic » de souris. Votre système d&#039;exploitation va donc charger ce programme en mémoire puis en exécuter les instructions. Au plus bas niveau de votre système, le processeur exécute des instructions en langage machine (assembleur) présente en mémoire.&lt;br /&gt;
Malheureusement, votre mémoire est défaillante et elle n&#039;arrive pas à maintenir un état stable des informations qui lui sont confiées. Par exemple, la lettre C est représentée par le code 67, ou « 1000011 » en binaire. Si la zone mémoire change d&#039;état, alors le contenu de la valeur stocké à cet endroit changera : on pourrait se retrouver avec « 1000010 ». Un seul bit a changé, mais on passe de la lettre &#039;C&#039; (67) à la lettre &#039;B&#039;(66). Le résultat ne se fait pas attendre, le processeur se retrouve à exécuter des instructions qui n&#039;ont plus de sens, provoquant l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Les pannes de mémoires sont généralement dues à des composants endommagés, des barrettes incompatibles ou un  « timing d&#039;accès » à la mémoire (nommé CAS (Column Address Strobe) dans la plupart des BIOS) trop agressif permettant des lectures dans des zones mémoires avant que les écritures aient eu le temps de se stabiliser pour en garantir le contenu.&lt;br /&gt;
&lt;br /&gt;
Il est assez simple de valider votre configuration mémoire grâce à l&#039;utilitaire memtest (http://www.memtest.org). Cet utilitaire de taille très modeste, 96 Kilo-octets, est écrit en assembleur ce qui lui permet de s&#039;exécuter indépendamment du système d&#039;exploitation. Ceci garantit un test « proche » du matériel, sans sur-couche pouvant apporter d&#039;autres problèmes. &lt;br /&gt;
La version 1.65 actuelle est téléchargeable sous deux formes : une iso que l&#039;on peut graver sur un CDRW de préférence vu la petite taille du programme ou sous la forme d&#039;une amorce système (pre-compiled bootable binary). Il suffira de décompresser l&#039;archive puis d&#039;exécuter la commande suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;dd if=memtest.bin of=/dev/fda&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Ceci écrasera le contenu de votre disquette pour y  copier memtest. &lt;br /&gt;
Rebootez l&#039;ordinateur avec la disquette placée dans le lecteur, memtest devrait se lancer. &lt;br /&gt;
&lt;br /&gt;
[[Image:memtest.jpg]]&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus, est une capture d&#039;écran de memtest en fonctionnement. Le barre de progression principale affichée en haut à droite de l&#039;écran (2% dans cet exemple) permet de suivre la progression du test. Les erreurs apparaissent dans la partie inférieure de l&#039;écran. Il suffit de laisser fonctionner memtest au moins une fois jusqu&#039;à 100%. Si aucune ligne ne s&#039;est affichée alors vou pouvez considérer que la mémoire est fonctionnelle. Dans le cas contraire,  il faudra soit procéder à son remplacement s&#039;il s&#039;agit d&#039;une seule barrette mémoire, soit tester les barrettes indépendamment (l&#039;une puis l&#039;autre) avec ce logiciel. Dans le cas de 2 ou 3 barrettes qui ne fonctionnement pas correctement ensemble mais qui fonctionnement correctement individuellement, il faudra vérifier qu&#039;elles sont bien de même modèle/marque et remettre le Bios dans une configuration initiale.&lt;br /&gt;
&lt;br /&gt;
Votre mémoire est bonne ? Testons les autres composants de votre machine pour traquer la source de ce plantage.&lt;br /&gt;
&lt;br /&gt;
== Il ne fait pas un peu chaud là ? ==&lt;br /&gt;
&lt;br /&gt;
Ces dix dernières années la puissance consommée et dissipée par nos ordinateurs a littéralement explosé ! Du 486 qui ne nécessitait quasiment pas de ventilateur, on est arrivé à des stations de travail/jeu avec des alimentations pouvant atteindre 1KiloWatt pour les dernières et 500watt pour des modèles plus « grand public ». Le processeur est un des composants gourmands de la machine. Certains modèles peuvent consommer plus de 130W ! Autant dire que si le système est mal ventilé, la montée en charge du processeur peut provoquer un échauffement important provoquant une surchauffe de celui-ci. S&#039;il dépasse ces caractéristiques de fonctionnement, il va alors exécuter du code incorrect provocant  un plantage du système.&lt;br /&gt;
&lt;br /&gt;
Un bon test pour vérifier que votre processeur n&#039;est pas la cause de votre instabilité : commencez par relever la température de votre machine au repos à l&#039;aide des informations fournies soit par l&#039;acpi soit pas lm_sensors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[erwan@R1 ~]$ cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             42 C&lt;br /&gt;
[erwan@R1 ~]$ &lt;br /&gt;
&lt;br /&gt;
[root@konilope ~]# sensors | grep Temp&lt;br /&gt;
M/B Temp:    +39°C  (low  =   +15°C, high =   +40°C)   sensor = thermistor   &lt;br /&gt;
CPU Temp:   +127°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
Temp3:       +44°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
[root@konilope ~]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode utilisant lm_sensors nécessite une interprétation de la part de l&#039;utilisateur. Dans cet exemple, il apparaît évidant que le processeur ne peut avoir une température de fonctionnement aussi élevée (127°C). L&#039;erreur est du à un mauvais calcul de la part de lm_sensors. Il se base sur le type de capteurs thermiques utilisé par la carte mère pour calculer la température des différents composants. Malheureusement, le montage électrique autour du capteur de température peut varier d&#039;un modèle de carte à un autre, ce qui fausse les calculs. On considéra donc, que pour cette machine (konilope) sa température se situe aux alentours de 42° : valeur moyenne entre les deux valeurs « cohérentes » relevées par lm_sensors. On pourra cependant vérifier cette approximation en relevant la température du disque sur à l&#039;aide de smartmontools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# smartctl -A /dev/hda | grep Temperature&lt;br /&gt;
194 Temperature_Celsius     0x0022   042   052   000    Old_age   Always       -       42&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, il est préférable de maintenir sa machine en dessous des 55° et celle de son processeur en dessous de 70°C. Au delà, le système risque d&#039;être instable. Si ce n&#039;est pas le cas, effectuez les modification nécessaire pour y parvenir : meilleure ventilation du processeur ou du boîtier par exemple.&lt;br /&gt;
&lt;br /&gt;
Ensuite, téléchargez l&#039;utilitaire cpuburn depuis un mirroir  (http://pages.sbcglobal.net/redelm/cpuburn_1_4_tar.gz)  ou depuis votre distribution linux favorite (oui, oui, urpmi cpuburn ça fonctionne ;o)).&lt;br /&gt;
&lt;br /&gt;
Vous y trouverez plusieurs programmes nommés burnXX ou XX représente votre processeur. La version P6 sera à utiliser sur les processeurs Intel Pentium 4, la version K7 pour les processeurs Athlon x86. Pour les processeurs plus récents, utilisez la version P6.&lt;br /&gt;
Ce logiciel réalise des boucles en langage assembleur ayant pour but de stresser votre processeur de manière importante et donc le faire chauffer. Lancez cpuburn autant de fois que vous avez de processeur sur votre machine puis observez la température de votre machine. Si lors de la montée en température votre système se fige, alors vous avez un problème de thermie. Si cpuburn ne fait pas planter votre ordinateur au bout de 10mn, vous pouvez considérez que votre système est stable de ce coté là. Vous pouvez aussi utiliser ce test pour vérifier que vos ventilateurs d&#039;ordinateurs portable se déclenchent bien en cas de surchauffe.&lt;br /&gt;
Sur un portable récent, on obtient le résultat suivant au bout de quelques minutes de cpuburn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             80 C&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Malgré la température très élevée du processeur, le système est resté stable ce qui permet de valider qu&#039;il est capable d&#039;encaisser une montée en température élevée. Bien entendu, plus votre machine sera « chaude » plus elle s&#039;usera rapidement. Il ne faut pas oublier que les autres composants peuvent souffrir de la chaleur dégagée par le processeur par exemple : les disques durs en sont un bon exemple car les plateaux ne supportent pas la chaleur.&lt;br /&gt;
Ce test est bon aussi ? A priori, les composants de base de votre système sont en bon état, vous pouvez commencer à regarder du coté configuration logicielle.&lt;br /&gt;
&lt;br /&gt;
== APIC es tu là ? ==&lt;br /&gt;
&lt;br /&gt;
Le manque de stabilité peut aussi s&#039;expliquer par la gestion des interruptions. &lt;br /&gt;
L&#039;architecture PIC (Programmable Interrupt Controllers)  représentée par la famille de composants Intel 8259, permettait une gestion de 8 interruptions pour un unique processeur. On les associe par 2 pour obtenir les 16 niveaux d&#039;interruptions nécessaire depuis nos vieux 80286 (milieu des années 80). Avec l&#039;arrivée des systèmes multi-processeurs, l&#039;architecture APIC (Advanced Programmable Interrupt Controllers) (Intel 82093) à été ajoutée pour permettre une gestion plus fine des interruptions. En effet, dans un contexte multi-processeurs, il est nécessaire de pouvoir choisir quel processeur traitera quelle interruption pour ne pas rester figé dans l&#039;ancien modèle (PIC) où le processeur de  « boot » est assigné à un ensemble d&#039;interruptions. &lt;br /&gt;
&lt;br /&gt;
De plus, l&#039;architecture APIC apporte une gestion de 24 interruptions, une gestion de priorité des interruptions et le routage de l&#039;interruption sur le bon processeur, contre un simple routage de 2*8 interruptions dans le modèle PIC sur un seul processeur. Depuis une dizaine d&#039;années, Intel propose le modèle APIC comme nouvelle architecture, y compris pour les systèmes mono-processeurs. Les ordinateurs récents, y compris les portables, sont maintenant équipés uniquement de composants APIC même si l&#039;on peut obtenir un comportement de type PIC avec ceux-ci.&lt;br /&gt;
&lt;br /&gt;
L&#039;architecture APIC est constituée d&#039;un ou plusieurs composants situé physiquement dans le southbridge (IO-APIC), généralement un par bus, et un composant situé dans le processeur : le Local APIC (LAPIC). Le LAPIC va permettre la gestion des interruptions au niveau du processeur local. Il permet aussi de générer des interruptions par exemple pour transmettre des interruptions à des processeurs voisins dans le contexte d&#039;un système multi-processeurs, ces messages sont appelés IPI (Inter Processor Interrupts). &lt;br /&gt;
&lt;br /&gt;
De plus le Local APIC (LAPIC) inclut un « timer » de précision cadencé à la fréquence du bus, généralement il peut être utilisé par l&#039;ordonnanceur de votre système d&#039;exploitation favori ou d&#039;autres outils de haut niveau (profiler kernel : oprofile, vtune). Les LAPIC et l&#039;IO-APIC sont reliés par un bus spécifique pour permettre un échange rapide des informations. &lt;br /&gt;
&lt;br /&gt;
Schema logique d&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
[image:acpi.jpg]&lt;br /&gt;
&lt;br /&gt;
Les IO-APIC vont donc se charger de collecter les interruptions provenant des périphériques systèmes et d&#039;en assurer le transfert vers le ou les processeur(s) suivant une route préalablement programmée par le BIOS et/ou le système d&#039;exploitation.&lt;br /&gt;
&lt;br /&gt;
Cependant, l&#039;implémentation des APIC dans les BIOS peut provoquer certaines instabilités sur votre système Linux. Par expérience, il n&#039;y a pas de règle pour trouver la configuration qui peut aider votre machine à se stabiliser car cela dépend de chaque machine. Des différences peuvent même exister entre  deux versions de BIOS d&#039;un même ordinateur. Cependant, dans la série 2.6 du noyau Linux et les version 2.4 récentes nous disposons d&#039;outils permettant de re-paramétrer cette configuration en activant/désactivant les IO-APIC ou les LAPIC.&lt;br /&gt;
&lt;br /&gt;
Chaque composant possède un activateur ou un inhibiteur, on aura donc d&#039;un coté « apic » et « noapic » pour la gestion des IO-APIC, « nolapic » et « lapic » de l&#039;autre pour la gestion des LAPIC. Ces 4 options sont à utiliser sur la ligne de commande du noyau, c&#039;est à dire au moment où le « bootloader » (lilo ou grub par exemple) va charger le noyau en mémoire. L&#039;utilisation de « apic » et « lapic » permet d&#039;activer ces composants qui ne l&#039;ont pas été par le BIOS. L&#039;activateur « apic » n&#039;est disponible que les architectures de type x86_64 car celui-ci est déjà activé sur les systèmes de type x86. On désactivera les APIC dans le cas où le système affiche des messages d&#039;erreurs sur les APIC comme : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;« APIC error on CPU0: 40(40) »&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ou&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;MP-BIOS bug: 8254 timer not connected to IO-APIC&lt;br /&gt;
failed.&lt;br /&gt;
timer doesn&#039;t work through the IO-APIC - disabling NMI Watchdog!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La désactivation des IO-APIC permet par exemple de corriger le comportement parfois récalcitrant de certaines cartes vidéos qui ne parviennent pas à afficher correctement en mode 2D/3D (écran noir par exemple).&lt;br /&gt;
&lt;br /&gt;
La non activation des LAPIC peut avoir comme conséquence un dysfonctionnement de l&#039;ACPI (gestion d&#039;énergie avancée). Ce cas est traité par le noyau, vous retrouverez dans les messages de démarrage la ligne suivante : « &amp;quot;Local APIC disabled by BIOS you can enable it with lapic ».&lt;br /&gt;
&lt;br /&gt;
Pour résumer, si votre machine, en général à architecture mono-processeur, a tendance à se bloquer lors de l&#039;utilisation de périphériques tels que le port usb, la carte graphique ou la carte son, essayez de désactiver le LAPIC puis l&#039; IO-APIC puis les 2.  Pour exemple, les cartes mère A7N8X de chez Asus ont largement tendance à se bloquer si l&#039;on ne spécifie pas « nolapic » lors du boot. Sur certaines machines, il faudra faire le contraire à savoir forcer l&#039;activation des LAPIC. Ceci dépendra de votre machine et de sa conception.&lt;br /&gt;
&lt;br /&gt;
== A vos marques, rebootez ! ==&lt;br /&gt;
&lt;br /&gt;
Certains machines peuvent présenter quelques soucis pour redémarrer. Encore une fois, on retrouve au coeur de ce problème l&#039;interaction entre le noyau et le matériel notamment l&#039;ACPI. Les ordinateurs portables dont le modèle HP nc6120 ont par exemple le bon goût de rester bloqués sur le message « No reboot fixup found for your hardware ». Ceci indique que le noyau ne connaît pas de contournement pour ce matériel (ce qui est le cas de la quasi totalité des ordinateurs) mais puisque vous voyez ce message c&#039;est que votre machine n&#039;a pas réussi à rebooter. Heureusement, il existe des contournements pour permettre un redémarrage plus « bas niveau ». Le noyau défini les modes suivants : « b » « c » « h » « s » et « w ».&lt;br /&gt;
Le mode de reboot peut être défini sur la ligne de commande du noyau suivant la forme « reboot=&amp;lt;mode&amp;gt; ». Le mode « s » est réservé au systèmes multi-processeurs, elle va réinitialiser chacun des processeurs.&lt;br /&gt;
&lt;br /&gt;
Le mode « b » permet quant à lui de rebooter en faisant un appel direct au bios qui se chargera de faire redémarrer la machine. Ce mode fonctionne plutôt bien car dans le cas d&#039;un BIOS posant problème sur l&#039;ACPI, on peut espérer avoir un reboot correct. C&#039;est le cas sur de notre portable cité précédement.&lt;br /&gt;
&lt;br /&gt;
Le mode « h » se chargera de faire redémarrer la machine en réinitialisant le processeur. C&#039;est l&#039;équivalent du mode « s » pour les environnements mono-processeurs.  Pour finir, les modes « c » et « w » correspondent aux modes « cold » et « warn » : ces modes sont plus connus sous le nom de « reboot à froid »  et « reboot à chaud ». Le premier effectuera les tests de mémoire tandis que le second exécutera un reboot plus court.&lt;br /&gt;
&lt;br /&gt;
De manière générale, on utilisera plutôt le mode « b » ou « h » pour les systèmes mono-processeurs récalcitrant et le mode « s » pour les systèmes multi-processeurs.&lt;br /&gt;
&lt;br /&gt;
== Toujours plus de performance ==&lt;br /&gt;
Votre configuration est bien stable depuis un certain temps. Toutefois vous trouvez qu&#039;elle est un peu lente, elle ne vous donne pas satisfaction par rapport à ce qu&#039;elle devrait fournir.&lt;br /&gt;
Cette partie de l&#039;article va explorer comment vérifier et corriger les problèmes de performance des différents composants.&lt;br /&gt;
Note: certaines configuration mono-processeur nécessitent de désactiver LAPIC (nolapic)&lt;br /&gt;
&lt;br /&gt;
=== Le disque dur ===&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le disque dur semble un peu lent et pénalise le système dans son ensemble. Hdparm est là pour vous aider à y voir plus clair. Hdparm est à l&#039;origine conçu pour les systèmes de disques IDE de type PATA. Le nouveau système de disque SATA, ne permet pas toujours en fonction de l&#039;implémentation, l&#039;appel à toutes ces astuces. Cependant les nouvelles séries de kernel à partir du 2.6.15 devrait permettre une gestion plus unifiée des systèmes de disques PATA et SATA.&lt;br /&gt;
&lt;br /&gt;
Le test « hdparm -t /dev/&amp;lt;mon_device&amp;gt; » permet de tester la vitesse de lecture depuis le disque dur jusqu&#039;en mémoire. Une valeur de 25Mo/sec est un minimum pour des machines récentes. Plusieurs paramètres peuvent influencer les performances d&#039;un disque IDE. &lt;br /&gt;
La commande « hdparm -cd » permet de vérifier que les entrées/sorties sont réalisées en 16-bit (le mode 32-bit n&#039;offre pas de performance supplémentaire) alors que le DMA (Direct Memory Access) est activé. Ceci permet la minimisation de l&#039;utilisation du processeur pendant les accès au disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -cd /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
 IO_support   =  0 (default 16-bit)&lt;br /&gt;
 using_dma    =  1 (on)&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande « hdparm -c0d1 /dev/&amp;lt;mon_device&amp;gt; » permet de configurer le périphérique dans ce mode. Le noyau de votre distribution Linux devrait le réaliser de manière automatique.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -I » permet d&#039;obtenir plus d&#039;informations sur la configuration de votre disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -I /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
ATA device, with non-removable media&lt;br /&gt;
	Model Number:       FUJITSU MHT2040AT                       &lt;br /&gt;
	Serial Number:      NN77T3C13KB9&lt;br /&gt;
	Firmware Revision:  0022    &lt;br /&gt;
Standards:&lt;br /&gt;
	Used: ATA/ATAPI-6 T13 1410D revision 3a &lt;br /&gt;
	Supported: 6 5 4 3 &lt;br /&gt;
Configuration:&lt;br /&gt;
	Logical		max	current&lt;br /&gt;
	cylinders	16383	16383&lt;br /&gt;
	heads		16	16&lt;br /&gt;
	sectors/track	63	63&lt;br /&gt;
	--&lt;br /&gt;
	CHS current addressable sectors:   16514064&lt;br /&gt;
	LBA    user addressable sectors:   78140160&lt;br /&gt;
	device size with M = 1024*1024:       38154 MBytes&lt;br /&gt;
	device size with M = 1000*1000:       40007 MBytes (40 GB)&lt;br /&gt;
Capabilities:&lt;br /&gt;
	LBA, IORDY(cannot be disabled)&lt;br /&gt;
	bytes avail on r/w long: 4	Queue depth: 1&lt;br /&gt;
	Standby timer values: spec&#039;d by Standard, no device specific minimum&lt;br /&gt;
	R/W multiple sector transfer: Max = 16	Current = 16&lt;br /&gt;
	Advanced power management level: 128 (0x80)&lt;br /&gt;
	Recommended acoustic management value: 254, current value: 254&lt;br /&gt;
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 &lt;br /&gt;
	     Cycle time: min=120ns recommended=120ns&lt;br /&gt;
	PIO: pio0 pio1 pio2 pio3 pio4 &lt;br /&gt;
	     Cycle time: no flow control=240ns  IORDY flow control=120ns&lt;br /&gt;
Commands/features:&lt;br /&gt;
	Enabled	Supported:&lt;br /&gt;
	   *	READ BUFFER cmd&lt;br /&gt;
	   *	WRITE BUFFER cmd&lt;br /&gt;
	   *	Host Protected Area feature set&lt;br /&gt;
	   *	Look-ahead&lt;br /&gt;
	   *	Write cache&lt;br /&gt;
	   *	Power Management feature set&lt;br /&gt;
		Security Mode feature set&lt;br /&gt;
	   *	SMART feature set&lt;br /&gt;
	   *	Mandatory FLUSH CACHE command &lt;br /&gt;
	   *	Device Configuration Overlay feature set &lt;br /&gt;
	   *	Automatic Acoustic Management feature set &lt;br /&gt;
	   *	SET MAX security extension&lt;br /&gt;
		Power-Up In Standby feature set&lt;br /&gt;
	   *	Advanced Power Management feature set&lt;br /&gt;
	   *	DOWNLOAD MICROCODE cmd&lt;br /&gt;
	   *	SMART self-test &lt;br /&gt;
	   *	SMART error logging &lt;br /&gt;
Security: &lt;br /&gt;
		supported&lt;br /&gt;
	not	enabled&lt;br /&gt;
	not	locked&lt;br /&gt;
		frozen&lt;br /&gt;
	not	expired: security count&lt;br /&gt;
	not	supported: enhanced erase&lt;br /&gt;
	40min for SECURITY ERASE UNIT. &lt;br /&gt;
HW reset results:&lt;br /&gt;
	CBLID- above Vih&lt;br /&gt;
	Device num = 0 determined by the jumper&lt;br /&gt;
Checksum: correct&lt;br /&gt;
[root@R1 ~]#&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On y retrouve le modèle, le numéro de série et la version du firmware qui peuvent être utiles en cas de contact avec le Service Après-Vente ou de mise à jour pour une série de firmwares défaillante.&lt;br /&gt;
&lt;br /&gt;
La ligne commençant par « DMA » dans la partie « Capabilities » permet d&#039;afficher la vitesse de transfert négociée entre le disque dur et le driver IDE de Linux. L&#039;étoile précède la valeur actuelle. Dans cet exemple, le mode udma5 est sélectionné : ceci est conforme aux machines disponibles sur le marché depuis environ 3 ans.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, voici le tableau de conversion entre le mode DMA et la vitesse maximale associée.&lt;br /&gt;
&lt;br /&gt;
Type de fonctionnement&lt;br /&gt;
Vitesse Maximale en MO/sec&lt;br /&gt;
UltraDMA 0&lt;br /&gt;
16,6&lt;br /&gt;
UltraDMA 1&lt;br /&gt;
25&lt;br /&gt;
UltraDMA 2&lt;br /&gt;
33,3&lt;br /&gt;
UltraDMA 3&lt;br /&gt;
44,4&lt;br /&gt;
UltraDMA 4&lt;br /&gt;
66,6&lt;br /&gt;
UltraDMA 5&lt;br /&gt;
100&lt;br /&gt;
UltraDMA 6&lt;br /&gt;
133,33&lt;br /&gt;
&lt;br /&gt;
Une configuration actuelle ne devrait pas être en dessous de UDMA5. Si ce n&#039;était pas le cas, on peut essayer de renégocier la vitesse de transfert à l&#039;aide de la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hdparm -X udma5 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celle-ci permet de forcer le mode UltraDMA5. Il faut utiliser cette commande avec précaution car elle pourrait générer des pertes ou de la corruption de données en cas de transfert pendant ce changement de mode.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi impacter les performances de votre disque dur en modifiant sa vitesse de rotation. Cette fonctionnalité connue sous le nom de Automatic Acoustic Management (AAM) est utilisable avec l&#039;option « -M » de hdparm. La valeur 128 représentera la vitesse la plus faible avec un disque silencieux, la valeur 254 la vitesse la plus élevée mais avec comme contre-partie un disque plus bruyant. On pourra noter des différences de quelques Mo/sec selon les configurations.&lt;br /&gt;
&lt;br /&gt;
Il est aussi à noter que l&#039;utilisation de logiciels permettant une meilleure gestion d&#039;énergie (cpufreq, laptop-mode) peut dégrader les performances d&#039;un disque dur de manière notable.&lt;br /&gt;
&lt;br /&gt;
=== Configuration bas niveau du réseau ===&lt;br /&gt;
&lt;br /&gt;
Le réseau local filaire peut parfois être un peu lent. Voici quelques tests pour vérifier si la lenteur provient du logiciel, du noyau ou du matériel. Tout d&#039;abord, explorons la trousse à outils indispensable pour analyser votre carte réseau : ethtool. Digne successeur de mii-tool, il permet de s&#039;informer sur la configuration de votre carte réseau. &lt;br /&gt;
&lt;br /&gt;
Il suffit de lancer « ethtool &amp;lt;votre_interface&amp;gt; » » pour obtenir la configuration matérielle de votre carte. On y retrouve les modes supportés par votre carte (Supported Link Modes ainsi que la vitesse actuelle (Speed), obtenue par auto-négociation dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
On peut également savoir si le câble réseau est connecté à la carte grâce à la ligne « Link Detected ». Le type de « duplex » utilisé permet également de savoir si la négociation avec l&#039; élément actif au bout de votre câble (commutateur, concentrateur ou une autre machine) a correctement fonctionné. Le duplex définit le mode de  transmission : le mode half-duplex indique que l&#039;on émet puis on reçoit des données, le mode full-duplex indique que l&#039;on peut émettre et recevoir en même temps des données. Le mode full-duplex est donc plus que recommandé pour vos équipements réseaux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# ethtool  eth1&lt;br /&gt;
Settings for eth1:&lt;br /&gt;
	Supported ports: [ TP MII ]&lt;br /&gt;
	Supported link modes:   10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Supports auto-negotiation: Yes&lt;br /&gt;
	Advertised link modes:  10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Advertised auto-negotiation: Yes&lt;br /&gt;
	Speed: 100Mb/s&lt;br /&gt;
	Duplex: Full&lt;br /&gt;
	Port: MII&lt;br /&gt;
	PHYAD: 1&lt;br /&gt;
	Transceiver: internal&lt;br /&gt;
	Auto-negotiation: on&lt;br /&gt;
	Current message level: 0x000020c1 (8385)&lt;br /&gt;
	Link detected: yes&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesurer les {contre}performances de votre réseau ===&lt;br /&gt;
&lt;br /&gt;
Une fois vérifiée la bonne configuration de votre matériel, nous pouvons passer à la vérification des performances entre deux machines.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire netpipe (http://www.scl.ameslab.gov/netpipe/) permet de réaliser des tests de performance mais aussi d&#039;intégrité entre deux machines. Il permet de tester les performances du réseau au travers la couche IP et non pas depuis un mode plus bas niveau comme pourrait l&#039;être un test utilisant directement le driver Ethernet. Ce test permet donc de valider que la configuration matérielle mais aussi logicielle est correcte.&lt;br /&gt;
&lt;br /&gt;
Sur la première machine, exécutez « NPtcp » : netpipe se positionne en mode « serveur ».&lt;br /&gt;
Sur la seconde machine, exécutez « NPtcp -h &amp;lt;machine1&amp;gt; » : netpipe se connecte au serveur netpipe de la machine nommée machine1 pour effectuer le test de performance.&lt;br /&gt;
&lt;br /&gt;
Le test par défaut teste les communication allant de 1 octet jusqu&#039;à 8 Mo. Il peut prendre plusieurs minutes si le réseau est « lent ». Le test va montrer pour chaque taille de paquet la performance obtenue. Il est normal d&#039;obtenir des performances faibles pour des paquets d&#039;une taille inférieure à 8 Ko. Transporter des petits paquets nécessite de réaliser beaucoup d&#039;opérations pour le processeur pour une quantité d&#039;information minime. Les performances seront meilleures à partir d&#039;environ 16 Ko et maximales à partir de 128 Ko. Sur un système utilisant du gigabit ethernet, on constatera une performance de 39Mbps à 256 octets, 287Mbps à 4Ko, 614Mbps à 16Ko, 845Mbps à 128Ko, 895Mbps à 8Mo.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ainsi vérifier et comparer facilement les performances de votre configuration réseau. Netpipe permet également de tester la vitesse du réseau pour une taille de paquets définie entre la taille indiqué par l&#039;option « -l » et la taille indiquée par l&#039;option « -u ». Ainsi, NPtcp -l 16384 -u 16384 permet de tester la bande passante réseau pour une taille de paquet égale à 16Ko.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -n &amp;lt;nb-cycle&amp;gt; » permet de définir le nombre de boucles à réaliser pour le test (50 par défaut). Enfin, pour réaliser des tests « full-duplex », on utilisera l&#039;option « -2 ». Ce test permet de s&#039;assurer du bon fonctionnement du mode de communication permettant l&#039;écriture et la lecture simultanées.&lt;br /&gt;
&lt;br /&gt;
Attention, même si ce test donne de bons résultats, cela ne veut pas dire que la configuration est exempte d&#039;erreur de configuration. Par exemple, les performances réseaux peuvent être très bonnes en point à point mais mauvaises lorsque l&#039;on aura une charge réseau avec plusieurs clients. Dans cette situation, il faut vérifier que le contrôle de flux est bien activé sur toutes les machines. L&#039;option « ethtool -a » permet de vérifier que les champs « rx » et « tx » sont placés sur « on ». Si ce n&#039;était pas le cas activez-les avec la commande « ethtool -A eth0 rx on » et « ethtool -A eth0 tx on ».&lt;br /&gt;
&lt;br /&gt;
Les cartes réseaux, des serveurs essentiellement, permettent maintenant de réaliser le « tcp segment offload ». Cette technique permet de décharger une partie du traitement TCP directement dans l&#039;électronique de la carte réseau. Ceci à pour effet de décharger le processeur central d&#039;un traitement fastidieux. L&#039;option « -k » d&#039;ethtool permet de consulter l&#039;état de cette fonctionnalité (off/on). On pourra l&#039;activer sur des serveurs générant un gros trafic réseau par exemple : « ethtool -K eth0 tso on ».&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant équipé de nouveau outils pour traquer la perte de performances de votre installation réseau. Ceci couplé aux habituels tcpdump/ethereal, voilà une belle panoplie du zorro du réseau.&lt;br /&gt;
&lt;br /&gt;
=== Quand la latence s&#039;en mêle ===&lt;br /&gt;
&lt;br /&gt;
La latence représente le temps nécessaire à un système pour prendre en compte un événement.&lt;br /&gt;
&lt;br /&gt;
Il arrive que certains périphériques de votre machine nécessitant des débits importants ou une latence assez faible sur le bus PCI soient « poussifs ». On retrouve dans cette catégorie les cartes vidéos accélératrice 3D, les cartes son et les cartes d&#039;acquisition firewire ou DVB (récepteur de télévision numérique terrestre : TNT).&lt;br /&gt;
&lt;br /&gt;
Un périphérique branché sur le bus PCI doit attendre que le bus soit libre pour émettre les données vers la mémoire centrale. Le bus PCI qui est le coeur de communication des périphériques est donc soumis en permanence à un arbitrage qui permet de décider qui doit émettre des données et qui doit attendre. Cet arbitrage est en partie réalisé grâce au « latency_timer ».&lt;br /&gt;
&lt;br /&gt;
Chaque périphérique possède une valeur de « latency_timer » comprise en 0 et 248 cycles d&#039;horloge du bus. Plus la valeur sera importante plus le périphérique disposera de temps pour transmettre des informations. Une latence de 248 cycles permet d&#039;obtenir une priorité forte sur le bus, ce qui permet un débit important. A contrario, une latence de 0 indiquera au périphérique qu&#039;il doit cesser ses transmissions si un autre composant à besoin du bus : ceci se traduira par une perte de bande passante importante.&lt;br /&gt;
&lt;br /&gt;
La configuration réalisée par défaut sur votre machine doit être correcte mais il peut arriver qu&#039;une carte 3D ou DVB soit configurée avec une latence trop faible, ce qui  aurait pour conséquence d&#039;offrir une image saccadée et peu fluide. Une carte son offrirait également le même type de symptômes avec un son hâché ou excessivement métallique.&lt;br /&gt;
&lt;br /&gt;
Heureusement, une série d&#039;outils est là pour vous aider à diagnostiquer le problème mais aussi à le résoudre. Le projet pciutils  (http://atrey.karlin.mff.cuni.cz/~mj/linux.shtml#pciutils) contient deux outils indispensables: lspci et setpci. Bien entendu, votre distribution favorite devrait posséder ce logiciel, il vous suffira de l&#039;installer avec  votre gestionnaire de paquet favori (urpmi, apt, smart).&lt;br /&gt;
&lt;br /&gt;
La commande « lspci » vous permet de lister les périphériques PCI disponibles sur votre ordinateur (cf article paru dans le numéro 68).  Cet exemple se basera sur une carte vidéo  ayant pour adresse sur le bus PCI « 01:00.0 ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@lagirafe] lspci -v -s 01:00.0&lt;br /&gt;
01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go5200 32M/64M] (rev a1) (prog-if 00 [VGA])&lt;br /&gt;
	Subsystem: Samsung Electronics Co Ltd: Unknown device c00f&lt;br /&gt;
	Flags: bus master, 66Mhz, medium devsel, latency 16, IRQ 11&lt;br /&gt;
	Memory at c8000000 (32-bit, non-prefetchable) [size=16M]&lt;br /&gt;
	Memory at d8000000 (32-bit, prefetchable) [size=128M]&lt;br /&gt;
	Expansion ROM at &amp;lt;unassigned&amp;gt; [disabled] [size=128K]&lt;br /&gt;
	Capabilities: [60] Power Management version 2&lt;br /&gt;
	Capabilities: [44] AGP version 3.0&lt;br /&gt;
[root@lagirafe]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On retiendra dans cette ligne, la valeur &#039;latency 16&#039;. Ceci risque de poser problème lorsque celle-ci aura besoin d&#039;un fort débit pendant un jeu par exemple. Augmenter la latence va donc se révéler nécessaire pour ce périphérique.&lt;br /&gt;
&lt;br /&gt;
La commande setpci permet de modifier les paramètres PCI d&#039;un périphérique ou d&#039;un bus complet avec tous ses périphériques. &lt;br /&gt;
&lt;br /&gt;
La commande « setpci -v -d 01:* latency_timer=20 » permet de positionner tous les périphériques  du bus 01 à une valeur de 32 cycles. Il est à noter que la commande setpci utilise des valeurs en hexadécimal mais lspci affichera les valeurs en décimal.&lt;br /&gt;
&lt;br /&gt;
Pour en revenir à nos moutons, la correction de la latence de cette carte graphique se fera avec la commande «  setpci -v -d 01:00.0 latency_timer=f8 ». Ceci positionne donc la carte sur la plus grande valeur de latence possible, ce qui lui garantira la plus grande bande passante possible. Il est possible d&#039;utiliser la valeur « ff » comme paramètre pour « latency_timer » mais celui-ci sera converti à la volée par la commande setpci en « 0xf8 ».&lt;br /&gt;
&lt;br /&gt;
Attention, certains composants de votre machine doivent rester en « latency_timer=0 » pour garantir une bon fonctionnement de votre système : il ne faudra donc pas modifier les latences des contrôleurs mémoire et des ponts PCI connectés généralement sur le bus « 0:* ».&lt;br /&gt;
&lt;br /&gt;
== DSDT : le cauchemar continue ! ==&lt;br /&gt;
&lt;br /&gt;
Cette partie de l&#039;article a pour but d&#039;expliquer le problème que peut représenter la table DSDT pour un certain nombre de machines et surtout les ordinateurs portables. &lt;br /&gt;
&lt;br /&gt;
La norme ACPI 3.0 de Septembre 2004 disponible gratuitement à l&#039;adresse http://www.acpi.info/DOWNLOADS/ACPIspec30.pdf définit la DSDT comme une table remplie par un OEM permettant au système d&#039;exploitation de découvrir les ressources pour la gestion de l&#039;énergie avancée, de la gestion thermique ainsi que la gestion du Plug&#039;nPlay des ressources définies par l&#039;ACPI.&lt;br /&gt;
&lt;br /&gt;
Voici une description certes un peu théorique mais nécessaire pour bien comprendre la problématique et ses conséquences. Le constructeur de l&#039;ordinateur doit donc définir dans le BIOS une table contenant une liste de ressources et leurs configuration et ce pour que le système d&#039;exploitation puisse s&#039;en servir. Noble cause n&#039;est il pas ? Tout au long des 618 pages de ce document sont spécifiés les éléments du langage à utiliser ainsi que sa syntaxe. L&#039; « ACPI Source Language » permettra donc aux développeurs d&#039;écrire des DSDT puis de les compiler dans un format nommé « ACPI Machine Language » en utilisant un compilateur adéquat. Le système d&#039;exploitation utilisera la table compilée (AML) pour accéder aux ressources ACPI. &lt;br /&gt;
Sur la plupart des ordinateurs portables, la table DSDT ne respecte pas la norme ACPI dans sa syntaxe. Ceci est très gênant car cela bloque le code de l&#039;interpréteur ACPI du noyau Linux qui essaie de la lire. Le résultat est sans appel, pas d&#039;ACPI, pas de gestion d&#039;énergie avancée, plus de ventilation automatique sur certains modèles d&#039;ordinateurs, plus de touche de gestion de contraste/luminosité sur d&#039;autres etc...&lt;br /&gt;
&lt;br /&gt;
Ceci est très gênant sur un ordinateur portable. Alors que faire ? Dans un premier temps, prévenir le constructeur que son BIOS est incorrect et ne respecte pas la norme ACPI. La réponse se fait toujours attendre pour tous ceux qui « osent » poser la question au support technique : à savoir, les constructeurs ignorent tout simplement les mails de ce type.&lt;br /&gt;
La seconde étape puisque vous êtes devant le fait accompli d&#039;une machine non conforme, il va falloir corriger cette table. Il suffit de récupérer la table actuelle via la commande &#039;cat /proc/acpi/dsdt &amp;gt; dsdt.aml&#039; si vous avez la chance d&#039;avoir un répertoire /proc/acpi malgré une table DSDT endommagée, sinon utilisez la commande &#039;acpidump -b -t dsdt -o dsdt.aml&#039;. La commande acpidump est  fournit dans le projet pmtools (ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools-20050926.tar.bz2) &lt;br /&gt;
Vous avez donc extrait la table DSDT de votre système. Il ne reste plus qu&#039;à essayer de la recompiler. Pour cela, le compilateur IASL de la société Intel (http://developer.intel.com/technology/iapc/acpi/downloads.htm) offre sous Linux et Windows une plate-forme de compilation pour le langage ASL.&lt;br /&gt;
&lt;br /&gt;
Suivez les instructions du site pour télécharger et compiler la version unix d&#039;iasl. Ensuite, décompilez la table avec la commande « iasl -d dsdt.aml ». Le fichier dsdt.dsl vient d&#039;être créé par le décompilateur. Il suffit de le recompiler avec la commande « iasl -tc dsdt.dsl » pour constater les dégâts ! La DSDT que vous avez dans votre BIOS est généralement compilée par le compilateur de Microsoft qui semble autoriser une syntaxe plus qu&#039;approximative.&lt;br /&gt;
Si vous avez de la chance, votre DSDT s&#039;est recompilée sans erreurs, vous obtenez donc un fichier dsdt.hex et un fichier dsdt.aml. Il ne reste plus qu&#039;à injecter cette dsdt dans le noyau Linux et le tour sera joué.&lt;br /&gt;
&lt;br /&gt;
Si vous avez moins de chance, votre DSDT est syntaxiquement incorrecte et génère des erreurs. Les expliquer plus en détails nécessiterait un article complet, il ne sera cité que les plus « habituelles » (sic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2626:                     Field (ECR, DWordAcc, Lock, Preserve) &lt;br /&gt;
Error    1048 -                              ^ Host Operation Region requires ByteAcc access &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette erreur présente à ligne 2626 du fichier dsdt.asl indique une erreur de type dans la déclaration du champ ECR. Il suffit dans ce cas de changer le mot « DWordAcc » par « ByteAcc ». Celle-ci reste assez simple à corriger, on se demande donc pourquoi les constructeurs ne prennent pas le temps de vérifier et de corriger leur BIOS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2672:                     Method (_GLK, 1, NotSerialized) &lt;br /&gt;
Warning  2024 -                                ^ Reserved method has too many arguments ( _GLK requires 0) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode _GLK n&#039;a besoin que de 0 paramètre tandis que ce code en utilise 2 ! La correction est assez simple : il suffit de remplacer la ligne 2672 par « Method(_GLK) ».&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur la correction des erreurs de compilation de votre table dsdt, je vous recommande les tutoriaux disponibles depuis la page http://acpi.sourceforge.net/dsdt/index.php du projet ACPI.&lt;br /&gt;
&lt;br /&gt;
Votre DSDT est compilée avec succès, il ne vous reste plus qu&#039;à l&#039;ajouter pour que votre noyau puisse l&#039;utiliser à la place de celle fourni par le BIOS (modifiable uniquement par le constructeur, via une mise à jour).&lt;br /&gt;
&lt;br /&gt;
Il existe trois possibilités pour inclure une table DSDT : la modification du noyau Linux ( noyau &amp;lt; 2.6.9), l&#039;injection de la DSDT dans la configuration du noyau (noyau &amp;gt;= 2.6.9), l&#039;intégration de la table DSDT dans l&#039;initrd qui nécessite un patch kernel disponible à l&#039;adresse http://gaugusch.at/kernel.shtml.&lt;br /&gt;
&lt;br /&gt;
Pour les noyaux 2.6.9 et supérieur, copiez votre fichier dsdt.hex sous le nom «/usr/src/linux/include/acpi/dsdt_table.h » puis reconfigurez votre noyau.&lt;br /&gt;
Insérer « dsdt_table.h » dans l&#039;option « Include you custom DSDT » disponible dans le menu « Power Management/ACPI/ ». Recompilez votre noyau et redémarrez avec votre nouveau noyau.&lt;br /&gt;
Pour les noyaux inférieurs à 2.6.9, il est possible de modifier le code source de votre noyau pour intégrer votre DSDT mais il est préférable d&#039;utiliser le patch permettant l&#039;insertion de la table DSDT dans l&#039;initrd. Recompilez votre noyau avec ce patch, puis suivez la procédure décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Certaines distributions Linux comme « Mandriva Linux » possèdent le patch qui permet de n&#039;avoir qu&#039;à reconstruire l&#039;initrd avec la commande « mkinitrd –dsdt=/boot/dsdt.aml /boot/initrd-`uname -r`.img `uname -r`  » puis de relancer lilo avant de redémarrer votre machine. Lors du démarrage de celle-ci vous devriez voir le message suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ACPI: Looking for DSDT in initrd... found (at offset 0x4f8d9).&lt;br /&gt;
ACPI-0294: *** Info: Table [DSDT] replaced by host OS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant avec une table DSDT correcte et un ACPI fonctionnel. La question qui reste ouverte est pourquoi les constructeurs n&#039;utilisent pas un compilateur digne de ce nom pour permettre à leur clients de pouvoir utiliser d&#039;autres systèmes d&#039;exploitation que Windows de Microsoft. &lt;br /&gt;
&lt;br /&gt;
Pour la petite histoire, si vous cherchez dans votre dsdt vous risquez de tomber ce genre de lignes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows NT&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft WindowsME: Millennium Edition&amp;quot;), Zero))&lt;br /&gt;
 If (LEqual (SizeOf (\_OS), 0x27)) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque qu&#039;un système d&#039;exploitation souhaite utiliser les ressources ACPI du BIOS, il utilise son nom de système d&#039;exploitation (acpi_os_name). On retrouve donc dans les bios des parties qui ne seront exécutées que pour certains systèmes d&#039;exploitation de Microsoft. On retrouve même certains tests où c&#039;est la longueur du nom qui compte...... Ceci prouve bien que les constructeurs d&#039;ordinateurs savent corriger des tables DSDT pour les systèmes d&#039;exploitation mais pas forcément pour le notre malheureusement. Depuis le noyau 2.6.9, le noyau Linux utilise « Windows NT » comme « acpi_os_name »  pour assurer une meilleure compatibilité matérielle dixit Len Bron d&#039;Intel dans le changelog de cette version.&lt;br /&gt;
&lt;br /&gt;
== Comment trouver le pilote qui va avec votre matériel ? ==&lt;br /&gt;
&lt;br /&gt;
Cette question on se la pose souvent mais uniquement lorsque l&#039;on essaye de brancher un nouveau périphérique sur sa machine. Les distributions récentes permettent de détecter automatiquement votre matériel et de lui associer un pilote avec sa configuration. Ce mécanisme fonctionne plutôt bien mais cela n&#039;évite pas les dysfonctionnements voir l&#039;absence de fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Pour vérifier si votre noyau Linux est capable de supporter un nouveau périphérique PCI par exemple, il suffit d&#039;en récupérer les identifiants PCI (constructeur et produit) puis de les rechercher dans le fichier « /lib/modules/`uname -r`/modules.pcimap » qui est auto-généré lors de la commande depmod.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire « lspcidrake -v » vous permet de trouver les identifiants PCI de votre carte, la commande « lspci » vous permet de trouver le nom de votre périphérique puis faites un « lspci -n » pour en trouver la correspondance numérique. On utilisera la position du périphérique sur le bus pour retrouver la correspondance numérique « 02:05.0 » dans cet exemple.&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome] lspci&lt;br /&gt;
[....]&lt;br /&gt;
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)&lt;br /&gt;
[root@pumphome] lspci -n&lt;br /&gt;
[...]&lt;br /&gt;
02:05.0 Class 0200: 14e4:4401 (rev 01)&lt;br /&gt;
[root@pumphome]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi cette carte réseau possède les identifiants 14e4 (constructeur) et 4401 (produit). Il suffit de rechercher cette valeur dans le modules.pcimap, ce qui nous donnera la correspondance en module (pilote).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome]  grep &amp;quot;0x000014e4 0x00004401&amp;quot; /lib/modules/2.6.12-12mdk-i686-up-4GB/modules.pcimap &lt;br /&gt;
b44               0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
bcm4400      0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit ici que cette carte peut utiliser le driver b44 ou le driver bcm4400. On ne trouve pas toujours les identifiants PCI de produit sous leur forme directe, on peut également trouver « 0Xffffffff » qui indique que tous les cartes du constructeur sont gérées par un module.&lt;br /&gt;
Il ne vous restera plus qu&#039;à effectuer la configuration associée à ce périphérique pour qu&#039;il fonctionne correctement.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
La fin de cet article conclut une toute petite série de deux articles ayant pour but de vulgariser l&#039;architecture de nos machines, de découvrir les outils disponibles pour mieux comprendre leur configuration et au besoin régler les problèmes de configuration matérielle qui ont souvent le don de nous pourrir la vie.&lt;br /&gt;
&lt;br /&gt;
Merci à LaurentJ de #Mandrivafr pour ses tests complémentaires sur les problèmes d&#039;IO-APIC. Un énorme merci à Nicolas Planel pour sa relecture pointue et également Anne pour sa patience de girafe à relire et « quaurigé »mes « photes »,  ainsi qu&#039;à tous ceux qui m&#039;ont aidé à découvrir ce que je restitue dans cet article.&lt;br /&gt;
&lt;br /&gt;
Cet article a été publié dans Linux Magazine France n°78. Il est publié sur Léa avec l&#039;aimable autorisation de l&#039;éditeur.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12778</id>
		<title>Découvrez les ressources de votre machine (La suite)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12778"/>
		<updated>2006-06-11T20:28:20Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* La mémoire qui flanche ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Découvrez les ressources de votre machine (La suite) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A nouvelle année, nouvelles résolutions ! Paru dans le numéro 68, un premier article dédié à la découverte des outils disponibles pour la récupération des configurations de votre machine promettait une suite.  Je vous propose donc de reprendre ce voyage au centre de votre ordinateur. &lt;br /&gt;
&lt;br /&gt;
Cet article sera articulé autour du diagnostic de pannes et des correctifs associés mais aussi de « trucs &amp;amp; astuces » permettant d&#039;optimiser votre configuration.&lt;br /&gt;
&lt;br /&gt;
== Savez-vous planter les choux ? ==&lt;br /&gt;
&lt;br /&gt;
Les choux peut-être pas mais les ordinateurs je pense que c&#039;est arrivé au moins une fois à chaque lecteur qui lit cet article. Rien de plus énervant qu&#039;un écran qui se fige, le pointeur de souris qui ne se déplace plus, le clavier qui ne répond plus non plus.... Planté ! Ce constat est assez facile à établir mais en trouver la cause reste un problème nettement plus complexe tellement le nombre de causes possibles est important.&lt;br /&gt;
&lt;br /&gt;
Deux solutions : ignorer le problème et relancer le système en se disant que ça « passera », ou alors chercher la cause du problème en essayant de trouver une méthode reproduisant le « plantage » tant redouté.&lt;br /&gt;
&lt;br /&gt;
La première solution fonctionne assez bien mais si l&#039;on à faire à un « vrai » problème de configuration matérielle ou logicielle, on arrivera assez vite à ne plus pouvoir éviter la seconde voire la troisième. J&#039;allais oublier cette troisième solution destinée aux plus riches d&#039;entre vous : changer de matériel. Cette solution coûteuse peut parfois se révéler efficace, parfois pas du tout. A quoi bon changer un composant sans savoir si c&#039;était bien celui-ci qui posait problème ?&lt;br /&gt;
Quelque soit la solution retenue, il sera de toute manière nécessaire de localiser la panne pour y apporter la réponse adéquate. Certaines sociétés ou particuliers se sont spécialisés dans ce dépannage ou l&#039;utilisateur est « dépassé » par les événements.&lt;br /&gt;
&lt;br /&gt;
Cet article vous fera, je l&#039;espère, découvrir quelques outils et méthodes pour valider un par un les composants de votre ordinateur. Cela vous permettra j&#039;espère d&#039;être un peu moins dépourvu quand un problème surviendra. L&#039;article reproduira les étapes qu&#039;il faut suivre pour isoler le « fautif ».&lt;br /&gt;
&lt;br /&gt;
== Les causes possibles d&#039;un « plantage » ==&lt;br /&gt;
&lt;br /&gt;
On retrouve deux grandes catégories de pannes provoquant des dysfonctionnements importants sur un système informatique.&lt;br /&gt;
* une panne du matériel&lt;br /&gt;
* une erreur logicielle au niveau du noyau et des pilotes (drivers)&lt;br /&gt;
&lt;br /&gt;
Il faudra donc être capable de séparer la panne matérielle qui « force » l&#039;ordinateur à entrer dans un mode de fonctionnement non prévu et instable, de l&#039;erreur logicielle qui équivaut à demander à l&#039;ordinateur de faire « n&#039;importe quoi » et qui va donc se « planter ».&lt;br /&gt;
&lt;br /&gt;
Le terme « planté » utilisé ici équivaut à un arrêt du système à cause d&#039;erreurs sévères : instruction illégale ou composants défaillants. Le terme de « plantage » est aussi utilisé pour décrire le fonctionnement d&#039;une application qui se ferme inopinément. Ce cas est plus souvent lié à une erreur de programmation de l&#039;application qu&#039;à une erreur du système. Nous ne parlerons donc pas de ce second cas dans cet article.&lt;br /&gt;
&lt;br /&gt;
== La mémoire qui flanche ? ==&lt;br /&gt;
&lt;br /&gt;
Une cause « classique » des dysfonctionnements se situe au niveau de la gestion de la mémoire de votre machine. Je ne parle pas d&#039;allocation mémoire réalisée par votre système d&#039;exploitation favori mais bien de la manière avec laquelle la carte mère configure et utilise vos barrettes de mémoire. Les applications chargent en mémoire des données et des instructions destinées au processeur. Voici un scénario qui peut provoquer l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Votre application favorite est lancée depuis la ligne de commande ou une interface graphique via un « clic » de souris. Votre système d&#039;exploitation va donc charger ce programme en mémoire puis en exécuter les instructions. Au plus bas niveau de votre système, le processeur exécute des instructions en langage machine (assembleur) présente en mémoire.&lt;br /&gt;
Malheureusement, votre mémoire est défaillante et elle n&#039;arrive pas à maintenir un état stable des informations qui lui sont confiées. Par exemple, la lettre C est représentée par le code 67, ou « 1000011 » en binaire. Si la zone mémoire change d&#039;état, alors le contenu de la valeur stocké à cet endroit changera : on pourrait se retrouver avec « 1000010 ». Un seul bit a changé, mais on passe de la lettre &#039;C&#039; (67) à la lettre &#039;B&#039;(66). Le résultat ne se fait pas attendre, le processeur se retrouve à exécuter des instructions qui n&#039;ont plus de sens, provoquant l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Les pannes de mémoires sont généralement dues à des composants endommagés, des barrettes incompatibles ou un  « timing d&#039;accès » à la mémoire (nommé CAS (Column Address Strobe) dans la plupart des BIOS) trop agressif permettant des lectures dans des zones mémoires avant que les écritures aient eu le temps de se stabiliser pour en garantir le contenu.&lt;br /&gt;
&lt;br /&gt;
Il est assez simple de valider votre configuration mémoire grâce à l&#039;utilitaire memtest (http://www.memtest.org). Cet utilitaire de taille très modeste, 96 Kilo-octets, est écrit en assembleur ce qui lui permet de s&#039;exécuter indépendamment du système d&#039;exploitation. Ceci garantit un test « proche » du matériel, sans sur-couche pouvant apporter d&#039;autres problèmes. &lt;br /&gt;
La version 1.65 actuelle est téléchargeable sous deux formes : une iso que l&#039;on peut graver sur un CDRW de préférence vu la petite taille du programme ou sous la forme d&#039;une amorce système (pre-compiled bootable binary). Il suffira de décompresser l&#039;archive puis d&#039;exécuter la commande suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;dd if=memtest.bin of=/dev/fda&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Ceci écrasera le contenu de votre disquette pour y  copier memtest. &lt;br /&gt;
Rebootez l&#039;ordinateur avec la disquette placée dans le lecteur, memtest devrait se lancer. &lt;br /&gt;
&lt;br /&gt;
[[Image:memtest.jpg]]&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus, est une capture d&#039;écran de memtest en fonctionnement. Le barre de progression principale affichée en haut à droite de l&#039;écran (2% dans cet exemple) permet de suivre la progression du test. Les erreurs apparaissent dans la partie inférieure de l&#039;écran. Il suffit de laisser fonctionner memtest au moins une fois jusqu&#039;à 100%. Si aucune ligne ne s&#039;est affichée alors vou pouvez considérer que la mémoire est fonctionnelle. Dans le cas contraire,  il faudra soit procéder à son remplacement s&#039;il s&#039;agit d&#039;une seule barrette mémoire, soit tester les barrettes indépendamment (l&#039;une puis l&#039;autre) avec ce logiciel. Dans le cas de 2 ou 3 barrettes qui ne fonctionnement pas correctement ensemble mais qui fonctionnement correctement individuellement, il faudra vérifier qu&#039;elles sont bien de même modèle/marque et remettre le Bios dans une configuration initiale.&lt;br /&gt;
&lt;br /&gt;
Votre mémoire est bonne ? Testons les autres composants de votre machine pour traquer la source de ce plantage.&lt;br /&gt;
&lt;br /&gt;
== Il ne fait pas un peu chaud là ? ==&lt;br /&gt;
&lt;br /&gt;
Ces dix dernières années la puissance consommée et dissipée par nos ordinateurs a littéralement explosé ! Du 486 qui ne nécessitait quasiment pas de ventilateur, on est arrivé à des stations de travail/jeu avec des alimentations pouvant atteindre 1KiloWatt pour les dernières et 500watt pour des modèles plus « grand public ». Le processeur est un des composants gourmands de la machine. Certains modèles peuvent consommer plus de 130W ! Autant dire que si le système est mal ventilé, la montée en charge du processeur peut provoquer un échauffement important provoquant une surchauffe de celui-ci. S&#039;il dépasse ces caractéristiques de fonctionnement, il va alors exécuter du code incorrect provocant  un plantage du système.&lt;br /&gt;
&lt;br /&gt;
Un bon test pour vérifier que votre processeur n&#039;est pas la cause de votre instabilité : commencez par relever la température de votre machine au repos à l&#039;aide des informations fournies soit par l&#039;acpi soit pas lm_sensors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[erwan@R1 ~]$ cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             42 C&lt;br /&gt;
[erwan@R1 ~]$ &lt;br /&gt;
&lt;br /&gt;
[root@konilope ~]# sensors | grep Temp&lt;br /&gt;
M/B Temp:    +39°C  (low  =   +15°C, high =   +40°C)   sensor = thermistor   &lt;br /&gt;
CPU Temp:   +127°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
Temp3:       +44°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
[root@konilope ~]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode utilisant lm_sensors nécessite une interprétation de la part de l&#039;utilisateur. Dans cet exemple, il apparaît évidant que le processeur ne peut avoir une température de fonctionnement aussi élevée (127°C). L&#039;erreur est du à un mauvais calcul de la part de lm_sensors. Il se base sur le type de capteurs thermiques utilisé par la carte mère pour calculer la température des différents composants. Malheureusement, le montage électrique autour du capteur de température peut varier d&#039;un modèle de carte à un autre, ce qui fausse les calculs. On considéra donc, que pour cette machine (konilope) sa température se situe aux alentours de 42° : valeur moyenne entre les deux valeurs « cohérentes » relevées par lm_sensors. On pourra cependant vérifier cette approximation en relevant la température du disque sur à l&#039;aide de smartmontools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# smartctl -A /dev/hda | grep Temperature&lt;br /&gt;
194 Temperature_Celsius     0x0022   042   052   000    Old_age   Always       -       42&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, il est préférable de maintenir sa machine en dessous des 55° et celle de son processeur en dessous de 70°C. Au delà, le système risque d&#039;être instable. Si ce n&#039;est pas le cas, effectuez les modification nécessaire pour y parvenir : meilleure ventilation du processeur ou du boîtier par exemple.&lt;br /&gt;
&lt;br /&gt;
Ensuite, téléchargez l&#039;utilitaire cpuburn depuis un mirroir  (http://pages.sbcglobal.net/redelm/cpuburn_1_4_tar.gz)  ou depuis votre distribution linux favorite (oui, oui, urpmi cpuburn ça fonctionne ;o)).&lt;br /&gt;
&lt;br /&gt;
Vous y trouverez plusieurs programmes nommés burnXX ou XX représente votre processeur. La version P6 sera à utiliser sur les processeurs Intel Pentium 4, la version K7 pour les processeurs Athlon x86. Pour les processeurs plus récents, utilisez la version P6.&lt;br /&gt;
Ce logiciel réalise des boucles en langage assembleur ayant pour but de stresser votre processeur de manière importante et donc le faire chauffer. Lancez cpuburn autant de fois que vous avez de processeur sur votre machine puis observez la température de votre machine. Si lors de la montée en température votre système se fige, alors vous avez un problème de thermie. Si cpuburn ne fait pas planter votre ordinateur au bout de 10mn, vous pouvez considérez que votre système est stable de ce coté là. Vous pouvez aussi utiliser ce test pour vérifier que vos ventilateurs d&#039;ordinateurs portable se déclenchent bien en cas de surchauffe.&lt;br /&gt;
Sur un portable récent, on obtient le résultat suivant au bout de quelques minutes de cpuburn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             80 C&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Malgré la température très élevée du processeur, le système est resté stable ce qui permet de valider qu&#039;il est capable d&#039;encaisser une montée en température élevée. Bien entendu, plus votre machine sera « chaude » plus elle s&#039;usera rapidement. Il ne faut pas oublier que les autres composants peuvent souffrir de la chaleur dégagée par le processeur par exemple : les disques durs en sont un bon exemple car les plateaux ne supportent pas la chaleur.&lt;br /&gt;
Ce test est bon aussi ? A priori, les composants de base de votre système sont en bon état, vous pouvez commencer à regarder du coté configuration logicielle.&lt;br /&gt;
&lt;br /&gt;
== APIC es tu là ? ==&lt;br /&gt;
&lt;br /&gt;
Le manque de stabilité peut aussi s&#039;expliquer par la gestion des interruptions. &lt;br /&gt;
L&#039;architecture PIC (Programmable Interrupt Controllers)  représentée par la famille de composants Intel 8259, permettait une gestion de 8 interruptions pour un unique processeur. On les associe par 2 pour obtenir les 16 niveaux d&#039;interruptions nécessaire depuis nos vieux 80286 (milieu des années 80). Avec l&#039;arrivée des systèmes multi-processeurs, l&#039;architecture APIC (Advanced Programmable Interrupt Controllers) (Intel 82093) à été ajoutée pour permettre une gestion plus fine des interruptions. En effet, dans un contexte multi-processeurs, il est nécessaire de pouvoir choisir quel processeur traitera quelle interruption pour ne pas rester figé dans l&#039;ancien modèle (PIC) où le processeur de  « boot » est assigné à un ensemble d&#039;interruptions. &lt;br /&gt;
&lt;br /&gt;
De plus, l&#039;architecture APIC apporte une gestion de 24 interruptions, une gestion de priorité des interruptions et le routage de l&#039;interruption sur le bon processeur, contre un simple routage de 2*8 interruptions dans le modèle PIC sur un seul processeur. Depuis une dizaine d&#039;années, Intel propose le modèle APIC comme nouvelle architecture, y compris pour les systèmes mono-processeurs. Les ordinateurs récents, y compris les portables, sont maintenant équipés uniquement de composants APIC même si l&#039;on peut obtenir un comportement de type PIC avec ceux-ci.&lt;br /&gt;
&lt;br /&gt;
L&#039;architecture APIC est constituée d&#039;un ou plusieurs composants situé physiquement dans le southbridge (IO-APIC), généralement un par bus, et un composant situé dans le processeur : le Local APIC (LAPIC). Le LAPIC va permettre la gestion des interruptions au niveau du processeur local. Il permet aussi de générer des interruptions par exemple pour transmettre des interruptions à des processeurs voisins dans le contexte d&#039;un système multi-processeurs, ces messages sont appelés IPI (Inter Processor Interrupts). &lt;br /&gt;
&lt;br /&gt;
De plus le Local APIC (LAPIC) inclut un « timer » de précision cadencé à la fréquence du bus, généralement il peut être utilisé par l&#039;ordonnanceur de votre système d&#039;exploitation favori ou d&#039;autres outils de haut niveau (profiler kernel : oprofile, vtune). Les LAPIC et l&#039;IO-APIC sont reliés par un bus spécifique pour permettre un échange rapide des informations. &lt;br /&gt;
Schema logique d&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les IO-APIC vont donc se charger de collecter les interruptions provenant des périphériques systèmes et d&#039;en assurer le transfert vers le ou les processeur(s) suivant une route préalablement programmée par le BIOS et/ou le système d&#039;exploitation.&lt;br /&gt;
&lt;br /&gt;
Cependant, l&#039;implémentation des APIC dans les BIOS peut provoquer certaines instabilités sur votre système Linux. Par expérience, il n&#039;y a pas de règle pour trouver la configuration qui peut aider votre machine à se stabiliser car cela dépend de chaque machine. Des différences peuvent même exister entre  deux versions de BIOS d&#039;un même ordinateur. Cependant, dans la série 2.6 du noyau Linux et les version 2.4 récentes nous disposons d&#039;outils permettant de re-paramétrer cette configuration en activant/désactivant les IO-APIC ou les LAPIC.&lt;br /&gt;
&lt;br /&gt;
Chaque composant possède un activateur ou un inhibiteur, on aura donc d&#039;un coté « apic » et « noapic » pour la gestion des IO-APIC, « nolapic » et « lapic » de l&#039;autre pour la gestion des LAPIC. Ces 4 options sont à utiliser sur la ligne de commande du noyau, c&#039;est à dire au moment où le « bootloader » (lilo ou grub par exemple) va charger le noyau en mémoire. L&#039;utilisation de « apic » et « lapic » permet d&#039;activer ces composants qui ne l&#039;ont pas été par le BIOS. L&#039;activateur « apic » n&#039;est disponible que les architectures de type x86_64 car celui-ci est déjà activé sur les systèmes de type x86. On désactivera les APIC dans le cas où le système affiche des messages d&#039;erreurs sur les APIC comme : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;« APIC error on CPU0: 40(40) »&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ou&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;MP-BIOS bug: 8254 timer not connected to IO-APIC&lt;br /&gt;
failed.&lt;br /&gt;
timer doesn&#039;t work through the IO-APIC - disabling NMI Watchdog!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La désactivation des IO-APIC permet par exemple de corriger le comportement parfois récalcitrant de certaines cartes vidéos qui ne parviennent pas à afficher correctement en mode 2D/3D (écran noir par exemple).&lt;br /&gt;
&lt;br /&gt;
La non activation des LAPIC peut avoir comme conséquence un dysfonctionnement de l&#039;ACPI (gestion d&#039;énergie avancée). Ce cas est traité par le noyau, vous retrouverez dans les messages de démarrage la ligne suivante : « &amp;quot;Local APIC disabled by BIOS you can enable it with lapic ».&lt;br /&gt;
&lt;br /&gt;
Pour résumer, si votre machine, en général à architecture mono-processeur, a tendance à se bloquer lors de l&#039;utilisation de périphériques tels que le port usb, la carte graphique ou la carte son, essayez de désactiver le LAPIC puis l&#039; IO-APIC puis les 2.  Pour exemple, les cartes mère A7N8X de chez Asus ont largement tendance à se bloquer si l&#039;on ne spécifie pas « nolapic » lors du boot. Sur certaines machines, il faudra faire le contraire à savoir forcer l&#039;activation des LAPIC. Ceci dépendra de votre machine et de sa conception.&lt;br /&gt;
&lt;br /&gt;
== A vos marques, rebootez ! ==&lt;br /&gt;
&lt;br /&gt;
Certains machines peuvent présenter quelques soucis pour redémarrer. Encore une fois, on retrouve au coeur de ce problème l&#039;interaction entre le noyau et le matériel notamment l&#039;ACPI. Les ordinateurs portables dont le modèle HP nc6120 ont par exemple le bon goût de rester bloqués sur le message « No reboot fixup found for your hardware ». Ceci indique que le noyau ne connaît pas de contournement pour ce matériel (ce qui est le cas de la quasi totalité des ordinateurs) mais puisque vous voyez ce message c&#039;est que votre machine n&#039;a pas réussi à rebooter. Heureusement, il existe des contournements pour permettre un redémarrage plus « bas niveau ». Le noyau défini les modes suivants : « b » « c » « h » « s » et « w ».&lt;br /&gt;
Le mode de reboot peut être défini sur la ligne de commande du noyau suivant la forme « reboot=&amp;lt;mode&amp;gt; ». Le mode « s » est réservé au systèmes multi-processeurs, elle va réinitialiser chacun des processeurs.&lt;br /&gt;
&lt;br /&gt;
Le mode « b » permet quant à lui de rebooter en faisant un appel direct au bios qui se chargera de faire redémarrer la machine. Ce mode fonctionne plutôt bien car dans le cas d&#039;un BIOS posant problème sur l&#039;ACPI, on peut espérer avoir un reboot correct. C&#039;est le cas sur de notre portable cité précédement.&lt;br /&gt;
&lt;br /&gt;
Le mode « h » se chargera de faire redémarrer la machine en réinitialisant le processeur. C&#039;est l&#039;équivalent du mode « s » pour les environnements mono-processeurs.  Pour finir, les modes « c » et « w » correspondent aux modes « cold » et « warn » : ces modes sont plus connus sous le nom de « reboot à froid »  et « reboot à chaud ». Le premier effectuera les tests de mémoire tandis que le second exécutera un reboot plus court.&lt;br /&gt;
&lt;br /&gt;
De manière générale, on utilisera plutôt le mode « b » ou « h » pour les systèmes mono-processeurs récalcitrant et le mode « s » pour les systèmes multi-processeurs.&lt;br /&gt;
&lt;br /&gt;
== Toujours plus de performance ==&lt;br /&gt;
Votre configuration est bien stable depuis un certain temps. Toutefois vous trouvez qu&#039;elle est un peu lente, elle ne vous donne pas satisfaction par rapport à ce qu&#039;elle devrait fournir.&lt;br /&gt;
Cette partie de l&#039;article va explorer comment vérifier et corriger les problèmes de performance des différents composants.&lt;br /&gt;
Note: certaines configuration mono-processeur nécessitent de désactiver LAPIC (nolapic)&lt;br /&gt;
&lt;br /&gt;
=== Le disque dur ===&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le disque dur semble un peu lent et pénalise le système dans son ensemble. Hdparm est là pour vous aider à y voir plus clair. Hdparm est à l&#039;origine conçu pour les systèmes de disques IDE de type PATA. Le nouveau système de disque SATA, ne permet pas toujours en fonction de l&#039;implémentation, l&#039;appel à toutes ces astuces. Cependant les nouvelles séries de kernel à partir du 2.6.15 devrait permettre une gestion plus unifiée des systèmes de disques PATA et SATA.&lt;br /&gt;
&lt;br /&gt;
Le test « hdparm -t /dev/&amp;lt;mon_device&amp;gt; » permet de tester la vitesse de lecture depuis le disque dur jusqu&#039;en mémoire. Une valeur de 25Mo/sec est un minimum pour des machines récentes. Plusieurs paramètres peuvent influencer les performances d&#039;un disque IDE. &lt;br /&gt;
La commande « hdparm -cd » permet de vérifier que les entrées/sorties sont réalisées en 16-bit (le mode 32-bit n&#039;offre pas de performance supplémentaire) alors que le DMA (Direct Memory Access) est activé. Ceci permet la minimisation de l&#039;utilisation du processeur pendant les accès au disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -cd /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
 IO_support   =  0 (default 16-bit)&lt;br /&gt;
 using_dma    =  1 (on)&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande « hdparm -c0d1 /dev/&amp;lt;mon_device&amp;gt; » permet de configurer le périphérique dans ce mode. Le noyau de votre distribution Linux devrait le réaliser de manière automatique.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -I » permet d&#039;obtenir plus d&#039;informations sur la configuration de votre disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -I /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
ATA device, with non-removable media&lt;br /&gt;
	Model Number:       FUJITSU MHT2040AT                       &lt;br /&gt;
	Serial Number:      NN77T3C13KB9&lt;br /&gt;
	Firmware Revision:  0022    &lt;br /&gt;
Standards:&lt;br /&gt;
	Used: ATA/ATAPI-6 T13 1410D revision 3a &lt;br /&gt;
	Supported: 6 5 4 3 &lt;br /&gt;
Configuration:&lt;br /&gt;
	Logical		max	current&lt;br /&gt;
	cylinders	16383	16383&lt;br /&gt;
	heads		16	16&lt;br /&gt;
	sectors/track	63	63&lt;br /&gt;
	--&lt;br /&gt;
	CHS current addressable sectors:   16514064&lt;br /&gt;
	LBA    user addressable sectors:   78140160&lt;br /&gt;
	device size with M = 1024*1024:       38154 MBytes&lt;br /&gt;
	device size with M = 1000*1000:       40007 MBytes (40 GB)&lt;br /&gt;
Capabilities:&lt;br /&gt;
	LBA, IORDY(cannot be disabled)&lt;br /&gt;
	bytes avail on r/w long: 4	Queue depth: 1&lt;br /&gt;
	Standby timer values: spec&#039;d by Standard, no device specific minimum&lt;br /&gt;
	R/W multiple sector transfer: Max = 16	Current = 16&lt;br /&gt;
	Advanced power management level: 128 (0x80)&lt;br /&gt;
	Recommended acoustic management value: 254, current value: 254&lt;br /&gt;
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 &lt;br /&gt;
	     Cycle time: min=120ns recommended=120ns&lt;br /&gt;
	PIO: pio0 pio1 pio2 pio3 pio4 &lt;br /&gt;
	     Cycle time: no flow control=240ns  IORDY flow control=120ns&lt;br /&gt;
Commands/features:&lt;br /&gt;
	Enabled	Supported:&lt;br /&gt;
	   *	READ BUFFER cmd&lt;br /&gt;
	   *	WRITE BUFFER cmd&lt;br /&gt;
	   *	Host Protected Area feature set&lt;br /&gt;
	   *	Look-ahead&lt;br /&gt;
	   *	Write cache&lt;br /&gt;
	   *	Power Management feature set&lt;br /&gt;
		Security Mode feature set&lt;br /&gt;
	   *	SMART feature set&lt;br /&gt;
	   *	Mandatory FLUSH CACHE command &lt;br /&gt;
	   *	Device Configuration Overlay feature set &lt;br /&gt;
	   *	Automatic Acoustic Management feature set &lt;br /&gt;
	   *	SET MAX security extension&lt;br /&gt;
		Power-Up In Standby feature set&lt;br /&gt;
	   *	Advanced Power Management feature set&lt;br /&gt;
	   *	DOWNLOAD MICROCODE cmd&lt;br /&gt;
	   *	SMART self-test &lt;br /&gt;
	   *	SMART error logging &lt;br /&gt;
Security: &lt;br /&gt;
		supported&lt;br /&gt;
	not	enabled&lt;br /&gt;
	not	locked&lt;br /&gt;
		frozen&lt;br /&gt;
	not	expired: security count&lt;br /&gt;
	not	supported: enhanced erase&lt;br /&gt;
	40min for SECURITY ERASE UNIT. &lt;br /&gt;
HW reset results:&lt;br /&gt;
	CBLID- above Vih&lt;br /&gt;
	Device num = 0 determined by the jumper&lt;br /&gt;
Checksum: correct&lt;br /&gt;
[root@R1 ~]#&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On y retrouve le modèle, le numéro de série et la version du firmware qui peuvent être utiles en cas de contact avec le Service Après-Vente ou de mise à jour pour une série de firmwares défaillante.&lt;br /&gt;
&lt;br /&gt;
La ligne commençant par « DMA » dans la partie « Capabilities » permet d&#039;afficher la vitesse de transfert négociée entre le disque dur et le driver IDE de Linux. L&#039;étoile précède la valeur actuelle. Dans cet exemple, le mode udma5 est sélectionné : ceci est conforme aux machines disponibles sur le marché depuis environ 3 ans.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, voici le tableau de conversion entre le mode DMA et la vitesse maximale associée.&lt;br /&gt;
&lt;br /&gt;
Type de fonctionnement&lt;br /&gt;
Vitesse Maximale en MO/sec&lt;br /&gt;
UltraDMA 0&lt;br /&gt;
16,6&lt;br /&gt;
UltraDMA 1&lt;br /&gt;
25&lt;br /&gt;
UltraDMA 2&lt;br /&gt;
33,3&lt;br /&gt;
UltraDMA 3&lt;br /&gt;
44,4&lt;br /&gt;
UltraDMA 4&lt;br /&gt;
66,6&lt;br /&gt;
UltraDMA 5&lt;br /&gt;
100&lt;br /&gt;
UltraDMA 6&lt;br /&gt;
133,33&lt;br /&gt;
&lt;br /&gt;
Une configuration actuelle ne devrait pas être en dessous de UDMA5. Si ce n&#039;était pas le cas, on peut essayer de renégocier la vitesse de transfert à l&#039;aide de la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hdparm -X udma5 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celle-ci permet de forcer le mode UltraDMA5. Il faut utiliser cette commande avec précaution car elle pourrait générer des pertes ou de la corruption de données en cas de transfert pendant ce changement de mode.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi impacter les performances de votre disque dur en modifiant sa vitesse de rotation. Cette fonctionnalité connue sous le nom de Automatic Acoustic Management (AAM) est utilisable avec l&#039;option « -M » de hdparm. La valeur 128 représentera la vitesse la plus faible avec un disque silencieux, la valeur 254 la vitesse la plus élevée mais avec comme contre-partie un disque plus bruyant. On pourra noter des différences de quelques Mo/sec selon les configurations.&lt;br /&gt;
&lt;br /&gt;
Il est aussi à noter que l&#039;utilisation de logiciels permettant une meilleure gestion d&#039;énergie (cpufreq, laptop-mode) peut dégrader les performances d&#039;un disque dur de manière notable.&lt;br /&gt;
&lt;br /&gt;
=== Configuration bas niveau du réseau ===&lt;br /&gt;
&lt;br /&gt;
Le réseau local filaire peut parfois être un peu lent. Voici quelques tests pour vérifier si la lenteur provient du logiciel, du noyau ou du matériel. Tout d&#039;abord, explorons la trousse à outils indispensable pour analyser votre carte réseau : ethtool. Digne successeur de mii-tool, il permet de s&#039;informer sur la configuration de votre carte réseau. &lt;br /&gt;
&lt;br /&gt;
Il suffit de lancer « ethtool &amp;lt;votre_interface&amp;gt; » » pour obtenir la configuration matérielle de votre carte. On y retrouve les modes supportés par votre carte (Supported Link Modes ainsi que la vitesse actuelle (Speed), obtenue par auto-négociation dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
On peut également savoir si le câble réseau est connecté à la carte grâce à la ligne « Link Detected ». Le type de « duplex » utilisé permet également de savoir si la négociation avec l&#039; élément actif au bout de votre câble (commutateur, concentrateur ou une autre machine) a correctement fonctionné. Le duplex définit le mode de  transmission : le mode half-duplex indique que l&#039;on émet puis on reçoit des données, le mode full-duplex indique que l&#039;on peut émettre et recevoir en même temps des données. Le mode full-duplex est donc plus que recommandé pour vos équipements réseaux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# ethtool  eth1&lt;br /&gt;
Settings for eth1:&lt;br /&gt;
	Supported ports: [ TP MII ]&lt;br /&gt;
	Supported link modes:   10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Supports auto-negotiation: Yes&lt;br /&gt;
	Advertised link modes:  10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Advertised auto-negotiation: Yes&lt;br /&gt;
	Speed: 100Mb/s&lt;br /&gt;
	Duplex: Full&lt;br /&gt;
	Port: MII&lt;br /&gt;
	PHYAD: 1&lt;br /&gt;
	Transceiver: internal&lt;br /&gt;
	Auto-negotiation: on&lt;br /&gt;
	Current message level: 0x000020c1 (8385)&lt;br /&gt;
	Link detected: yes&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesurer les {contre}performances de votre réseau ===&lt;br /&gt;
&lt;br /&gt;
Une fois vérifiée la bonne configuration de votre matériel, nous pouvons passer à la vérification des performances entre deux machines.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire netpipe (http://www.scl.ameslab.gov/netpipe/) permet de réaliser des tests de performance mais aussi d&#039;intégrité entre deux machines. Il permet de tester les performances du réseau au travers la couche IP et non pas depuis un mode plus bas niveau comme pourrait l&#039;être un test utilisant directement le driver Ethernet. Ce test permet donc de valider que la configuration matérielle mais aussi logicielle est correcte.&lt;br /&gt;
&lt;br /&gt;
Sur la première machine, exécutez « NPtcp » : netpipe se positionne en mode « serveur ».&lt;br /&gt;
Sur la seconde machine, exécutez « NPtcp -h &amp;lt;machine1&amp;gt; » : netpipe se connecte au serveur netpipe de la machine nommée machine1 pour effectuer le test de performance.&lt;br /&gt;
&lt;br /&gt;
Le test par défaut teste les communication allant de 1 octet jusqu&#039;à 8 Mo. Il peut prendre plusieurs minutes si le réseau est « lent ». Le test va montrer pour chaque taille de paquet la performance obtenue. Il est normal d&#039;obtenir des performances faibles pour des paquets d&#039;une taille inférieure à 8 Ko. Transporter des petits paquets nécessite de réaliser beaucoup d&#039;opérations pour le processeur pour une quantité d&#039;information minime. Les performances seront meilleures à partir d&#039;environ 16 Ko et maximales à partir de 128 Ko. Sur un système utilisant du gigabit ethernet, on constatera une performance de 39Mbps à 256 octets, 287Mbps à 4Ko, 614Mbps à 16Ko, 845Mbps à 128Ko, 895Mbps à 8Mo.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ainsi vérifier et comparer facilement les performances de votre configuration réseau. Netpipe permet également de tester la vitesse du réseau pour une taille de paquets définie entre la taille indiqué par l&#039;option « -l » et la taille indiquée par l&#039;option « -u ». Ainsi, NPtcp -l 16384 -u 16384 permet de tester la bande passante réseau pour une taille de paquet égale à 16Ko.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -n &amp;lt;nb-cycle&amp;gt; » permet de définir le nombre de boucles à réaliser pour le test (50 par défaut). Enfin, pour réaliser des tests « full-duplex », on utilisera l&#039;option « -2 ». Ce test permet de s&#039;assurer du bon fonctionnement du mode de communication permettant l&#039;écriture et la lecture simultanées.&lt;br /&gt;
&lt;br /&gt;
Attention, même si ce test donne de bons résultats, cela ne veut pas dire que la configuration est exempte d&#039;erreur de configuration. Par exemple, les performances réseaux peuvent être très bonnes en point à point mais mauvaises lorsque l&#039;on aura une charge réseau avec plusieurs clients. Dans cette situation, il faut vérifier que le contrôle de flux est bien activé sur toutes les machines. L&#039;option « ethtool -a » permet de vérifier que les champs « rx » et « tx » sont placés sur « on ». Si ce n&#039;était pas le cas activez-les avec la commande « ethtool -A eth0 rx on » et « ethtool -A eth0 tx on ».&lt;br /&gt;
&lt;br /&gt;
Les cartes réseaux, des serveurs essentiellement, permettent maintenant de réaliser le « tcp segment offload ». Cette technique permet de décharger une partie du traitement TCP directement dans l&#039;électronique de la carte réseau. Ceci à pour effet de décharger le processeur central d&#039;un traitement fastidieux. L&#039;option « -k » d&#039;ethtool permet de consulter l&#039;état de cette fonctionnalité (off/on). On pourra l&#039;activer sur des serveurs générant un gros trafic réseau par exemple : « ethtool -K eth0 tso on ».&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant équipé de nouveau outils pour traquer la perte de performances de votre installation réseau. Ceci couplé aux habituels tcpdump/ethereal, voilà une belle panoplie du zorro du réseau.&lt;br /&gt;
&lt;br /&gt;
=== Quand la latence s&#039;en mêle ===&lt;br /&gt;
&lt;br /&gt;
La latence représente le temps nécessaire à un système pour prendre en compte un événement.&lt;br /&gt;
&lt;br /&gt;
Il arrive que certains périphériques de votre machine nécessitant des débits importants ou une latence assez faible sur le bus PCI soient « poussifs ». On retrouve dans cette catégorie les cartes vidéos accélératrice 3D, les cartes son et les cartes d&#039;acquisition firewire ou DVB (récepteur de télévision numérique terrestre : TNT).&lt;br /&gt;
&lt;br /&gt;
Un périphérique branché sur le bus PCI doit attendre que le bus soit libre pour émettre les données vers la mémoire centrale. Le bus PCI qui est le coeur de communication des périphériques est donc soumis en permanence à un arbitrage qui permet de décider qui doit émettre des données et qui doit attendre. Cet arbitrage est en partie réalisé grâce au « latency_timer ».&lt;br /&gt;
&lt;br /&gt;
Chaque périphérique possède une valeur de « latency_timer » comprise en 0 et 248 cycles d&#039;horloge du bus. Plus la valeur sera importante plus le périphérique disposera de temps pour transmettre des informations. Une latence de 248 cycles permet d&#039;obtenir une priorité forte sur le bus, ce qui permet un débit important. A contrario, une latence de 0 indiquera au périphérique qu&#039;il doit cesser ses transmissions si un autre composant à besoin du bus : ceci se traduira par une perte de bande passante importante.&lt;br /&gt;
&lt;br /&gt;
La configuration réalisée par défaut sur votre machine doit être correcte mais il peut arriver qu&#039;une carte 3D ou DVB soit configurée avec une latence trop faible, ce qui  aurait pour conséquence d&#039;offrir une image saccadée et peu fluide. Une carte son offrirait également le même type de symptômes avec un son hâché ou excessivement métallique.&lt;br /&gt;
&lt;br /&gt;
Heureusement, une série d&#039;outils est là pour vous aider à diagnostiquer le problème mais aussi à le résoudre. Le projet pciutils  (http://atrey.karlin.mff.cuni.cz/~mj/linux.shtml#pciutils) contient deux outils indispensables: lspci et setpci. Bien entendu, votre distribution favorite devrait posséder ce logiciel, il vous suffira de l&#039;installer avec  votre gestionnaire de paquet favori (urpmi, apt, smart).&lt;br /&gt;
&lt;br /&gt;
La commande « lspci » vous permet de lister les périphériques PCI disponibles sur votre ordinateur (cf article paru dans le numéro 68).  Cet exemple se basera sur une carte vidéo  ayant pour adresse sur le bus PCI « 01:00.0 ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@lagirafe] lspci -v -s 01:00.0&lt;br /&gt;
01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go5200 32M/64M] (rev a1) (prog-if 00 [VGA])&lt;br /&gt;
	Subsystem: Samsung Electronics Co Ltd: Unknown device c00f&lt;br /&gt;
	Flags: bus master, 66Mhz, medium devsel, latency 16, IRQ 11&lt;br /&gt;
	Memory at c8000000 (32-bit, non-prefetchable) [size=16M]&lt;br /&gt;
	Memory at d8000000 (32-bit, prefetchable) [size=128M]&lt;br /&gt;
	Expansion ROM at &amp;lt;unassigned&amp;gt; [disabled] [size=128K]&lt;br /&gt;
	Capabilities: [60] Power Management version 2&lt;br /&gt;
	Capabilities: [44] AGP version 3.0&lt;br /&gt;
[root@lagirafe]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On retiendra dans cette ligne, la valeur &#039;latency 16&#039;. Ceci risque de poser problème lorsque celle-ci aura besoin d&#039;un fort débit pendant un jeu par exemple. Augmenter la latence va donc se révéler nécessaire pour ce périphérique.&lt;br /&gt;
&lt;br /&gt;
La commande setpci permet de modifier les paramètres PCI d&#039;un périphérique ou d&#039;un bus complet avec tous ses périphériques. &lt;br /&gt;
&lt;br /&gt;
La commande « setpci -v -d 01:* latency_timer=20 » permet de positionner tous les périphériques  du bus 01 à une valeur de 32 cycles. Il est à noter que la commande setpci utilise des valeurs en hexadécimal mais lspci affichera les valeurs en décimal.&lt;br /&gt;
&lt;br /&gt;
Pour en revenir à nos moutons, la correction de la latence de cette carte graphique se fera avec la commande «  setpci -v -d 01:00.0 latency_timer=f8 ». Ceci positionne donc la carte sur la plus grande valeur de latence possible, ce qui lui garantira la plus grande bande passante possible. Il est possible d&#039;utiliser la valeur « ff » comme paramètre pour « latency_timer » mais celui-ci sera converti à la volée par la commande setpci en « 0xf8 ».&lt;br /&gt;
&lt;br /&gt;
Attention, certains composants de votre machine doivent rester en « latency_timer=0 » pour garantir une bon fonctionnement de votre système : il ne faudra donc pas modifier les latences des contrôleurs mémoire et des ponts PCI connectés généralement sur le bus « 0:* ».&lt;br /&gt;
&lt;br /&gt;
== DSDT : le cauchemar continue ! ==&lt;br /&gt;
&lt;br /&gt;
Cette partie de l&#039;article a pour but d&#039;expliquer le problème que peut représenter la table DSDT pour un certain nombre de machines et surtout les ordinateurs portables. &lt;br /&gt;
&lt;br /&gt;
La norme ACPI 3.0 de Septembre 2004 disponible gratuitement à l&#039;adresse http://www.acpi.info/DOWNLOADS/ACPIspec30.pdf définit la DSDT comme une table remplie par un OEM permettant au système d&#039;exploitation de découvrir les ressources pour la gestion de l&#039;énergie avancée, de la gestion thermique ainsi que la gestion du Plug&#039;nPlay des ressources définies par l&#039;ACPI.&lt;br /&gt;
&lt;br /&gt;
Voici une description certes un peu théorique mais nécessaire pour bien comprendre la problématique et ses conséquences. Le constructeur de l&#039;ordinateur doit donc définir dans le BIOS une table contenant une liste de ressources et leurs configuration et ce pour que le système d&#039;exploitation puisse s&#039;en servir. Noble cause n&#039;est il pas ? Tout au long des 618 pages de ce document sont spécifiés les éléments du langage à utiliser ainsi que sa syntaxe. L&#039; « ACPI Source Language » permettra donc aux développeurs d&#039;écrire des DSDT puis de les compiler dans un format nommé « ACPI Machine Language » en utilisant un compilateur adéquat. Le système d&#039;exploitation utilisera la table compilée (AML) pour accéder aux ressources ACPI. &lt;br /&gt;
Sur la plupart des ordinateurs portables, la table DSDT ne respecte pas la norme ACPI dans sa syntaxe. Ceci est très gênant car cela bloque le code de l&#039;interpréteur ACPI du noyau Linux qui essaie de la lire. Le résultat est sans appel, pas d&#039;ACPI, pas de gestion d&#039;énergie avancée, plus de ventilation automatique sur certains modèles d&#039;ordinateurs, plus de touche de gestion de contraste/luminosité sur d&#039;autres etc...&lt;br /&gt;
&lt;br /&gt;
Ceci est très gênant sur un ordinateur portable. Alors que faire ? Dans un premier temps, prévenir le constructeur que son BIOS est incorrect et ne respecte pas la norme ACPI. La réponse se fait toujours attendre pour tous ceux qui « osent » poser la question au support technique : à savoir, les constructeurs ignorent tout simplement les mails de ce type.&lt;br /&gt;
La seconde étape puisque vous êtes devant le fait accompli d&#039;une machine non conforme, il va falloir corriger cette table. Il suffit de récupérer la table actuelle via la commande &#039;cat /proc/acpi/dsdt &amp;gt; dsdt.aml&#039; si vous avez la chance d&#039;avoir un répertoire /proc/acpi malgré une table DSDT endommagée, sinon utilisez la commande &#039;acpidump -b -t dsdt -o dsdt.aml&#039;. La commande acpidump est  fournit dans le projet pmtools (ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools-20050926.tar.bz2) &lt;br /&gt;
Vous avez donc extrait la table DSDT de votre système. Il ne reste plus qu&#039;à essayer de la recompiler. Pour cela, le compilateur IASL de la société Intel (http://developer.intel.com/technology/iapc/acpi/downloads.htm) offre sous Linux et Windows une plate-forme de compilation pour le langage ASL.&lt;br /&gt;
&lt;br /&gt;
Suivez les instructions du site pour télécharger et compiler la version unix d&#039;iasl. Ensuite, décompilez la table avec la commande « iasl -d dsdt.aml ». Le fichier dsdt.dsl vient d&#039;être créé par le décompilateur. Il suffit de le recompiler avec la commande « iasl -tc dsdt.dsl » pour constater les dégâts ! La DSDT que vous avez dans votre BIOS est généralement compilée par le compilateur de Microsoft qui semble autoriser une syntaxe plus qu&#039;approximative.&lt;br /&gt;
Si vous avez de la chance, votre DSDT s&#039;est recompilée sans erreurs, vous obtenez donc un fichier dsdt.hex et un fichier dsdt.aml. Il ne reste plus qu&#039;à injecter cette dsdt dans le noyau Linux et le tour sera joué.&lt;br /&gt;
&lt;br /&gt;
Si vous avez moins de chance, votre DSDT est syntaxiquement incorrecte et génère des erreurs. Les expliquer plus en détails nécessiterait un article complet, il ne sera cité que les plus « habituelles » (sic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2626:                     Field (ECR, DWordAcc, Lock, Preserve) &lt;br /&gt;
Error    1048 -                              ^ Host Operation Region requires ByteAcc access &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette erreur présente à ligne 2626 du fichier dsdt.asl indique une erreur de type dans la déclaration du champ ECR. Il suffit dans ce cas de changer le mot « DWordAcc » par « ByteAcc ». Celle-ci reste assez simple à corriger, on se demande donc pourquoi les constructeurs ne prennent pas le temps de vérifier et de corriger leur BIOS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2672:                     Method (_GLK, 1, NotSerialized) &lt;br /&gt;
Warning  2024 -                                ^ Reserved method has too many arguments ( _GLK requires 0) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode _GLK n&#039;a besoin que de 0 paramètre tandis que ce code en utilise 2 ! La correction est assez simple : il suffit de remplacer la ligne 2672 par « Method(_GLK) ».&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur la correction des erreurs de compilation de votre table dsdt, je vous recommande les tutoriaux disponibles depuis la page http://acpi.sourceforge.net/dsdt/index.php du projet ACPI.&lt;br /&gt;
&lt;br /&gt;
Votre DSDT est compilée avec succès, il ne vous reste plus qu&#039;à l&#039;ajouter pour que votre noyau puisse l&#039;utiliser à la place de celle fourni par le BIOS (modifiable uniquement par le constructeur, via une mise à jour).&lt;br /&gt;
&lt;br /&gt;
Il existe trois possibilités pour inclure une table DSDT : la modification du noyau Linux ( noyau &amp;lt; 2.6.9), l&#039;injection de la DSDT dans la configuration du noyau (noyau &amp;gt;= 2.6.9), l&#039;intégration de la table DSDT dans l&#039;initrd qui nécessite un patch kernel disponible à l&#039;adresse http://gaugusch.at/kernel.shtml.&lt;br /&gt;
&lt;br /&gt;
Pour les noyaux 2.6.9 et supérieur, copiez votre fichier dsdt.hex sous le nom «/usr/src/linux/include/acpi/dsdt_table.h » puis reconfigurez votre noyau.&lt;br /&gt;
Insérer « dsdt_table.h » dans l&#039;option « Include you custom DSDT » disponible dans le menu « Power Management/ACPI/ ». Recompilez votre noyau et redémarrez avec votre nouveau noyau.&lt;br /&gt;
Pour les noyaux inférieurs à 2.6.9, il est possible de modifier le code source de votre noyau pour intégrer votre DSDT mais il est préférable d&#039;utiliser le patch permettant l&#039;insertion de la table DSDT dans l&#039;initrd. Recompilez votre noyau avec ce patch, puis suivez la procédure décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Certaines distributions Linux comme « Mandriva Linux » possèdent le patch qui permet de n&#039;avoir qu&#039;à reconstruire l&#039;initrd avec la commande « mkinitrd –dsdt=/boot/dsdt.aml /boot/initrd-`uname -r`.img `uname -r`  » puis de relancer lilo avant de redémarrer votre machine. Lors du démarrage de celle-ci vous devriez voir le message suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ACPI: Looking for DSDT in initrd... found (at offset 0x4f8d9).&lt;br /&gt;
ACPI-0294: *** Info: Table [DSDT] replaced by host OS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant avec une table DSDT correcte et un ACPI fonctionnel. La question qui reste ouverte est pourquoi les constructeurs n&#039;utilisent pas un compilateur digne de ce nom pour permettre à leur clients de pouvoir utiliser d&#039;autres systèmes d&#039;exploitation que Windows de Microsoft. &lt;br /&gt;
&lt;br /&gt;
Pour la petite histoire, si vous cherchez dans votre dsdt vous risquez de tomber ce genre de lignes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows NT&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft WindowsME: Millennium Edition&amp;quot;), Zero))&lt;br /&gt;
 If (LEqual (SizeOf (\_OS), 0x27)) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque qu&#039;un système d&#039;exploitation souhaite utiliser les ressources ACPI du BIOS, il utilise son nom de système d&#039;exploitation (acpi_os_name). On retrouve donc dans les bios des parties qui ne seront exécutées que pour certains systèmes d&#039;exploitation de Microsoft. On retrouve même certains tests où c&#039;est la longueur du nom qui compte...... Ceci prouve bien que les constructeurs d&#039;ordinateurs savent corriger des tables DSDT pour les systèmes d&#039;exploitation mais pas forcément pour le notre malheureusement. Depuis le noyau 2.6.9, le noyau Linux utilise « Windows NT » comme « acpi_os_name »  pour assurer une meilleure compatibilité matérielle dixit Len Bron d&#039;Intel dans le changelog de cette version.&lt;br /&gt;
&lt;br /&gt;
== Comment trouver le pilote qui va avec votre matériel ? ==&lt;br /&gt;
&lt;br /&gt;
Cette question on se la pose souvent mais uniquement lorsque l&#039;on essaye de brancher un nouveau périphérique sur sa machine. Les distributions récentes permettent de détecter automatiquement votre matériel et de lui associer un pilote avec sa configuration. Ce mécanisme fonctionne plutôt bien mais cela n&#039;évite pas les dysfonctionnements voir l&#039;absence de fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Pour vérifier si votre noyau Linux est capable de supporter un nouveau périphérique PCI par exemple, il suffit d&#039;en récupérer les identifiants PCI (constructeur et produit) puis de les rechercher dans le fichier « /lib/modules/`uname -r`/modules.pcimap » qui est auto-généré lors de la commande depmod.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire « lspcidrake -v » vous permet de trouver les identifiants PCI de votre carte, la commande « lspci » vous permet de trouver le nom de votre périphérique puis faites un « lspci -n » pour en trouver la correspondance numérique. On utilisera la position du périphérique sur le bus pour retrouver la correspondance numérique « 02:05.0 » dans cet exemple.&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome] lspci&lt;br /&gt;
[....]&lt;br /&gt;
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)&lt;br /&gt;
[root@pumphome] lspci -n&lt;br /&gt;
[...]&lt;br /&gt;
02:05.0 Class 0200: 14e4:4401 (rev 01)&lt;br /&gt;
[root@pumphome]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi cette carte réseau possède les identifiants 14e4 (constructeur) et 4401 (produit). Il suffit de rechercher cette valeur dans le modules.pcimap, ce qui nous donnera la correspondance en module (pilote).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome]  grep &amp;quot;0x000014e4 0x00004401&amp;quot; /lib/modules/2.6.12-12mdk-i686-up-4GB/modules.pcimap &lt;br /&gt;
b44               0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
bcm4400      0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit ici que cette carte peut utiliser le driver b44 ou le driver bcm4400. On ne trouve pas toujours les identifiants PCI de produit sous leur forme directe, on peut également trouver « 0Xffffffff » qui indique que tous les cartes du constructeur sont gérées par un module.&lt;br /&gt;
Il ne vous restera plus qu&#039;à effectuer la configuration associée à ce périphérique pour qu&#039;il fonctionne correctement.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
La fin de cet article conclut une toute petite série de deux articles ayant pour but de vulgariser l&#039;architecture de nos machines, de découvrir les outils disponibles pour mieux comprendre leur configuration et au besoin régler les problèmes de configuration matérielle qui ont souvent le don de nous pourrir la vie.&lt;br /&gt;
&lt;br /&gt;
Merci à LaurentJ de #Mandrivafr pour ses tests complémentaires sur les problèmes d&#039;IO-APIC. Un énorme merci à Nicolas Planel pour sa relecture pointue et également Anne pour sa patience de girafe à relire et « quaurigé »mes « photes »,  ainsi qu&#039;à tous ceux qui m&#039;ont aidé à découvrir ce que je restitue dans cet article.&lt;br /&gt;
&lt;br /&gt;
Cet article a été publié dans Linux Magazine France n°78. Il est publié sur Léa avec l&#039;aimable autorisation de l&#039;éditeur.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12777</id>
		<title>Découvrez les ressources de votre machine (La suite)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12777"/>
		<updated>2006-06-11T20:27:40Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* La mémoire qui flanche ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Découvrez les ressources de votre machine (La suite) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A nouvelle année, nouvelles résolutions ! Paru dans le numéro 68, un premier article dédié à la découverte des outils disponibles pour la récupération des configurations de votre machine promettait une suite.  Je vous propose donc de reprendre ce voyage au centre de votre ordinateur. &lt;br /&gt;
&lt;br /&gt;
Cet article sera articulé autour du diagnostic de pannes et des correctifs associés mais aussi de « trucs &amp;amp; astuces » permettant d&#039;optimiser votre configuration.&lt;br /&gt;
&lt;br /&gt;
== Savez-vous planter les choux ? ==&lt;br /&gt;
&lt;br /&gt;
Les choux peut-être pas mais les ordinateurs je pense que c&#039;est arrivé au moins une fois à chaque lecteur qui lit cet article. Rien de plus énervant qu&#039;un écran qui se fige, le pointeur de souris qui ne se déplace plus, le clavier qui ne répond plus non plus.... Planté ! Ce constat est assez facile à établir mais en trouver la cause reste un problème nettement plus complexe tellement le nombre de causes possibles est important.&lt;br /&gt;
&lt;br /&gt;
Deux solutions : ignorer le problème et relancer le système en se disant que ça « passera », ou alors chercher la cause du problème en essayant de trouver une méthode reproduisant le « plantage » tant redouté.&lt;br /&gt;
&lt;br /&gt;
La première solution fonctionne assez bien mais si l&#039;on à faire à un « vrai » problème de configuration matérielle ou logicielle, on arrivera assez vite à ne plus pouvoir éviter la seconde voire la troisième. J&#039;allais oublier cette troisième solution destinée aux plus riches d&#039;entre vous : changer de matériel. Cette solution coûteuse peut parfois se révéler efficace, parfois pas du tout. A quoi bon changer un composant sans savoir si c&#039;était bien celui-ci qui posait problème ?&lt;br /&gt;
Quelque soit la solution retenue, il sera de toute manière nécessaire de localiser la panne pour y apporter la réponse adéquate. Certaines sociétés ou particuliers se sont spécialisés dans ce dépannage ou l&#039;utilisateur est « dépassé » par les événements.&lt;br /&gt;
&lt;br /&gt;
Cet article vous fera, je l&#039;espère, découvrir quelques outils et méthodes pour valider un par un les composants de votre ordinateur. Cela vous permettra j&#039;espère d&#039;être un peu moins dépourvu quand un problème surviendra. L&#039;article reproduira les étapes qu&#039;il faut suivre pour isoler le « fautif ».&lt;br /&gt;
&lt;br /&gt;
== Les causes possibles d&#039;un « plantage » ==&lt;br /&gt;
&lt;br /&gt;
On retrouve deux grandes catégories de pannes provoquant des dysfonctionnements importants sur un système informatique.&lt;br /&gt;
* une panne du matériel&lt;br /&gt;
* une erreur logicielle au niveau du noyau et des pilotes (drivers)&lt;br /&gt;
&lt;br /&gt;
Il faudra donc être capable de séparer la panne matérielle qui « force » l&#039;ordinateur à entrer dans un mode de fonctionnement non prévu et instable, de l&#039;erreur logicielle qui équivaut à demander à l&#039;ordinateur de faire « n&#039;importe quoi » et qui va donc se « planter ».&lt;br /&gt;
&lt;br /&gt;
Le terme « planté » utilisé ici équivaut à un arrêt du système à cause d&#039;erreurs sévères : instruction illégale ou composants défaillants. Le terme de « plantage » est aussi utilisé pour décrire le fonctionnement d&#039;une application qui se ferme inopinément. Ce cas est plus souvent lié à une erreur de programmation de l&#039;application qu&#039;à une erreur du système. Nous ne parlerons donc pas de ce second cas dans cet article.&lt;br /&gt;
&lt;br /&gt;
== La mémoire qui flanche ? ==&lt;br /&gt;
&lt;br /&gt;
Une cause « classique » des dysfonctionnements se situe au niveau de la gestion de la mémoire de votre machine. Je ne parle pas d&#039;allocation mémoire réalisée par votre système d&#039;exploitation favori mais bien de la manière avec laquelle la carte mère configure et utilise vos barrettes de mémoire. Les applications chargent en mémoire des données et des instructions destinées au processeur. Voici un scénario qui peut provoquer l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Votre application favorite est lancée depuis la ligne de commande ou une interface graphique via un « clic » de souris. Votre système d&#039;exploitation va donc charger ce programme en mémoire puis en exécuter les instructions. Au plus bas niveau de votre système, le processeur exécute des instructions en langage machine (assembleur) présente en mémoire.&lt;br /&gt;
Malheureusement, votre mémoire est défaillante et elle n&#039;arrive pas à maintenir un état stable des informations qui lui sont confiées. Par exemple, la lettre C est représentée par le code 67, ou « 1000011 » en binaire. Si la zone mémoire change d&#039;état, alors le contenu de la valeur stocké à cet endroit changera : on pourrait se retrouver avec « 1000010 ». Un seul bit a changé, mais on passe de la lettre &#039;C&#039; (67) à la lettre &#039;B&#039;(66). Le résultat ne se fait pas attendre, le processeur se retrouve à exécuter des instructions qui n&#039;ont plus de sens, provoquant l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Les pannes de mémoires sont généralement dues à des composants endommagés, des barrettes incompatibles ou un  « timing d&#039;accès » à la mémoire (nommé CAS (Column Address Strobe) dans la plupart des BIOS) trop agressif permettant des lectures dans des zones mémoires avant que les écritures aient eu le temps de se stabiliser pour en garantir le contenu.&lt;br /&gt;
&lt;br /&gt;
Il est assez simple de valider votre configuration mémoire grâce à l&#039;utilitaire memtest (http://www.memtest.org). Cet utilitaire de taille très modeste, 96 Kilo-octets, est écrit en assembleur ce qui lui permet de s&#039;exécuter indépendamment du système d&#039;exploitation. Ceci garantit un test « proche » du matériel, sans sur-couche pouvant apporter d&#039;autres problèmes. &lt;br /&gt;
La version 1.65 actuelle est téléchargeable sous deux formes : une iso que l&#039;on peut graver sur un CDRW de préférence vu la petite taille du programme ou sous la forme d&#039;une amorce système (pre-compiled bootable binary). Il suffira de décompresser l&#039;archive puis d&#039;exécuter la commande suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;dd if=memtest.bin of=/dev/fda&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Ceci écrasera le contenu de votre disquette pour y  copier memtest. &lt;br /&gt;
Rebootez l&#039;ordinateur avec la disquette placée dans le lecteur, memtest devrait se lancer. &lt;br /&gt;
&lt;br /&gt;
[[Image:memtest.jpg]]&lt;br /&gt;
&lt;br /&gt;
La figure 1, est une capture d&#039;écran de memtest en fonctionnement. Le barre de progression principale affichée en haut à droite de l&#039;écran (2% dans cet exemple) permet de suivre la progression du test. Les erreurs apparaissent dans la partie inférieure de l&#039;écran. Il suffit de laisser fonctionner memtest au moins une fois jusqu&#039;à 100%. Si aucune ligne ne s&#039;est affichée alors vou pouvez considérer que la mémoire est fonctionnelle. Dans le cas contraire,  il faudra soit procéder à son remplacement s&#039;il s&#039;agit d&#039;une seule barrette mémoire, soit tester les barrettes indépendamment (l&#039;une puis l&#039;autre) avec ce logiciel. Dans le cas de 2 ou 3 barrettes qui ne fonctionnement pas correctement ensemble mais qui fonctionnement correctement individuellement, il faudra vérifier qu&#039;elles sont bien de même modèle/marque et remettre le Bios dans une configuration initiale.&lt;br /&gt;
&lt;br /&gt;
Votre mémoire est bonne ? Testons les autres composants de votre machine pour traquer la source de ce plantage.&lt;br /&gt;
&lt;br /&gt;
== Il ne fait pas un peu chaud là ? ==&lt;br /&gt;
&lt;br /&gt;
Ces dix dernières années la puissance consommée et dissipée par nos ordinateurs a littéralement explosé ! Du 486 qui ne nécessitait quasiment pas de ventilateur, on est arrivé à des stations de travail/jeu avec des alimentations pouvant atteindre 1KiloWatt pour les dernières et 500watt pour des modèles plus « grand public ». Le processeur est un des composants gourmands de la machine. Certains modèles peuvent consommer plus de 130W ! Autant dire que si le système est mal ventilé, la montée en charge du processeur peut provoquer un échauffement important provoquant une surchauffe de celui-ci. S&#039;il dépasse ces caractéristiques de fonctionnement, il va alors exécuter du code incorrect provocant  un plantage du système.&lt;br /&gt;
&lt;br /&gt;
Un bon test pour vérifier que votre processeur n&#039;est pas la cause de votre instabilité : commencez par relever la température de votre machine au repos à l&#039;aide des informations fournies soit par l&#039;acpi soit pas lm_sensors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[erwan@R1 ~]$ cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             42 C&lt;br /&gt;
[erwan@R1 ~]$ &lt;br /&gt;
&lt;br /&gt;
[root@konilope ~]# sensors | grep Temp&lt;br /&gt;
M/B Temp:    +39°C  (low  =   +15°C, high =   +40°C)   sensor = thermistor   &lt;br /&gt;
CPU Temp:   +127°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
Temp3:       +44°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
[root@konilope ~]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode utilisant lm_sensors nécessite une interprétation de la part de l&#039;utilisateur. Dans cet exemple, il apparaît évidant que le processeur ne peut avoir une température de fonctionnement aussi élevée (127°C). L&#039;erreur est du à un mauvais calcul de la part de lm_sensors. Il se base sur le type de capteurs thermiques utilisé par la carte mère pour calculer la température des différents composants. Malheureusement, le montage électrique autour du capteur de température peut varier d&#039;un modèle de carte à un autre, ce qui fausse les calculs. On considéra donc, que pour cette machine (konilope) sa température se situe aux alentours de 42° : valeur moyenne entre les deux valeurs « cohérentes » relevées par lm_sensors. On pourra cependant vérifier cette approximation en relevant la température du disque sur à l&#039;aide de smartmontools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# smartctl -A /dev/hda | grep Temperature&lt;br /&gt;
194 Temperature_Celsius     0x0022   042   052   000    Old_age   Always       -       42&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, il est préférable de maintenir sa machine en dessous des 55° et celle de son processeur en dessous de 70°C. Au delà, le système risque d&#039;être instable. Si ce n&#039;est pas le cas, effectuez les modification nécessaire pour y parvenir : meilleure ventilation du processeur ou du boîtier par exemple.&lt;br /&gt;
&lt;br /&gt;
Ensuite, téléchargez l&#039;utilitaire cpuburn depuis un mirroir  (http://pages.sbcglobal.net/redelm/cpuburn_1_4_tar.gz)  ou depuis votre distribution linux favorite (oui, oui, urpmi cpuburn ça fonctionne ;o)).&lt;br /&gt;
&lt;br /&gt;
Vous y trouverez plusieurs programmes nommés burnXX ou XX représente votre processeur. La version P6 sera à utiliser sur les processeurs Intel Pentium 4, la version K7 pour les processeurs Athlon x86. Pour les processeurs plus récents, utilisez la version P6.&lt;br /&gt;
Ce logiciel réalise des boucles en langage assembleur ayant pour but de stresser votre processeur de manière importante et donc le faire chauffer. Lancez cpuburn autant de fois que vous avez de processeur sur votre machine puis observez la température de votre machine. Si lors de la montée en température votre système se fige, alors vous avez un problème de thermie. Si cpuburn ne fait pas planter votre ordinateur au bout de 10mn, vous pouvez considérez que votre système est stable de ce coté là. Vous pouvez aussi utiliser ce test pour vérifier que vos ventilateurs d&#039;ordinateurs portable se déclenchent bien en cas de surchauffe.&lt;br /&gt;
Sur un portable récent, on obtient le résultat suivant au bout de quelques minutes de cpuburn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             80 C&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Malgré la température très élevée du processeur, le système est resté stable ce qui permet de valider qu&#039;il est capable d&#039;encaisser une montée en température élevée. Bien entendu, plus votre machine sera « chaude » plus elle s&#039;usera rapidement. Il ne faut pas oublier que les autres composants peuvent souffrir de la chaleur dégagée par le processeur par exemple : les disques durs en sont un bon exemple car les plateaux ne supportent pas la chaleur.&lt;br /&gt;
Ce test est bon aussi ? A priori, les composants de base de votre système sont en bon état, vous pouvez commencer à regarder du coté configuration logicielle.&lt;br /&gt;
&lt;br /&gt;
== APIC es tu là ? ==&lt;br /&gt;
&lt;br /&gt;
Le manque de stabilité peut aussi s&#039;expliquer par la gestion des interruptions. &lt;br /&gt;
L&#039;architecture PIC (Programmable Interrupt Controllers)  représentée par la famille de composants Intel 8259, permettait une gestion de 8 interruptions pour un unique processeur. On les associe par 2 pour obtenir les 16 niveaux d&#039;interruptions nécessaire depuis nos vieux 80286 (milieu des années 80). Avec l&#039;arrivée des systèmes multi-processeurs, l&#039;architecture APIC (Advanced Programmable Interrupt Controllers) (Intel 82093) à été ajoutée pour permettre une gestion plus fine des interruptions. En effet, dans un contexte multi-processeurs, il est nécessaire de pouvoir choisir quel processeur traitera quelle interruption pour ne pas rester figé dans l&#039;ancien modèle (PIC) où le processeur de  « boot » est assigné à un ensemble d&#039;interruptions. &lt;br /&gt;
&lt;br /&gt;
De plus, l&#039;architecture APIC apporte une gestion de 24 interruptions, une gestion de priorité des interruptions et le routage de l&#039;interruption sur le bon processeur, contre un simple routage de 2*8 interruptions dans le modèle PIC sur un seul processeur. Depuis une dizaine d&#039;années, Intel propose le modèle APIC comme nouvelle architecture, y compris pour les systèmes mono-processeurs. Les ordinateurs récents, y compris les portables, sont maintenant équipés uniquement de composants APIC même si l&#039;on peut obtenir un comportement de type PIC avec ceux-ci.&lt;br /&gt;
&lt;br /&gt;
L&#039;architecture APIC est constituée d&#039;un ou plusieurs composants situé physiquement dans le southbridge (IO-APIC), généralement un par bus, et un composant situé dans le processeur : le Local APIC (LAPIC). Le LAPIC va permettre la gestion des interruptions au niveau du processeur local. Il permet aussi de générer des interruptions par exemple pour transmettre des interruptions à des processeurs voisins dans le contexte d&#039;un système multi-processeurs, ces messages sont appelés IPI (Inter Processor Interrupts). &lt;br /&gt;
&lt;br /&gt;
De plus le Local APIC (LAPIC) inclut un « timer » de précision cadencé à la fréquence du bus, généralement il peut être utilisé par l&#039;ordonnanceur de votre système d&#039;exploitation favori ou d&#039;autres outils de haut niveau (profiler kernel : oprofile, vtune). Les LAPIC et l&#039;IO-APIC sont reliés par un bus spécifique pour permettre un échange rapide des informations. &lt;br /&gt;
Schema logique d&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les IO-APIC vont donc se charger de collecter les interruptions provenant des périphériques systèmes et d&#039;en assurer le transfert vers le ou les processeur(s) suivant une route préalablement programmée par le BIOS et/ou le système d&#039;exploitation.&lt;br /&gt;
&lt;br /&gt;
Cependant, l&#039;implémentation des APIC dans les BIOS peut provoquer certaines instabilités sur votre système Linux. Par expérience, il n&#039;y a pas de règle pour trouver la configuration qui peut aider votre machine à se stabiliser car cela dépend de chaque machine. Des différences peuvent même exister entre  deux versions de BIOS d&#039;un même ordinateur. Cependant, dans la série 2.6 du noyau Linux et les version 2.4 récentes nous disposons d&#039;outils permettant de re-paramétrer cette configuration en activant/désactivant les IO-APIC ou les LAPIC.&lt;br /&gt;
&lt;br /&gt;
Chaque composant possède un activateur ou un inhibiteur, on aura donc d&#039;un coté « apic » et « noapic » pour la gestion des IO-APIC, « nolapic » et « lapic » de l&#039;autre pour la gestion des LAPIC. Ces 4 options sont à utiliser sur la ligne de commande du noyau, c&#039;est à dire au moment où le « bootloader » (lilo ou grub par exemple) va charger le noyau en mémoire. L&#039;utilisation de « apic » et « lapic » permet d&#039;activer ces composants qui ne l&#039;ont pas été par le BIOS. L&#039;activateur « apic » n&#039;est disponible que les architectures de type x86_64 car celui-ci est déjà activé sur les systèmes de type x86. On désactivera les APIC dans le cas où le système affiche des messages d&#039;erreurs sur les APIC comme : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;« APIC error on CPU0: 40(40) »&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ou&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;MP-BIOS bug: 8254 timer not connected to IO-APIC&lt;br /&gt;
failed.&lt;br /&gt;
timer doesn&#039;t work through the IO-APIC - disabling NMI Watchdog!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La désactivation des IO-APIC permet par exemple de corriger le comportement parfois récalcitrant de certaines cartes vidéos qui ne parviennent pas à afficher correctement en mode 2D/3D (écran noir par exemple).&lt;br /&gt;
&lt;br /&gt;
La non activation des LAPIC peut avoir comme conséquence un dysfonctionnement de l&#039;ACPI (gestion d&#039;énergie avancée). Ce cas est traité par le noyau, vous retrouverez dans les messages de démarrage la ligne suivante : « &amp;quot;Local APIC disabled by BIOS you can enable it with lapic ».&lt;br /&gt;
&lt;br /&gt;
Pour résumer, si votre machine, en général à architecture mono-processeur, a tendance à se bloquer lors de l&#039;utilisation de périphériques tels que le port usb, la carte graphique ou la carte son, essayez de désactiver le LAPIC puis l&#039; IO-APIC puis les 2.  Pour exemple, les cartes mère A7N8X de chez Asus ont largement tendance à se bloquer si l&#039;on ne spécifie pas « nolapic » lors du boot. Sur certaines machines, il faudra faire le contraire à savoir forcer l&#039;activation des LAPIC. Ceci dépendra de votre machine et de sa conception.&lt;br /&gt;
&lt;br /&gt;
== A vos marques, rebootez ! ==&lt;br /&gt;
&lt;br /&gt;
Certains machines peuvent présenter quelques soucis pour redémarrer. Encore une fois, on retrouve au coeur de ce problème l&#039;interaction entre le noyau et le matériel notamment l&#039;ACPI. Les ordinateurs portables dont le modèle HP nc6120 ont par exemple le bon goût de rester bloqués sur le message « No reboot fixup found for your hardware ». Ceci indique que le noyau ne connaît pas de contournement pour ce matériel (ce qui est le cas de la quasi totalité des ordinateurs) mais puisque vous voyez ce message c&#039;est que votre machine n&#039;a pas réussi à rebooter. Heureusement, il existe des contournements pour permettre un redémarrage plus « bas niveau ». Le noyau défini les modes suivants : « b » « c » « h » « s » et « w ».&lt;br /&gt;
Le mode de reboot peut être défini sur la ligne de commande du noyau suivant la forme « reboot=&amp;lt;mode&amp;gt; ». Le mode « s » est réservé au systèmes multi-processeurs, elle va réinitialiser chacun des processeurs.&lt;br /&gt;
&lt;br /&gt;
Le mode « b » permet quant à lui de rebooter en faisant un appel direct au bios qui se chargera de faire redémarrer la machine. Ce mode fonctionne plutôt bien car dans le cas d&#039;un BIOS posant problème sur l&#039;ACPI, on peut espérer avoir un reboot correct. C&#039;est le cas sur de notre portable cité précédement.&lt;br /&gt;
&lt;br /&gt;
Le mode « h » se chargera de faire redémarrer la machine en réinitialisant le processeur. C&#039;est l&#039;équivalent du mode « s » pour les environnements mono-processeurs.  Pour finir, les modes « c » et « w » correspondent aux modes « cold » et « warn » : ces modes sont plus connus sous le nom de « reboot à froid »  et « reboot à chaud ». Le premier effectuera les tests de mémoire tandis que le second exécutera un reboot plus court.&lt;br /&gt;
&lt;br /&gt;
De manière générale, on utilisera plutôt le mode « b » ou « h » pour les systèmes mono-processeurs récalcitrant et le mode « s » pour les systèmes multi-processeurs.&lt;br /&gt;
&lt;br /&gt;
== Toujours plus de performance ==&lt;br /&gt;
Votre configuration est bien stable depuis un certain temps. Toutefois vous trouvez qu&#039;elle est un peu lente, elle ne vous donne pas satisfaction par rapport à ce qu&#039;elle devrait fournir.&lt;br /&gt;
Cette partie de l&#039;article va explorer comment vérifier et corriger les problèmes de performance des différents composants.&lt;br /&gt;
Note: certaines configuration mono-processeur nécessitent de désactiver LAPIC (nolapic)&lt;br /&gt;
&lt;br /&gt;
=== Le disque dur ===&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le disque dur semble un peu lent et pénalise le système dans son ensemble. Hdparm est là pour vous aider à y voir plus clair. Hdparm est à l&#039;origine conçu pour les systèmes de disques IDE de type PATA. Le nouveau système de disque SATA, ne permet pas toujours en fonction de l&#039;implémentation, l&#039;appel à toutes ces astuces. Cependant les nouvelles séries de kernel à partir du 2.6.15 devrait permettre une gestion plus unifiée des systèmes de disques PATA et SATA.&lt;br /&gt;
&lt;br /&gt;
Le test « hdparm -t /dev/&amp;lt;mon_device&amp;gt; » permet de tester la vitesse de lecture depuis le disque dur jusqu&#039;en mémoire. Une valeur de 25Mo/sec est un minimum pour des machines récentes. Plusieurs paramètres peuvent influencer les performances d&#039;un disque IDE. &lt;br /&gt;
La commande « hdparm -cd » permet de vérifier que les entrées/sorties sont réalisées en 16-bit (le mode 32-bit n&#039;offre pas de performance supplémentaire) alors que le DMA (Direct Memory Access) est activé. Ceci permet la minimisation de l&#039;utilisation du processeur pendant les accès au disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -cd /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
 IO_support   =  0 (default 16-bit)&lt;br /&gt;
 using_dma    =  1 (on)&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande « hdparm -c0d1 /dev/&amp;lt;mon_device&amp;gt; » permet de configurer le périphérique dans ce mode. Le noyau de votre distribution Linux devrait le réaliser de manière automatique.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -I » permet d&#039;obtenir plus d&#039;informations sur la configuration de votre disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -I /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
ATA device, with non-removable media&lt;br /&gt;
	Model Number:       FUJITSU MHT2040AT                       &lt;br /&gt;
	Serial Number:      NN77T3C13KB9&lt;br /&gt;
	Firmware Revision:  0022    &lt;br /&gt;
Standards:&lt;br /&gt;
	Used: ATA/ATAPI-6 T13 1410D revision 3a &lt;br /&gt;
	Supported: 6 5 4 3 &lt;br /&gt;
Configuration:&lt;br /&gt;
	Logical		max	current&lt;br /&gt;
	cylinders	16383	16383&lt;br /&gt;
	heads		16	16&lt;br /&gt;
	sectors/track	63	63&lt;br /&gt;
	--&lt;br /&gt;
	CHS current addressable sectors:   16514064&lt;br /&gt;
	LBA    user addressable sectors:   78140160&lt;br /&gt;
	device size with M = 1024*1024:       38154 MBytes&lt;br /&gt;
	device size with M = 1000*1000:       40007 MBytes (40 GB)&lt;br /&gt;
Capabilities:&lt;br /&gt;
	LBA, IORDY(cannot be disabled)&lt;br /&gt;
	bytes avail on r/w long: 4	Queue depth: 1&lt;br /&gt;
	Standby timer values: spec&#039;d by Standard, no device specific minimum&lt;br /&gt;
	R/W multiple sector transfer: Max = 16	Current = 16&lt;br /&gt;
	Advanced power management level: 128 (0x80)&lt;br /&gt;
	Recommended acoustic management value: 254, current value: 254&lt;br /&gt;
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 &lt;br /&gt;
	     Cycle time: min=120ns recommended=120ns&lt;br /&gt;
	PIO: pio0 pio1 pio2 pio3 pio4 &lt;br /&gt;
	     Cycle time: no flow control=240ns  IORDY flow control=120ns&lt;br /&gt;
Commands/features:&lt;br /&gt;
	Enabled	Supported:&lt;br /&gt;
	   *	READ BUFFER cmd&lt;br /&gt;
	   *	WRITE BUFFER cmd&lt;br /&gt;
	   *	Host Protected Area feature set&lt;br /&gt;
	   *	Look-ahead&lt;br /&gt;
	   *	Write cache&lt;br /&gt;
	   *	Power Management feature set&lt;br /&gt;
		Security Mode feature set&lt;br /&gt;
	   *	SMART feature set&lt;br /&gt;
	   *	Mandatory FLUSH CACHE command &lt;br /&gt;
	   *	Device Configuration Overlay feature set &lt;br /&gt;
	   *	Automatic Acoustic Management feature set &lt;br /&gt;
	   *	SET MAX security extension&lt;br /&gt;
		Power-Up In Standby feature set&lt;br /&gt;
	   *	Advanced Power Management feature set&lt;br /&gt;
	   *	DOWNLOAD MICROCODE cmd&lt;br /&gt;
	   *	SMART self-test &lt;br /&gt;
	   *	SMART error logging &lt;br /&gt;
Security: &lt;br /&gt;
		supported&lt;br /&gt;
	not	enabled&lt;br /&gt;
	not	locked&lt;br /&gt;
		frozen&lt;br /&gt;
	not	expired: security count&lt;br /&gt;
	not	supported: enhanced erase&lt;br /&gt;
	40min for SECURITY ERASE UNIT. &lt;br /&gt;
HW reset results:&lt;br /&gt;
	CBLID- above Vih&lt;br /&gt;
	Device num = 0 determined by the jumper&lt;br /&gt;
Checksum: correct&lt;br /&gt;
[root@R1 ~]#&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On y retrouve le modèle, le numéro de série et la version du firmware qui peuvent être utiles en cas de contact avec le Service Après-Vente ou de mise à jour pour une série de firmwares défaillante.&lt;br /&gt;
&lt;br /&gt;
La ligne commençant par « DMA » dans la partie « Capabilities » permet d&#039;afficher la vitesse de transfert négociée entre le disque dur et le driver IDE de Linux. L&#039;étoile précède la valeur actuelle. Dans cet exemple, le mode udma5 est sélectionné : ceci est conforme aux machines disponibles sur le marché depuis environ 3 ans.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, voici le tableau de conversion entre le mode DMA et la vitesse maximale associée.&lt;br /&gt;
&lt;br /&gt;
Type de fonctionnement&lt;br /&gt;
Vitesse Maximale en MO/sec&lt;br /&gt;
UltraDMA 0&lt;br /&gt;
16,6&lt;br /&gt;
UltraDMA 1&lt;br /&gt;
25&lt;br /&gt;
UltraDMA 2&lt;br /&gt;
33,3&lt;br /&gt;
UltraDMA 3&lt;br /&gt;
44,4&lt;br /&gt;
UltraDMA 4&lt;br /&gt;
66,6&lt;br /&gt;
UltraDMA 5&lt;br /&gt;
100&lt;br /&gt;
UltraDMA 6&lt;br /&gt;
133,33&lt;br /&gt;
&lt;br /&gt;
Une configuration actuelle ne devrait pas être en dessous de UDMA5. Si ce n&#039;était pas le cas, on peut essayer de renégocier la vitesse de transfert à l&#039;aide de la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hdparm -X udma5 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celle-ci permet de forcer le mode UltraDMA5. Il faut utiliser cette commande avec précaution car elle pourrait générer des pertes ou de la corruption de données en cas de transfert pendant ce changement de mode.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi impacter les performances de votre disque dur en modifiant sa vitesse de rotation. Cette fonctionnalité connue sous le nom de Automatic Acoustic Management (AAM) est utilisable avec l&#039;option « -M » de hdparm. La valeur 128 représentera la vitesse la plus faible avec un disque silencieux, la valeur 254 la vitesse la plus élevée mais avec comme contre-partie un disque plus bruyant. On pourra noter des différences de quelques Mo/sec selon les configurations.&lt;br /&gt;
&lt;br /&gt;
Il est aussi à noter que l&#039;utilisation de logiciels permettant une meilleure gestion d&#039;énergie (cpufreq, laptop-mode) peut dégrader les performances d&#039;un disque dur de manière notable.&lt;br /&gt;
&lt;br /&gt;
=== Configuration bas niveau du réseau ===&lt;br /&gt;
&lt;br /&gt;
Le réseau local filaire peut parfois être un peu lent. Voici quelques tests pour vérifier si la lenteur provient du logiciel, du noyau ou du matériel. Tout d&#039;abord, explorons la trousse à outils indispensable pour analyser votre carte réseau : ethtool. Digne successeur de mii-tool, il permet de s&#039;informer sur la configuration de votre carte réseau. &lt;br /&gt;
&lt;br /&gt;
Il suffit de lancer « ethtool &amp;lt;votre_interface&amp;gt; » » pour obtenir la configuration matérielle de votre carte. On y retrouve les modes supportés par votre carte (Supported Link Modes ainsi que la vitesse actuelle (Speed), obtenue par auto-négociation dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
On peut également savoir si le câble réseau est connecté à la carte grâce à la ligne « Link Detected ». Le type de « duplex » utilisé permet également de savoir si la négociation avec l&#039; élément actif au bout de votre câble (commutateur, concentrateur ou une autre machine) a correctement fonctionné. Le duplex définit le mode de  transmission : le mode half-duplex indique que l&#039;on émet puis on reçoit des données, le mode full-duplex indique que l&#039;on peut émettre et recevoir en même temps des données. Le mode full-duplex est donc plus que recommandé pour vos équipements réseaux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# ethtool  eth1&lt;br /&gt;
Settings for eth1:&lt;br /&gt;
	Supported ports: [ TP MII ]&lt;br /&gt;
	Supported link modes:   10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Supports auto-negotiation: Yes&lt;br /&gt;
	Advertised link modes:  10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Advertised auto-negotiation: Yes&lt;br /&gt;
	Speed: 100Mb/s&lt;br /&gt;
	Duplex: Full&lt;br /&gt;
	Port: MII&lt;br /&gt;
	PHYAD: 1&lt;br /&gt;
	Transceiver: internal&lt;br /&gt;
	Auto-negotiation: on&lt;br /&gt;
	Current message level: 0x000020c1 (8385)&lt;br /&gt;
	Link detected: yes&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesurer les {contre}performances de votre réseau ===&lt;br /&gt;
&lt;br /&gt;
Une fois vérifiée la bonne configuration de votre matériel, nous pouvons passer à la vérification des performances entre deux machines.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire netpipe (http://www.scl.ameslab.gov/netpipe/) permet de réaliser des tests de performance mais aussi d&#039;intégrité entre deux machines. Il permet de tester les performances du réseau au travers la couche IP et non pas depuis un mode plus bas niveau comme pourrait l&#039;être un test utilisant directement le driver Ethernet. Ce test permet donc de valider que la configuration matérielle mais aussi logicielle est correcte.&lt;br /&gt;
&lt;br /&gt;
Sur la première machine, exécutez « NPtcp » : netpipe se positionne en mode « serveur ».&lt;br /&gt;
Sur la seconde machine, exécutez « NPtcp -h &amp;lt;machine1&amp;gt; » : netpipe se connecte au serveur netpipe de la machine nommée machine1 pour effectuer le test de performance.&lt;br /&gt;
&lt;br /&gt;
Le test par défaut teste les communication allant de 1 octet jusqu&#039;à 8 Mo. Il peut prendre plusieurs minutes si le réseau est « lent ». Le test va montrer pour chaque taille de paquet la performance obtenue. Il est normal d&#039;obtenir des performances faibles pour des paquets d&#039;une taille inférieure à 8 Ko. Transporter des petits paquets nécessite de réaliser beaucoup d&#039;opérations pour le processeur pour une quantité d&#039;information minime. Les performances seront meilleures à partir d&#039;environ 16 Ko et maximales à partir de 128 Ko. Sur un système utilisant du gigabit ethernet, on constatera une performance de 39Mbps à 256 octets, 287Mbps à 4Ko, 614Mbps à 16Ko, 845Mbps à 128Ko, 895Mbps à 8Mo.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ainsi vérifier et comparer facilement les performances de votre configuration réseau. Netpipe permet également de tester la vitesse du réseau pour une taille de paquets définie entre la taille indiqué par l&#039;option « -l » et la taille indiquée par l&#039;option « -u ». Ainsi, NPtcp -l 16384 -u 16384 permet de tester la bande passante réseau pour une taille de paquet égale à 16Ko.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -n &amp;lt;nb-cycle&amp;gt; » permet de définir le nombre de boucles à réaliser pour le test (50 par défaut). Enfin, pour réaliser des tests « full-duplex », on utilisera l&#039;option « -2 ». Ce test permet de s&#039;assurer du bon fonctionnement du mode de communication permettant l&#039;écriture et la lecture simultanées.&lt;br /&gt;
&lt;br /&gt;
Attention, même si ce test donne de bons résultats, cela ne veut pas dire que la configuration est exempte d&#039;erreur de configuration. Par exemple, les performances réseaux peuvent être très bonnes en point à point mais mauvaises lorsque l&#039;on aura une charge réseau avec plusieurs clients. Dans cette situation, il faut vérifier que le contrôle de flux est bien activé sur toutes les machines. L&#039;option « ethtool -a » permet de vérifier que les champs « rx » et « tx » sont placés sur « on ». Si ce n&#039;était pas le cas activez-les avec la commande « ethtool -A eth0 rx on » et « ethtool -A eth0 tx on ».&lt;br /&gt;
&lt;br /&gt;
Les cartes réseaux, des serveurs essentiellement, permettent maintenant de réaliser le « tcp segment offload ». Cette technique permet de décharger une partie du traitement TCP directement dans l&#039;électronique de la carte réseau. Ceci à pour effet de décharger le processeur central d&#039;un traitement fastidieux. L&#039;option « -k » d&#039;ethtool permet de consulter l&#039;état de cette fonctionnalité (off/on). On pourra l&#039;activer sur des serveurs générant un gros trafic réseau par exemple : « ethtool -K eth0 tso on ».&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant équipé de nouveau outils pour traquer la perte de performances de votre installation réseau. Ceci couplé aux habituels tcpdump/ethereal, voilà une belle panoplie du zorro du réseau.&lt;br /&gt;
&lt;br /&gt;
=== Quand la latence s&#039;en mêle ===&lt;br /&gt;
&lt;br /&gt;
La latence représente le temps nécessaire à un système pour prendre en compte un événement.&lt;br /&gt;
&lt;br /&gt;
Il arrive que certains périphériques de votre machine nécessitant des débits importants ou une latence assez faible sur le bus PCI soient « poussifs ». On retrouve dans cette catégorie les cartes vidéos accélératrice 3D, les cartes son et les cartes d&#039;acquisition firewire ou DVB (récepteur de télévision numérique terrestre : TNT).&lt;br /&gt;
&lt;br /&gt;
Un périphérique branché sur le bus PCI doit attendre que le bus soit libre pour émettre les données vers la mémoire centrale. Le bus PCI qui est le coeur de communication des périphériques est donc soumis en permanence à un arbitrage qui permet de décider qui doit émettre des données et qui doit attendre. Cet arbitrage est en partie réalisé grâce au « latency_timer ».&lt;br /&gt;
&lt;br /&gt;
Chaque périphérique possède une valeur de « latency_timer » comprise en 0 et 248 cycles d&#039;horloge du bus. Plus la valeur sera importante plus le périphérique disposera de temps pour transmettre des informations. Une latence de 248 cycles permet d&#039;obtenir une priorité forte sur le bus, ce qui permet un débit important. A contrario, une latence de 0 indiquera au périphérique qu&#039;il doit cesser ses transmissions si un autre composant à besoin du bus : ceci se traduira par une perte de bande passante importante.&lt;br /&gt;
&lt;br /&gt;
La configuration réalisée par défaut sur votre machine doit être correcte mais il peut arriver qu&#039;une carte 3D ou DVB soit configurée avec une latence trop faible, ce qui  aurait pour conséquence d&#039;offrir une image saccadée et peu fluide. Une carte son offrirait également le même type de symptômes avec un son hâché ou excessivement métallique.&lt;br /&gt;
&lt;br /&gt;
Heureusement, une série d&#039;outils est là pour vous aider à diagnostiquer le problème mais aussi à le résoudre. Le projet pciutils  (http://atrey.karlin.mff.cuni.cz/~mj/linux.shtml#pciutils) contient deux outils indispensables: lspci et setpci. Bien entendu, votre distribution favorite devrait posséder ce logiciel, il vous suffira de l&#039;installer avec  votre gestionnaire de paquet favori (urpmi, apt, smart).&lt;br /&gt;
&lt;br /&gt;
La commande « lspci » vous permet de lister les périphériques PCI disponibles sur votre ordinateur (cf article paru dans le numéro 68).  Cet exemple se basera sur une carte vidéo  ayant pour adresse sur le bus PCI « 01:00.0 ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@lagirafe] lspci -v -s 01:00.0&lt;br /&gt;
01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go5200 32M/64M] (rev a1) (prog-if 00 [VGA])&lt;br /&gt;
	Subsystem: Samsung Electronics Co Ltd: Unknown device c00f&lt;br /&gt;
	Flags: bus master, 66Mhz, medium devsel, latency 16, IRQ 11&lt;br /&gt;
	Memory at c8000000 (32-bit, non-prefetchable) [size=16M]&lt;br /&gt;
	Memory at d8000000 (32-bit, prefetchable) [size=128M]&lt;br /&gt;
	Expansion ROM at &amp;lt;unassigned&amp;gt; [disabled] [size=128K]&lt;br /&gt;
	Capabilities: [60] Power Management version 2&lt;br /&gt;
	Capabilities: [44] AGP version 3.0&lt;br /&gt;
[root@lagirafe]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On retiendra dans cette ligne, la valeur &#039;latency 16&#039;. Ceci risque de poser problème lorsque celle-ci aura besoin d&#039;un fort débit pendant un jeu par exemple. Augmenter la latence va donc se révéler nécessaire pour ce périphérique.&lt;br /&gt;
&lt;br /&gt;
La commande setpci permet de modifier les paramètres PCI d&#039;un périphérique ou d&#039;un bus complet avec tous ses périphériques. &lt;br /&gt;
&lt;br /&gt;
La commande « setpci -v -d 01:* latency_timer=20 » permet de positionner tous les périphériques  du bus 01 à une valeur de 32 cycles. Il est à noter que la commande setpci utilise des valeurs en hexadécimal mais lspci affichera les valeurs en décimal.&lt;br /&gt;
&lt;br /&gt;
Pour en revenir à nos moutons, la correction de la latence de cette carte graphique se fera avec la commande «  setpci -v -d 01:00.0 latency_timer=f8 ». Ceci positionne donc la carte sur la plus grande valeur de latence possible, ce qui lui garantira la plus grande bande passante possible. Il est possible d&#039;utiliser la valeur « ff » comme paramètre pour « latency_timer » mais celui-ci sera converti à la volée par la commande setpci en « 0xf8 ».&lt;br /&gt;
&lt;br /&gt;
Attention, certains composants de votre machine doivent rester en « latency_timer=0 » pour garantir une bon fonctionnement de votre système : il ne faudra donc pas modifier les latences des contrôleurs mémoire et des ponts PCI connectés généralement sur le bus « 0:* ».&lt;br /&gt;
&lt;br /&gt;
== DSDT : le cauchemar continue ! ==&lt;br /&gt;
&lt;br /&gt;
Cette partie de l&#039;article a pour but d&#039;expliquer le problème que peut représenter la table DSDT pour un certain nombre de machines et surtout les ordinateurs portables. &lt;br /&gt;
&lt;br /&gt;
La norme ACPI 3.0 de Septembre 2004 disponible gratuitement à l&#039;adresse http://www.acpi.info/DOWNLOADS/ACPIspec30.pdf définit la DSDT comme une table remplie par un OEM permettant au système d&#039;exploitation de découvrir les ressources pour la gestion de l&#039;énergie avancée, de la gestion thermique ainsi que la gestion du Plug&#039;nPlay des ressources définies par l&#039;ACPI.&lt;br /&gt;
&lt;br /&gt;
Voici une description certes un peu théorique mais nécessaire pour bien comprendre la problématique et ses conséquences. Le constructeur de l&#039;ordinateur doit donc définir dans le BIOS une table contenant une liste de ressources et leurs configuration et ce pour que le système d&#039;exploitation puisse s&#039;en servir. Noble cause n&#039;est il pas ? Tout au long des 618 pages de ce document sont spécifiés les éléments du langage à utiliser ainsi que sa syntaxe. L&#039; « ACPI Source Language » permettra donc aux développeurs d&#039;écrire des DSDT puis de les compiler dans un format nommé « ACPI Machine Language » en utilisant un compilateur adéquat. Le système d&#039;exploitation utilisera la table compilée (AML) pour accéder aux ressources ACPI. &lt;br /&gt;
Sur la plupart des ordinateurs portables, la table DSDT ne respecte pas la norme ACPI dans sa syntaxe. Ceci est très gênant car cela bloque le code de l&#039;interpréteur ACPI du noyau Linux qui essaie de la lire. Le résultat est sans appel, pas d&#039;ACPI, pas de gestion d&#039;énergie avancée, plus de ventilation automatique sur certains modèles d&#039;ordinateurs, plus de touche de gestion de contraste/luminosité sur d&#039;autres etc...&lt;br /&gt;
&lt;br /&gt;
Ceci est très gênant sur un ordinateur portable. Alors que faire ? Dans un premier temps, prévenir le constructeur que son BIOS est incorrect et ne respecte pas la norme ACPI. La réponse se fait toujours attendre pour tous ceux qui « osent » poser la question au support technique : à savoir, les constructeurs ignorent tout simplement les mails de ce type.&lt;br /&gt;
La seconde étape puisque vous êtes devant le fait accompli d&#039;une machine non conforme, il va falloir corriger cette table. Il suffit de récupérer la table actuelle via la commande &#039;cat /proc/acpi/dsdt &amp;gt; dsdt.aml&#039; si vous avez la chance d&#039;avoir un répertoire /proc/acpi malgré une table DSDT endommagée, sinon utilisez la commande &#039;acpidump -b -t dsdt -o dsdt.aml&#039;. La commande acpidump est  fournit dans le projet pmtools (ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools-20050926.tar.bz2) &lt;br /&gt;
Vous avez donc extrait la table DSDT de votre système. Il ne reste plus qu&#039;à essayer de la recompiler. Pour cela, le compilateur IASL de la société Intel (http://developer.intel.com/technology/iapc/acpi/downloads.htm) offre sous Linux et Windows une plate-forme de compilation pour le langage ASL.&lt;br /&gt;
&lt;br /&gt;
Suivez les instructions du site pour télécharger et compiler la version unix d&#039;iasl. Ensuite, décompilez la table avec la commande « iasl -d dsdt.aml ». Le fichier dsdt.dsl vient d&#039;être créé par le décompilateur. Il suffit de le recompiler avec la commande « iasl -tc dsdt.dsl » pour constater les dégâts ! La DSDT que vous avez dans votre BIOS est généralement compilée par le compilateur de Microsoft qui semble autoriser une syntaxe plus qu&#039;approximative.&lt;br /&gt;
Si vous avez de la chance, votre DSDT s&#039;est recompilée sans erreurs, vous obtenez donc un fichier dsdt.hex et un fichier dsdt.aml. Il ne reste plus qu&#039;à injecter cette dsdt dans le noyau Linux et le tour sera joué.&lt;br /&gt;
&lt;br /&gt;
Si vous avez moins de chance, votre DSDT est syntaxiquement incorrecte et génère des erreurs. Les expliquer plus en détails nécessiterait un article complet, il ne sera cité que les plus « habituelles » (sic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2626:                     Field (ECR, DWordAcc, Lock, Preserve) &lt;br /&gt;
Error    1048 -                              ^ Host Operation Region requires ByteAcc access &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette erreur présente à ligne 2626 du fichier dsdt.asl indique une erreur de type dans la déclaration du champ ECR. Il suffit dans ce cas de changer le mot « DWordAcc » par « ByteAcc ». Celle-ci reste assez simple à corriger, on se demande donc pourquoi les constructeurs ne prennent pas le temps de vérifier et de corriger leur BIOS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2672:                     Method (_GLK, 1, NotSerialized) &lt;br /&gt;
Warning  2024 -                                ^ Reserved method has too many arguments ( _GLK requires 0) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode _GLK n&#039;a besoin que de 0 paramètre tandis que ce code en utilise 2 ! La correction est assez simple : il suffit de remplacer la ligne 2672 par « Method(_GLK) ».&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur la correction des erreurs de compilation de votre table dsdt, je vous recommande les tutoriaux disponibles depuis la page http://acpi.sourceforge.net/dsdt/index.php du projet ACPI.&lt;br /&gt;
&lt;br /&gt;
Votre DSDT est compilée avec succès, il ne vous reste plus qu&#039;à l&#039;ajouter pour que votre noyau puisse l&#039;utiliser à la place de celle fourni par le BIOS (modifiable uniquement par le constructeur, via une mise à jour).&lt;br /&gt;
&lt;br /&gt;
Il existe trois possibilités pour inclure une table DSDT : la modification du noyau Linux ( noyau &amp;lt; 2.6.9), l&#039;injection de la DSDT dans la configuration du noyau (noyau &amp;gt;= 2.6.9), l&#039;intégration de la table DSDT dans l&#039;initrd qui nécessite un patch kernel disponible à l&#039;adresse http://gaugusch.at/kernel.shtml.&lt;br /&gt;
&lt;br /&gt;
Pour les noyaux 2.6.9 et supérieur, copiez votre fichier dsdt.hex sous le nom «/usr/src/linux/include/acpi/dsdt_table.h » puis reconfigurez votre noyau.&lt;br /&gt;
Insérer « dsdt_table.h » dans l&#039;option « Include you custom DSDT » disponible dans le menu « Power Management/ACPI/ ». Recompilez votre noyau et redémarrez avec votre nouveau noyau.&lt;br /&gt;
Pour les noyaux inférieurs à 2.6.9, il est possible de modifier le code source de votre noyau pour intégrer votre DSDT mais il est préférable d&#039;utiliser le patch permettant l&#039;insertion de la table DSDT dans l&#039;initrd. Recompilez votre noyau avec ce patch, puis suivez la procédure décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Certaines distributions Linux comme « Mandriva Linux » possèdent le patch qui permet de n&#039;avoir qu&#039;à reconstruire l&#039;initrd avec la commande « mkinitrd –dsdt=/boot/dsdt.aml /boot/initrd-`uname -r`.img `uname -r`  » puis de relancer lilo avant de redémarrer votre machine. Lors du démarrage de celle-ci vous devriez voir le message suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ACPI: Looking for DSDT in initrd... found (at offset 0x4f8d9).&lt;br /&gt;
ACPI-0294: *** Info: Table [DSDT] replaced by host OS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant avec une table DSDT correcte et un ACPI fonctionnel. La question qui reste ouverte est pourquoi les constructeurs n&#039;utilisent pas un compilateur digne de ce nom pour permettre à leur clients de pouvoir utiliser d&#039;autres systèmes d&#039;exploitation que Windows de Microsoft. &lt;br /&gt;
&lt;br /&gt;
Pour la petite histoire, si vous cherchez dans votre dsdt vous risquez de tomber ce genre de lignes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows NT&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft WindowsME: Millennium Edition&amp;quot;), Zero))&lt;br /&gt;
 If (LEqual (SizeOf (\_OS), 0x27)) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque qu&#039;un système d&#039;exploitation souhaite utiliser les ressources ACPI du BIOS, il utilise son nom de système d&#039;exploitation (acpi_os_name). On retrouve donc dans les bios des parties qui ne seront exécutées que pour certains systèmes d&#039;exploitation de Microsoft. On retrouve même certains tests où c&#039;est la longueur du nom qui compte...... Ceci prouve bien que les constructeurs d&#039;ordinateurs savent corriger des tables DSDT pour les systèmes d&#039;exploitation mais pas forcément pour le notre malheureusement. Depuis le noyau 2.6.9, le noyau Linux utilise « Windows NT » comme « acpi_os_name »  pour assurer une meilleure compatibilité matérielle dixit Len Bron d&#039;Intel dans le changelog de cette version.&lt;br /&gt;
&lt;br /&gt;
== Comment trouver le pilote qui va avec votre matériel ? ==&lt;br /&gt;
&lt;br /&gt;
Cette question on se la pose souvent mais uniquement lorsque l&#039;on essaye de brancher un nouveau périphérique sur sa machine. Les distributions récentes permettent de détecter automatiquement votre matériel et de lui associer un pilote avec sa configuration. Ce mécanisme fonctionne plutôt bien mais cela n&#039;évite pas les dysfonctionnements voir l&#039;absence de fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Pour vérifier si votre noyau Linux est capable de supporter un nouveau périphérique PCI par exemple, il suffit d&#039;en récupérer les identifiants PCI (constructeur et produit) puis de les rechercher dans le fichier « /lib/modules/`uname -r`/modules.pcimap » qui est auto-généré lors de la commande depmod.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire « lspcidrake -v » vous permet de trouver les identifiants PCI de votre carte, la commande « lspci » vous permet de trouver le nom de votre périphérique puis faites un « lspci -n » pour en trouver la correspondance numérique. On utilisera la position du périphérique sur le bus pour retrouver la correspondance numérique « 02:05.0 » dans cet exemple.&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome] lspci&lt;br /&gt;
[....]&lt;br /&gt;
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)&lt;br /&gt;
[root@pumphome] lspci -n&lt;br /&gt;
[...]&lt;br /&gt;
02:05.0 Class 0200: 14e4:4401 (rev 01)&lt;br /&gt;
[root@pumphome]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi cette carte réseau possède les identifiants 14e4 (constructeur) et 4401 (produit). Il suffit de rechercher cette valeur dans le modules.pcimap, ce qui nous donnera la correspondance en module (pilote).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome]  grep &amp;quot;0x000014e4 0x00004401&amp;quot; /lib/modules/2.6.12-12mdk-i686-up-4GB/modules.pcimap &lt;br /&gt;
b44               0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
bcm4400      0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit ici que cette carte peut utiliser le driver b44 ou le driver bcm4400. On ne trouve pas toujours les identifiants PCI de produit sous leur forme directe, on peut également trouver « 0Xffffffff » qui indique que tous les cartes du constructeur sont gérées par un module.&lt;br /&gt;
Il ne vous restera plus qu&#039;à effectuer la configuration associée à ce périphérique pour qu&#039;il fonctionne correctement.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
La fin de cet article conclut une toute petite série de deux articles ayant pour but de vulgariser l&#039;architecture de nos machines, de découvrir les outils disponibles pour mieux comprendre leur configuration et au besoin régler les problèmes de configuration matérielle qui ont souvent le don de nous pourrir la vie.&lt;br /&gt;
&lt;br /&gt;
Merci à LaurentJ de #Mandrivafr pour ses tests complémentaires sur les problèmes d&#039;IO-APIC. Un énorme merci à Nicolas Planel pour sa relecture pointue et également Anne pour sa patience de girafe à relire et « quaurigé »mes « photes »,  ainsi qu&#039;à tous ceux qui m&#039;ont aidé à découvrir ce que je restitue dans cet article.&lt;br /&gt;
&lt;br /&gt;
Cet article a été publié dans Linux Magazine France n°78. Il est publié sur Léa avec l&#039;aimable autorisation de l&#039;éditeur.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12776</id>
		<title>Découvrez les ressources de votre machine (La suite)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12776"/>
		<updated>2006-06-11T20:27:22Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* La mémoire qui flanche ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Découvrez les ressources de votre machine (La suite) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A nouvelle année, nouvelles résolutions ! Paru dans le numéro 68, un premier article dédié à la découverte des outils disponibles pour la récupération des configurations de votre machine promettait une suite.  Je vous propose donc de reprendre ce voyage au centre de votre ordinateur. &lt;br /&gt;
&lt;br /&gt;
Cet article sera articulé autour du diagnostic de pannes et des correctifs associés mais aussi de « trucs &amp;amp; astuces » permettant d&#039;optimiser votre configuration.&lt;br /&gt;
&lt;br /&gt;
== Savez-vous planter les choux ? ==&lt;br /&gt;
&lt;br /&gt;
Les choux peut-être pas mais les ordinateurs je pense que c&#039;est arrivé au moins une fois à chaque lecteur qui lit cet article. Rien de plus énervant qu&#039;un écran qui se fige, le pointeur de souris qui ne se déplace plus, le clavier qui ne répond plus non plus.... Planté ! Ce constat est assez facile à établir mais en trouver la cause reste un problème nettement plus complexe tellement le nombre de causes possibles est important.&lt;br /&gt;
&lt;br /&gt;
Deux solutions : ignorer le problème et relancer le système en se disant que ça « passera », ou alors chercher la cause du problème en essayant de trouver une méthode reproduisant le « plantage » tant redouté.&lt;br /&gt;
&lt;br /&gt;
La première solution fonctionne assez bien mais si l&#039;on à faire à un « vrai » problème de configuration matérielle ou logicielle, on arrivera assez vite à ne plus pouvoir éviter la seconde voire la troisième. J&#039;allais oublier cette troisième solution destinée aux plus riches d&#039;entre vous : changer de matériel. Cette solution coûteuse peut parfois se révéler efficace, parfois pas du tout. A quoi bon changer un composant sans savoir si c&#039;était bien celui-ci qui posait problème ?&lt;br /&gt;
Quelque soit la solution retenue, il sera de toute manière nécessaire de localiser la panne pour y apporter la réponse adéquate. Certaines sociétés ou particuliers se sont spécialisés dans ce dépannage ou l&#039;utilisateur est « dépassé » par les événements.&lt;br /&gt;
&lt;br /&gt;
Cet article vous fera, je l&#039;espère, découvrir quelques outils et méthodes pour valider un par un les composants de votre ordinateur. Cela vous permettra j&#039;espère d&#039;être un peu moins dépourvu quand un problème surviendra. L&#039;article reproduira les étapes qu&#039;il faut suivre pour isoler le « fautif ».&lt;br /&gt;
&lt;br /&gt;
== Les causes possibles d&#039;un « plantage » ==&lt;br /&gt;
&lt;br /&gt;
On retrouve deux grandes catégories de pannes provoquant des dysfonctionnements importants sur un système informatique.&lt;br /&gt;
* une panne du matériel&lt;br /&gt;
* une erreur logicielle au niveau du noyau et des pilotes (drivers)&lt;br /&gt;
&lt;br /&gt;
Il faudra donc être capable de séparer la panne matérielle qui « force » l&#039;ordinateur à entrer dans un mode de fonctionnement non prévu et instable, de l&#039;erreur logicielle qui équivaut à demander à l&#039;ordinateur de faire « n&#039;importe quoi » et qui va donc se « planter ».&lt;br /&gt;
&lt;br /&gt;
Le terme « planté » utilisé ici équivaut à un arrêt du système à cause d&#039;erreurs sévères : instruction illégale ou composants défaillants. Le terme de « plantage » est aussi utilisé pour décrire le fonctionnement d&#039;une application qui se ferme inopinément. Ce cas est plus souvent lié à une erreur de programmation de l&#039;application qu&#039;à une erreur du système. Nous ne parlerons donc pas de ce second cas dans cet article.&lt;br /&gt;
&lt;br /&gt;
== La mémoire qui flanche ? ==&lt;br /&gt;
&lt;br /&gt;
Une cause « classique » des dysfonctionnements se situe au niveau de la gestion de la mémoire de votre machine. Je ne parle pas d&#039;allocation mémoire réalisée par votre système d&#039;exploitation favori mais bien de la manière avec laquelle la carte mère configure et utilise vos barrettes de mémoire. Les applications chargent en mémoire des données et des instructions destinées au processeur. Voici un scénario qui peut provoquer l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Votre application favorite est lancée depuis la ligne de commande ou une interface graphique via un « clic » de souris. Votre système d&#039;exploitation va donc charger ce programme en mémoire puis en exécuter les instructions. Au plus bas niveau de votre système, le processeur exécute des instructions en langage machine (assembleur) présente en mémoire.&lt;br /&gt;
Malheureusement, votre mémoire est défaillante et elle n&#039;arrive pas à maintenir un état stable des informations qui lui sont confiées. Par exemple, la lettre C est représentée par le code 67, ou « 1000011 » en binaire. Si la zone mémoire change d&#039;état, alors le contenu de la valeur stocké à cet endroit changera : on pourrait se retrouver avec « 1000010 ». Un seul bit a changé, mais on passe de la lettre &#039;C&#039; (67) à la lettre &#039;B&#039;(66). Le résultat ne se fait pas attendre, le processeur se retrouve à exécuter des instructions qui n&#039;ont plus de sens, provoquant l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Les pannes de mémoires sont généralement dues à des composants endommagés, des barrettes incompatibles ou un  « timing d&#039;accès » à la mémoire (nommé CAS (Column Address Strobe) dans la plupart des BIOS) trop agressif permettant des lectures dans des zones mémoires avant que les écritures aient eu le temps de se stabiliser pour en garantir le contenu.&lt;br /&gt;
&lt;br /&gt;
Il est assez simple de valider votre configuration mémoire grâce à l&#039;utilitaire memtest (http://www.memtest.org). Cet utilitaire de taille très modeste, 96 Kilo-octets, est écrit en assembleur ce qui lui permet de s&#039;exécuter indépendamment du système d&#039;exploitation. Ceci garantit un test « proche » du matériel, sans sur-couche pouvant apporter d&#039;autres problèmes. &lt;br /&gt;
La version 1.65 actuelle est téléchargeable sous deux formes : une iso que l&#039;on peut graver sur un CDRW de préférence vu la petite taille du programme ou sous la forme d&#039;une amorce système (pre-compiled bootable binary). Il suffira de décompresser l&#039;archive puis d&#039;exécuter la commande suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;dd if=memtest.bin of=/dev/fda&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Ceci écrasera le contenu de votre disquette pour y  copier memtest. Rebootez l&#039;ordinateur avec la disquette placée dans le lecteur, memtest devrait se lancer. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:memtest.jpg]]&lt;br /&gt;
&lt;br /&gt;
La figure 1, est une capture d&#039;écran de memtest en fonctionnement. Le barre de progression principale affichée en haut à droite de l&#039;écran (2% dans cet exemple) permet de suivre la progression du test. Les erreurs apparaissent dans la partie inférieure de l&#039;écran. Il suffit de laisser fonctionner memtest au moins une fois jusqu&#039;à 100%. Si aucune ligne ne s&#039;est affichée alors vou pouvez considérer que la mémoire est fonctionnelle. Dans le cas contraire,  il faudra soit procéder à son remplacement s&#039;il s&#039;agit d&#039;une seule barrette mémoire, soit tester les barrettes indépendamment (l&#039;une puis l&#039;autre) avec ce logiciel. Dans le cas de 2 ou 3 barrettes qui ne fonctionnement pas correctement ensemble mais qui fonctionnement correctement individuellement, il faudra vérifier qu&#039;elles sont bien de même modèle/marque et remettre le Bios dans une configuration initiale.&lt;br /&gt;
&lt;br /&gt;
Votre mémoire est bonne ? Testons les autres composants de votre machine pour traquer la source de ce plantage.&lt;br /&gt;
&lt;br /&gt;
== Il ne fait pas un peu chaud là ? ==&lt;br /&gt;
&lt;br /&gt;
Ces dix dernières années la puissance consommée et dissipée par nos ordinateurs a littéralement explosé ! Du 486 qui ne nécessitait quasiment pas de ventilateur, on est arrivé à des stations de travail/jeu avec des alimentations pouvant atteindre 1KiloWatt pour les dernières et 500watt pour des modèles plus « grand public ». Le processeur est un des composants gourmands de la machine. Certains modèles peuvent consommer plus de 130W ! Autant dire que si le système est mal ventilé, la montée en charge du processeur peut provoquer un échauffement important provoquant une surchauffe de celui-ci. S&#039;il dépasse ces caractéristiques de fonctionnement, il va alors exécuter du code incorrect provocant  un plantage du système.&lt;br /&gt;
&lt;br /&gt;
Un bon test pour vérifier que votre processeur n&#039;est pas la cause de votre instabilité : commencez par relever la température de votre machine au repos à l&#039;aide des informations fournies soit par l&#039;acpi soit pas lm_sensors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[erwan@R1 ~]$ cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             42 C&lt;br /&gt;
[erwan@R1 ~]$ &lt;br /&gt;
&lt;br /&gt;
[root@konilope ~]# sensors | grep Temp&lt;br /&gt;
M/B Temp:    +39°C  (low  =   +15°C, high =   +40°C)   sensor = thermistor   &lt;br /&gt;
CPU Temp:   +127°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
Temp3:       +44°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
[root@konilope ~]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode utilisant lm_sensors nécessite une interprétation de la part de l&#039;utilisateur. Dans cet exemple, il apparaît évidant que le processeur ne peut avoir une température de fonctionnement aussi élevée (127°C). L&#039;erreur est du à un mauvais calcul de la part de lm_sensors. Il se base sur le type de capteurs thermiques utilisé par la carte mère pour calculer la température des différents composants. Malheureusement, le montage électrique autour du capteur de température peut varier d&#039;un modèle de carte à un autre, ce qui fausse les calculs. On considéra donc, que pour cette machine (konilope) sa température se situe aux alentours de 42° : valeur moyenne entre les deux valeurs « cohérentes » relevées par lm_sensors. On pourra cependant vérifier cette approximation en relevant la température du disque sur à l&#039;aide de smartmontools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# smartctl -A /dev/hda | grep Temperature&lt;br /&gt;
194 Temperature_Celsius     0x0022   042   052   000    Old_age   Always       -       42&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, il est préférable de maintenir sa machine en dessous des 55° et celle de son processeur en dessous de 70°C. Au delà, le système risque d&#039;être instable. Si ce n&#039;est pas le cas, effectuez les modification nécessaire pour y parvenir : meilleure ventilation du processeur ou du boîtier par exemple.&lt;br /&gt;
&lt;br /&gt;
Ensuite, téléchargez l&#039;utilitaire cpuburn depuis un mirroir  (http://pages.sbcglobal.net/redelm/cpuburn_1_4_tar.gz)  ou depuis votre distribution linux favorite (oui, oui, urpmi cpuburn ça fonctionne ;o)).&lt;br /&gt;
&lt;br /&gt;
Vous y trouverez plusieurs programmes nommés burnXX ou XX représente votre processeur. La version P6 sera à utiliser sur les processeurs Intel Pentium 4, la version K7 pour les processeurs Athlon x86. Pour les processeurs plus récents, utilisez la version P6.&lt;br /&gt;
Ce logiciel réalise des boucles en langage assembleur ayant pour but de stresser votre processeur de manière importante et donc le faire chauffer. Lancez cpuburn autant de fois que vous avez de processeur sur votre machine puis observez la température de votre machine. Si lors de la montée en température votre système se fige, alors vous avez un problème de thermie. Si cpuburn ne fait pas planter votre ordinateur au bout de 10mn, vous pouvez considérez que votre système est stable de ce coté là. Vous pouvez aussi utiliser ce test pour vérifier que vos ventilateurs d&#039;ordinateurs portable se déclenchent bien en cas de surchauffe.&lt;br /&gt;
Sur un portable récent, on obtient le résultat suivant au bout de quelques minutes de cpuburn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             80 C&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Malgré la température très élevée du processeur, le système est resté stable ce qui permet de valider qu&#039;il est capable d&#039;encaisser une montée en température élevée. Bien entendu, plus votre machine sera « chaude » plus elle s&#039;usera rapidement. Il ne faut pas oublier que les autres composants peuvent souffrir de la chaleur dégagée par le processeur par exemple : les disques durs en sont un bon exemple car les plateaux ne supportent pas la chaleur.&lt;br /&gt;
Ce test est bon aussi ? A priori, les composants de base de votre système sont en bon état, vous pouvez commencer à regarder du coté configuration logicielle.&lt;br /&gt;
&lt;br /&gt;
== APIC es tu là ? ==&lt;br /&gt;
&lt;br /&gt;
Le manque de stabilité peut aussi s&#039;expliquer par la gestion des interruptions. &lt;br /&gt;
L&#039;architecture PIC (Programmable Interrupt Controllers)  représentée par la famille de composants Intel 8259, permettait une gestion de 8 interruptions pour un unique processeur. On les associe par 2 pour obtenir les 16 niveaux d&#039;interruptions nécessaire depuis nos vieux 80286 (milieu des années 80). Avec l&#039;arrivée des systèmes multi-processeurs, l&#039;architecture APIC (Advanced Programmable Interrupt Controllers) (Intel 82093) à été ajoutée pour permettre une gestion plus fine des interruptions. En effet, dans un contexte multi-processeurs, il est nécessaire de pouvoir choisir quel processeur traitera quelle interruption pour ne pas rester figé dans l&#039;ancien modèle (PIC) où le processeur de  « boot » est assigné à un ensemble d&#039;interruptions. &lt;br /&gt;
&lt;br /&gt;
De plus, l&#039;architecture APIC apporte une gestion de 24 interruptions, une gestion de priorité des interruptions et le routage de l&#039;interruption sur le bon processeur, contre un simple routage de 2*8 interruptions dans le modèle PIC sur un seul processeur. Depuis une dizaine d&#039;années, Intel propose le modèle APIC comme nouvelle architecture, y compris pour les systèmes mono-processeurs. Les ordinateurs récents, y compris les portables, sont maintenant équipés uniquement de composants APIC même si l&#039;on peut obtenir un comportement de type PIC avec ceux-ci.&lt;br /&gt;
&lt;br /&gt;
L&#039;architecture APIC est constituée d&#039;un ou plusieurs composants situé physiquement dans le southbridge (IO-APIC), généralement un par bus, et un composant situé dans le processeur : le Local APIC (LAPIC). Le LAPIC va permettre la gestion des interruptions au niveau du processeur local. Il permet aussi de générer des interruptions par exemple pour transmettre des interruptions à des processeurs voisins dans le contexte d&#039;un système multi-processeurs, ces messages sont appelés IPI (Inter Processor Interrupts). &lt;br /&gt;
&lt;br /&gt;
De plus le Local APIC (LAPIC) inclut un « timer » de précision cadencé à la fréquence du bus, généralement il peut être utilisé par l&#039;ordonnanceur de votre système d&#039;exploitation favori ou d&#039;autres outils de haut niveau (profiler kernel : oprofile, vtune). Les LAPIC et l&#039;IO-APIC sont reliés par un bus spécifique pour permettre un échange rapide des informations. &lt;br /&gt;
Schema logique d&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les IO-APIC vont donc se charger de collecter les interruptions provenant des périphériques systèmes et d&#039;en assurer le transfert vers le ou les processeur(s) suivant une route préalablement programmée par le BIOS et/ou le système d&#039;exploitation.&lt;br /&gt;
&lt;br /&gt;
Cependant, l&#039;implémentation des APIC dans les BIOS peut provoquer certaines instabilités sur votre système Linux. Par expérience, il n&#039;y a pas de règle pour trouver la configuration qui peut aider votre machine à se stabiliser car cela dépend de chaque machine. Des différences peuvent même exister entre  deux versions de BIOS d&#039;un même ordinateur. Cependant, dans la série 2.6 du noyau Linux et les version 2.4 récentes nous disposons d&#039;outils permettant de re-paramétrer cette configuration en activant/désactivant les IO-APIC ou les LAPIC.&lt;br /&gt;
&lt;br /&gt;
Chaque composant possède un activateur ou un inhibiteur, on aura donc d&#039;un coté « apic » et « noapic » pour la gestion des IO-APIC, « nolapic » et « lapic » de l&#039;autre pour la gestion des LAPIC. Ces 4 options sont à utiliser sur la ligne de commande du noyau, c&#039;est à dire au moment où le « bootloader » (lilo ou grub par exemple) va charger le noyau en mémoire. L&#039;utilisation de « apic » et « lapic » permet d&#039;activer ces composants qui ne l&#039;ont pas été par le BIOS. L&#039;activateur « apic » n&#039;est disponible que les architectures de type x86_64 car celui-ci est déjà activé sur les systèmes de type x86. On désactivera les APIC dans le cas où le système affiche des messages d&#039;erreurs sur les APIC comme : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;« APIC error on CPU0: 40(40) »&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ou&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;MP-BIOS bug: 8254 timer not connected to IO-APIC&lt;br /&gt;
failed.&lt;br /&gt;
timer doesn&#039;t work through the IO-APIC - disabling NMI Watchdog!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La désactivation des IO-APIC permet par exemple de corriger le comportement parfois récalcitrant de certaines cartes vidéos qui ne parviennent pas à afficher correctement en mode 2D/3D (écran noir par exemple).&lt;br /&gt;
&lt;br /&gt;
La non activation des LAPIC peut avoir comme conséquence un dysfonctionnement de l&#039;ACPI (gestion d&#039;énergie avancée). Ce cas est traité par le noyau, vous retrouverez dans les messages de démarrage la ligne suivante : « &amp;quot;Local APIC disabled by BIOS you can enable it with lapic ».&lt;br /&gt;
&lt;br /&gt;
Pour résumer, si votre machine, en général à architecture mono-processeur, a tendance à se bloquer lors de l&#039;utilisation de périphériques tels que le port usb, la carte graphique ou la carte son, essayez de désactiver le LAPIC puis l&#039; IO-APIC puis les 2.  Pour exemple, les cartes mère A7N8X de chez Asus ont largement tendance à se bloquer si l&#039;on ne spécifie pas « nolapic » lors du boot. Sur certaines machines, il faudra faire le contraire à savoir forcer l&#039;activation des LAPIC. Ceci dépendra de votre machine et de sa conception.&lt;br /&gt;
&lt;br /&gt;
== A vos marques, rebootez ! ==&lt;br /&gt;
&lt;br /&gt;
Certains machines peuvent présenter quelques soucis pour redémarrer. Encore une fois, on retrouve au coeur de ce problème l&#039;interaction entre le noyau et le matériel notamment l&#039;ACPI. Les ordinateurs portables dont le modèle HP nc6120 ont par exemple le bon goût de rester bloqués sur le message « No reboot fixup found for your hardware ». Ceci indique que le noyau ne connaît pas de contournement pour ce matériel (ce qui est le cas de la quasi totalité des ordinateurs) mais puisque vous voyez ce message c&#039;est que votre machine n&#039;a pas réussi à rebooter. Heureusement, il existe des contournements pour permettre un redémarrage plus « bas niveau ». Le noyau défini les modes suivants : « b » « c » « h » « s » et « w ».&lt;br /&gt;
Le mode de reboot peut être défini sur la ligne de commande du noyau suivant la forme « reboot=&amp;lt;mode&amp;gt; ». Le mode « s » est réservé au systèmes multi-processeurs, elle va réinitialiser chacun des processeurs.&lt;br /&gt;
&lt;br /&gt;
Le mode « b » permet quant à lui de rebooter en faisant un appel direct au bios qui se chargera de faire redémarrer la machine. Ce mode fonctionne plutôt bien car dans le cas d&#039;un BIOS posant problème sur l&#039;ACPI, on peut espérer avoir un reboot correct. C&#039;est le cas sur de notre portable cité précédement.&lt;br /&gt;
&lt;br /&gt;
Le mode « h » se chargera de faire redémarrer la machine en réinitialisant le processeur. C&#039;est l&#039;équivalent du mode « s » pour les environnements mono-processeurs.  Pour finir, les modes « c » et « w » correspondent aux modes « cold » et « warn » : ces modes sont plus connus sous le nom de « reboot à froid »  et « reboot à chaud ». Le premier effectuera les tests de mémoire tandis que le second exécutera un reboot plus court.&lt;br /&gt;
&lt;br /&gt;
De manière générale, on utilisera plutôt le mode « b » ou « h » pour les systèmes mono-processeurs récalcitrant et le mode « s » pour les systèmes multi-processeurs.&lt;br /&gt;
&lt;br /&gt;
== Toujours plus de performance ==&lt;br /&gt;
Votre configuration est bien stable depuis un certain temps. Toutefois vous trouvez qu&#039;elle est un peu lente, elle ne vous donne pas satisfaction par rapport à ce qu&#039;elle devrait fournir.&lt;br /&gt;
Cette partie de l&#039;article va explorer comment vérifier et corriger les problèmes de performance des différents composants.&lt;br /&gt;
Note: certaines configuration mono-processeur nécessitent de désactiver LAPIC (nolapic)&lt;br /&gt;
&lt;br /&gt;
=== Le disque dur ===&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le disque dur semble un peu lent et pénalise le système dans son ensemble. Hdparm est là pour vous aider à y voir plus clair. Hdparm est à l&#039;origine conçu pour les systèmes de disques IDE de type PATA. Le nouveau système de disque SATA, ne permet pas toujours en fonction de l&#039;implémentation, l&#039;appel à toutes ces astuces. Cependant les nouvelles séries de kernel à partir du 2.6.15 devrait permettre une gestion plus unifiée des systèmes de disques PATA et SATA.&lt;br /&gt;
&lt;br /&gt;
Le test « hdparm -t /dev/&amp;lt;mon_device&amp;gt; » permet de tester la vitesse de lecture depuis le disque dur jusqu&#039;en mémoire. Une valeur de 25Mo/sec est un minimum pour des machines récentes. Plusieurs paramètres peuvent influencer les performances d&#039;un disque IDE. &lt;br /&gt;
La commande « hdparm -cd » permet de vérifier que les entrées/sorties sont réalisées en 16-bit (le mode 32-bit n&#039;offre pas de performance supplémentaire) alors que le DMA (Direct Memory Access) est activé. Ceci permet la minimisation de l&#039;utilisation du processeur pendant les accès au disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -cd /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
 IO_support   =  0 (default 16-bit)&lt;br /&gt;
 using_dma    =  1 (on)&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande « hdparm -c0d1 /dev/&amp;lt;mon_device&amp;gt; » permet de configurer le périphérique dans ce mode. Le noyau de votre distribution Linux devrait le réaliser de manière automatique.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -I » permet d&#039;obtenir plus d&#039;informations sur la configuration de votre disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -I /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
ATA device, with non-removable media&lt;br /&gt;
	Model Number:       FUJITSU MHT2040AT                       &lt;br /&gt;
	Serial Number:      NN77T3C13KB9&lt;br /&gt;
	Firmware Revision:  0022    &lt;br /&gt;
Standards:&lt;br /&gt;
	Used: ATA/ATAPI-6 T13 1410D revision 3a &lt;br /&gt;
	Supported: 6 5 4 3 &lt;br /&gt;
Configuration:&lt;br /&gt;
	Logical		max	current&lt;br /&gt;
	cylinders	16383	16383&lt;br /&gt;
	heads		16	16&lt;br /&gt;
	sectors/track	63	63&lt;br /&gt;
	--&lt;br /&gt;
	CHS current addressable sectors:   16514064&lt;br /&gt;
	LBA    user addressable sectors:   78140160&lt;br /&gt;
	device size with M = 1024*1024:       38154 MBytes&lt;br /&gt;
	device size with M = 1000*1000:       40007 MBytes (40 GB)&lt;br /&gt;
Capabilities:&lt;br /&gt;
	LBA, IORDY(cannot be disabled)&lt;br /&gt;
	bytes avail on r/w long: 4	Queue depth: 1&lt;br /&gt;
	Standby timer values: spec&#039;d by Standard, no device specific minimum&lt;br /&gt;
	R/W multiple sector transfer: Max = 16	Current = 16&lt;br /&gt;
	Advanced power management level: 128 (0x80)&lt;br /&gt;
	Recommended acoustic management value: 254, current value: 254&lt;br /&gt;
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 &lt;br /&gt;
	     Cycle time: min=120ns recommended=120ns&lt;br /&gt;
	PIO: pio0 pio1 pio2 pio3 pio4 &lt;br /&gt;
	     Cycle time: no flow control=240ns  IORDY flow control=120ns&lt;br /&gt;
Commands/features:&lt;br /&gt;
	Enabled	Supported:&lt;br /&gt;
	   *	READ BUFFER cmd&lt;br /&gt;
	   *	WRITE BUFFER cmd&lt;br /&gt;
	   *	Host Protected Area feature set&lt;br /&gt;
	   *	Look-ahead&lt;br /&gt;
	   *	Write cache&lt;br /&gt;
	   *	Power Management feature set&lt;br /&gt;
		Security Mode feature set&lt;br /&gt;
	   *	SMART feature set&lt;br /&gt;
	   *	Mandatory FLUSH CACHE command &lt;br /&gt;
	   *	Device Configuration Overlay feature set &lt;br /&gt;
	   *	Automatic Acoustic Management feature set &lt;br /&gt;
	   *	SET MAX security extension&lt;br /&gt;
		Power-Up In Standby feature set&lt;br /&gt;
	   *	Advanced Power Management feature set&lt;br /&gt;
	   *	DOWNLOAD MICROCODE cmd&lt;br /&gt;
	   *	SMART self-test &lt;br /&gt;
	   *	SMART error logging &lt;br /&gt;
Security: &lt;br /&gt;
		supported&lt;br /&gt;
	not	enabled&lt;br /&gt;
	not	locked&lt;br /&gt;
		frozen&lt;br /&gt;
	not	expired: security count&lt;br /&gt;
	not	supported: enhanced erase&lt;br /&gt;
	40min for SECURITY ERASE UNIT. &lt;br /&gt;
HW reset results:&lt;br /&gt;
	CBLID- above Vih&lt;br /&gt;
	Device num = 0 determined by the jumper&lt;br /&gt;
Checksum: correct&lt;br /&gt;
[root@R1 ~]#&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On y retrouve le modèle, le numéro de série et la version du firmware qui peuvent être utiles en cas de contact avec le Service Après-Vente ou de mise à jour pour une série de firmwares défaillante.&lt;br /&gt;
&lt;br /&gt;
La ligne commençant par « DMA » dans la partie « Capabilities » permet d&#039;afficher la vitesse de transfert négociée entre le disque dur et le driver IDE de Linux. L&#039;étoile précède la valeur actuelle. Dans cet exemple, le mode udma5 est sélectionné : ceci est conforme aux machines disponibles sur le marché depuis environ 3 ans.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, voici le tableau de conversion entre le mode DMA et la vitesse maximale associée.&lt;br /&gt;
&lt;br /&gt;
Type de fonctionnement&lt;br /&gt;
Vitesse Maximale en MO/sec&lt;br /&gt;
UltraDMA 0&lt;br /&gt;
16,6&lt;br /&gt;
UltraDMA 1&lt;br /&gt;
25&lt;br /&gt;
UltraDMA 2&lt;br /&gt;
33,3&lt;br /&gt;
UltraDMA 3&lt;br /&gt;
44,4&lt;br /&gt;
UltraDMA 4&lt;br /&gt;
66,6&lt;br /&gt;
UltraDMA 5&lt;br /&gt;
100&lt;br /&gt;
UltraDMA 6&lt;br /&gt;
133,33&lt;br /&gt;
&lt;br /&gt;
Une configuration actuelle ne devrait pas être en dessous de UDMA5. Si ce n&#039;était pas le cas, on peut essayer de renégocier la vitesse de transfert à l&#039;aide de la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hdparm -X udma5 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celle-ci permet de forcer le mode UltraDMA5. Il faut utiliser cette commande avec précaution car elle pourrait générer des pertes ou de la corruption de données en cas de transfert pendant ce changement de mode.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi impacter les performances de votre disque dur en modifiant sa vitesse de rotation. Cette fonctionnalité connue sous le nom de Automatic Acoustic Management (AAM) est utilisable avec l&#039;option « -M » de hdparm. La valeur 128 représentera la vitesse la plus faible avec un disque silencieux, la valeur 254 la vitesse la plus élevée mais avec comme contre-partie un disque plus bruyant. On pourra noter des différences de quelques Mo/sec selon les configurations.&lt;br /&gt;
&lt;br /&gt;
Il est aussi à noter que l&#039;utilisation de logiciels permettant une meilleure gestion d&#039;énergie (cpufreq, laptop-mode) peut dégrader les performances d&#039;un disque dur de manière notable.&lt;br /&gt;
&lt;br /&gt;
=== Configuration bas niveau du réseau ===&lt;br /&gt;
&lt;br /&gt;
Le réseau local filaire peut parfois être un peu lent. Voici quelques tests pour vérifier si la lenteur provient du logiciel, du noyau ou du matériel. Tout d&#039;abord, explorons la trousse à outils indispensable pour analyser votre carte réseau : ethtool. Digne successeur de mii-tool, il permet de s&#039;informer sur la configuration de votre carte réseau. &lt;br /&gt;
&lt;br /&gt;
Il suffit de lancer « ethtool &amp;lt;votre_interface&amp;gt; » » pour obtenir la configuration matérielle de votre carte. On y retrouve les modes supportés par votre carte (Supported Link Modes ainsi que la vitesse actuelle (Speed), obtenue par auto-négociation dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
On peut également savoir si le câble réseau est connecté à la carte grâce à la ligne « Link Detected ». Le type de « duplex » utilisé permet également de savoir si la négociation avec l&#039; élément actif au bout de votre câble (commutateur, concentrateur ou une autre machine) a correctement fonctionné. Le duplex définit le mode de  transmission : le mode half-duplex indique que l&#039;on émet puis on reçoit des données, le mode full-duplex indique que l&#039;on peut émettre et recevoir en même temps des données. Le mode full-duplex est donc plus que recommandé pour vos équipements réseaux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# ethtool  eth1&lt;br /&gt;
Settings for eth1:&lt;br /&gt;
	Supported ports: [ TP MII ]&lt;br /&gt;
	Supported link modes:   10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Supports auto-negotiation: Yes&lt;br /&gt;
	Advertised link modes:  10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Advertised auto-negotiation: Yes&lt;br /&gt;
	Speed: 100Mb/s&lt;br /&gt;
	Duplex: Full&lt;br /&gt;
	Port: MII&lt;br /&gt;
	PHYAD: 1&lt;br /&gt;
	Transceiver: internal&lt;br /&gt;
	Auto-negotiation: on&lt;br /&gt;
	Current message level: 0x000020c1 (8385)&lt;br /&gt;
	Link detected: yes&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesurer les {contre}performances de votre réseau ===&lt;br /&gt;
&lt;br /&gt;
Une fois vérifiée la bonne configuration de votre matériel, nous pouvons passer à la vérification des performances entre deux machines.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire netpipe (http://www.scl.ameslab.gov/netpipe/) permet de réaliser des tests de performance mais aussi d&#039;intégrité entre deux machines. Il permet de tester les performances du réseau au travers la couche IP et non pas depuis un mode plus bas niveau comme pourrait l&#039;être un test utilisant directement le driver Ethernet. Ce test permet donc de valider que la configuration matérielle mais aussi logicielle est correcte.&lt;br /&gt;
&lt;br /&gt;
Sur la première machine, exécutez « NPtcp » : netpipe se positionne en mode « serveur ».&lt;br /&gt;
Sur la seconde machine, exécutez « NPtcp -h &amp;lt;machine1&amp;gt; » : netpipe se connecte au serveur netpipe de la machine nommée machine1 pour effectuer le test de performance.&lt;br /&gt;
&lt;br /&gt;
Le test par défaut teste les communication allant de 1 octet jusqu&#039;à 8 Mo. Il peut prendre plusieurs minutes si le réseau est « lent ». Le test va montrer pour chaque taille de paquet la performance obtenue. Il est normal d&#039;obtenir des performances faibles pour des paquets d&#039;une taille inférieure à 8 Ko. Transporter des petits paquets nécessite de réaliser beaucoup d&#039;opérations pour le processeur pour une quantité d&#039;information minime. Les performances seront meilleures à partir d&#039;environ 16 Ko et maximales à partir de 128 Ko. Sur un système utilisant du gigabit ethernet, on constatera une performance de 39Mbps à 256 octets, 287Mbps à 4Ko, 614Mbps à 16Ko, 845Mbps à 128Ko, 895Mbps à 8Mo.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ainsi vérifier et comparer facilement les performances de votre configuration réseau. Netpipe permet également de tester la vitesse du réseau pour une taille de paquets définie entre la taille indiqué par l&#039;option « -l » et la taille indiquée par l&#039;option « -u ». Ainsi, NPtcp -l 16384 -u 16384 permet de tester la bande passante réseau pour une taille de paquet égale à 16Ko.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -n &amp;lt;nb-cycle&amp;gt; » permet de définir le nombre de boucles à réaliser pour le test (50 par défaut). Enfin, pour réaliser des tests « full-duplex », on utilisera l&#039;option « -2 ». Ce test permet de s&#039;assurer du bon fonctionnement du mode de communication permettant l&#039;écriture et la lecture simultanées.&lt;br /&gt;
&lt;br /&gt;
Attention, même si ce test donne de bons résultats, cela ne veut pas dire que la configuration est exempte d&#039;erreur de configuration. Par exemple, les performances réseaux peuvent être très bonnes en point à point mais mauvaises lorsque l&#039;on aura une charge réseau avec plusieurs clients. Dans cette situation, il faut vérifier que le contrôle de flux est bien activé sur toutes les machines. L&#039;option « ethtool -a » permet de vérifier que les champs « rx » et « tx » sont placés sur « on ». Si ce n&#039;était pas le cas activez-les avec la commande « ethtool -A eth0 rx on » et « ethtool -A eth0 tx on ».&lt;br /&gt;
&lt;br /&gt;
Les cartes réseaux, des serveurs essentiellement, permettent maintenant de réaliser le « tcp segment offload ». Cette technique permet de décharger une partie du traitement TCP directement dans l&#039;électronique de la carte réseau. Ceci à pour effet de décharger le processeur central d&#039;un traitement fastidieux. L&#039;option « -k » d&#039;ethtool permet de consulter l&#039;état de cette fonctionnalité (off/on). On pourra l&#039;activer sur des serveurs générant un gros trafic réseau par exemple : « ethtool -K eth0 tso on ».&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant équipé de nouveau outils pour traquer la perte de performances de votre installation réseau. Ceci couplé aux habituels tcpdump/ethereal, voilà une belle panoplie du zorro du réseau.&lt;br /&gt;
&lt;br /&gt;
=== Quand la latence s&#039;en mêle ===&lt;br /&gt;
&lt;br /&gt;
La latence représente le temps nécessaire à un système pour prendre en compte un événement.&lt;br /&gt;
&lt;br /&gt;
Il arrive que certains périphériques de votre machine nécessitant des débits importants ou une latence assez faible sur le bus PCI soient « poussifs ». On retrouve dans cette catégorie les cartes vidéos accélératrice 3D, les cartes son et les cartes d&#039;acquisition firewire ou DVB (récepteur de télévision numérique terrestre : TNT).&lt;br /&gt;
&lt;br /&gt;
Un périphérique branché sur le bus PCI doit attendre que le bus soit libre pour émettre les données vers la mémoire centrale. Le bus PCI qui est le coeur de communication des périphériques est donc soumis en permanence à un arbitrage qui permet de décider qui doit émettre des données et qui doit attendre. Cet arbitrage est en partie réalisé grâce au « latency_timer ».&lt;br /&gt;
&lt;br /&gt;
Chaque périphérique possède une valeur de « latency_timer » comprise en 0 et 248 cycles d&#039;horloge du bus. Plus la valeur sera importante plus le périphérique disposera de temps pour transmettre des informations. Une latence de 248 cycles permet d&#039;obtenir une priorité forte sur le bus, ce qui permet un débit important. A contrario, une latence de 0 indiquera au périphérique qu&#039;il doit cesser ses transmissions si un autre composant à besoin du bus : ceci se traduira par une perte de bande passante importante.&lt;br /&gt;
&lt;br /&gt;
La configuration réalisée par défaut sur votre machine doit être correcte mais il peut arriver qu&#039;une carte 3D ou DVB soit configurée avec une latence trop faible, ce qui  aurait pour conséquence d&#039;offrir une image saccadée et peu fluide. Une carte son offrirait également le même type de symptômes avec un son hâché ou excessivement métallique.&lt;br /&gt;
&lt;br /&gt;
Heureusement, une série d&#039;outils est là pour vous aider à diagnostiquer le problème mais aussi à le résoudre. Le projet pciutils  (http://atrey.karlin.mff.cuni.cz/~mj/linux.shtml#pciutils) contient deux outils indispensables: lspci et setpci. Bien entendu, votre distribution favorite devrait posséder ce logiciel, il vous suffira de l&#039;installer avec  votre gestionnaire de paquet favori (urpmi, apt, smart).&lt;br /&gt;
&lt;br /&gt;
La commande « lspci » vous permet de lister les périphériques PCI disponibles sur votre ordinateur (cf article paru dans le numéro 68).  Cet exemple se basera sur une carte vidéo  ayant pour adresse sur le bus PCI « 01:00.0 ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@lagirafe] lspci -v -s 01:00.0&lt;br /&gt;
01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go5200 32M/64M] (rev a1) (prog-if 00 [VGA])&lt;br /&gt;
	Subsystem: Samsung Electronics Co Ltd: Unknown device c00f&lt;br /&gt;
	Flags: bus master, 66Mhz, medium devsel, latency 16, IRQ 11&lt;br /&gt;
	Memory at c8000000 (32-bit, non-prefetchable) [size=16M]&lt;br /&gt;
	Memory at d8000000 (32-bit, prefetchable) [size=128M]&lt;br /&gt;
	Expansion ROM at &amp;lt;unassigned&amp;gt; [disabled] [size=128K]&lt;br /&gt;
	Capabilities: [60] Power Management version 2&lt;br /&gt;
	Capabilities: [44] AGP version 3.0&lt;br /&gt;
[root@lagirafe]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On retiendra dans cette ligne, la valeur &#039;latency 16&#039;. Ceci risque de poser problème lorsque celle-ci aura besoin d&#039;un fort débit pendant un jeu par exemple. Augmenter la latence va donc se révéler nécessaire pour ce périphérique.&lt;br /&gt;
&lt;br /&gt;
La commande setpci permet de modifier les paramètres PCI d&#039;un périphérique ou d&#039;un bus complet avec tous ses périphériques. &lt;br /&gt;
&lt;br /&gt;
La commande « setpci -v -d 01:* latency_timer=20 » permet de positionner tous les périphériques  du bus 01 à une valeur de 32 cycles. Il est à noter que la commande setpci utilise des valeurs en hexadécimal mais lspci affichera les valeurs en décimal.&lt;br /&gt;
&lt;br /&gt;
Pour en revenir à nos moutons, la correction de la latence de cette carte graphique se fera avec la commande «  setpci -v -d 01:00.0 latency_timer=f8 ». Ceci positionne donc la carte sur la plus grande valeur de latence possible, ce qui lui garantira la plus grande bande passante possible. Il est possible d&#039;utiliser la valeur « ff » comme paramètre pour « latency_timer » mais celui-ci sera converti à la volée par la commande setpci en « 0xf8 ».&lt;br /&gt;
&lt;br /&gt;
Attention, certains composants de votre machine doivent rester en « latency_timer=0 » pour garantir une bon fonctionnement de votre système : il ne faudra donc pas modifier les latences des contrôleurs mémoire et des ponts PCI connectés généralement sur le bus « 0:* ».&lt;br /&gt;
&lt;br /&gt;
== DSDT : le cauchemar continue ! ==&lt;br /&gt;
&lt;br /&gt;
Cette partie de l&#039;article a pour but d&#039;expliquer le problème que peut représenter la table DSDT pour un certain nombre de machines et surtout les ordinateurs portables. &lt;br /&gt;
&lt;br /&gt;
La norme ACPI 3.0 de Septembre 2004 disponible gratuitement à l&#039;adresse http://www.acpi.info/DOWNLOADS/ACPIspec30.pdf définit la DSDT comme une table remplie par un OEM permettant au système d&#039;exploitation de découvrir les ressources pour la gestion de l&#039;énergie avancée, de la gestion thermique ainsi que la gestion du Plug&#039;nPlay des ressources définies par l&#039;ACPI.&lt;br /&gt;
&lt;br /&gt;
Voici une description certes un peu théorique mais nécessaire pour bien comprendre la problématique et ses conséquences. Le constructeur de l&#039;ordinateur doit donc définir dans le BIOS une table contenant une liste de ressources et leurs configuration et ce pour que le système d&#039;exploitation puisse s&#039;en servir. Noble cause n&#039;est il pas ? Tout au long des 618 pages de ce document sont spécifiés les éléments du langage à utiliser ainsi que sa syntaxe. L&#039; « ACPI Source Language » permettra donc aux développeurs d&#039;écrire des DSDT puis de les compiler dans un format nommé « ACPI Machine Language » en utilisant un compilateur adéquat. Le système d&#039;exploitation utilisera la table compilée (AML) pour accéder aux ressources ACPI. &lt;br /&gt;
Sur la plupart des ordinateurs portables, la table DSDT ne respecte pas la norme ACPI dans sa syntaxe. Ceci est très gênant car cela bloque le code de l&#039;interpréteur ACPI du noyau Linux qui essaie de la lire. Le résultat est sans appel, pas d&#039;ACPI, pas de gestion d&#039;énergie avancée, plus de ventilation automatique sur certains modèles d&#039;ordinateurs, plus de touche de gestion de contraste/luminosité sur d&#039;autres etc...&lt;br /&gt;
&lt;br /&gt;
Ceci est très gênant sur un ordinateur portable. Alors que faire ? Dans un premier temps, prévenir le constructeur que son BIOS est incorrect et ne respecte pas la norme ACPI. La réponse se fait toujours attendre pour tous ceux qui « osent » poser la question au support technique : à savoir, les constructeurs ignorent tout simplement les mails de ce type.&lt;br /&gt;
La seconde étape puisque vous êtes devant le fait accompli d&#039;une machine non conforme, il va falloir corriger cette table. Il suffit de récupérer la table actuelle via la commande &#039;cat /proc/acpi/dsdt &amp;gt; dsdt.aml&#039; si vous avez la chance d&#039;avoir un répertoire /proc/acpi malgré une table DSDT endommagée, sinon utilisez la commande &#039;acpidump -b -t dsdt -o dsdt.aml&#039;. La commande acpidump est  fournit dans le projet pmtools (ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools-20050926.tar.bz2) &lt;br /&gt;
Vous avez donc extrait la table DSDT de votre système. Il ne reste plus qu&#039;à essayer de la recompiler. Pour cela, le compilateur IASL de la société Intel (http://developer.intel.com/technology/iapc/acpi/downloads.htm) offre sous Linux et Windows une plate-forme de compilation pour le langage ASL.&lt;br /&gt;
&lt;br /&gt;
Suivez les instructions du site pour télécharger et compiler la version unix d&#039;iasl. Ensuite, décompilez la table avec la commande « iasl -d dsdt.aml ». Le fichier dsdt.dsl vient d&#039;être créé par le décompilateur. Il suffit de le recompiler avec la commande « iasl -tc dsdt.dsl » pour constater les dégâts ! La DSDT que vous avez dans votre BIOS est généralement compilée par le compilateur de Microsoft qui semble autoriser une syntaxe plus qu&#039;approximative.&lt;br /&gt;
Si vous avez de la chance, votre DSDT s&#039;est recompilée sans erreurs, vous obtenez donc un fichier dsdt.hex et un fichier dsdt.aml. Il ne reste plus qu&#039;à injecter cette dsdt dans le noyau Linux et le tour sera joué.&lt;br /&gt;
&lt;br /&gt;
Si vous avez moins de chance, votre DSDT est syntaxiquement incorrecte et génère des erreurs. Les expliquer plus en détails nécessiterait un article complet, il ne sera cité que les plus « habituelles » (sic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2626:                     Field (ECR, DWordAcc, Lock, Preserve) &lt;br /&gt;
Error    1048 -                              ^ Host Operation Region requires ByteAcc access &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette erreur présente à ligne 2626 du fichier dsdt.asl indique une erreur de type dans la déclaration du champ ECR. Il suffit dans ce cas de changer le mot « DWordAcc » par « ByteAcc ». Celle-ci reste assez simple à corriger, on se demande donc pourquoi les constructeurs ne prennent pas le temps de vérifier et de corriger leur BIOS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2672:                     Method (_GLK, 1, NotSerialized) &lt;br /&gt;
Warning  2024 -                                ^ Reserved method has too many arguments ( _GLK requires 0) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode _GLK n&#039;a besoin que de 0 paramètre tandis que ce code en utilise 2 ! La correction est assez simple : il suffit de remplacer la ligne 2672 par « Method(_GLK) ».&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur la correction des erreurs de compilation de votre table dsdt, je vous recommande les tutoriaux disponibles depuis la page http://acpi.sourceforge.net/dsdt/index.php du projet ACPI.&lt;br /&gt;
&lt;br /&gt;
Votre DSDT est compilée avec succès, il ne vous reste plus qu&#039;à l&#039;ajouter pour que votre noyau puisse l&#039;utiliser à la place de celle fourni par le BIOS (modifiable uniquement par le constructeur, via une mise à jour).&lt;br /&gt;
&lt;br /&gt;
Il existe trois possibilités pour inclure une table DSDT : la modification du noyau Linux ( noyau &amp;lt; 2.6.9), l&#039;injection de la DSDT dans la configuration du noyau (noyau &amp;gt;= 2.6.9), l&#039;intégration de la table DSDT dans l&#039;initrd qui nécessite un patch kernel disponible à l&#039;adresse http://gaugusch.at/kernel.shtml.&lt;br /&gt;
&lt;br /&gt;
Pour les noyaux 2.6.9 et supérieur, copiez votre fichier dsdt.hex sous le nom «/usr/src/linux/include/acpi/dsdt_table.h » puis reconfigurez votre noyau.&lt;br /&gt;
Insérer « dsdt_table.h » dans l&#039;option « Include you custom DSDT » disponible dans le menu « Power Management/ACPI/ ». Recompilez votre noyau et redémarrez avec votre nouveau noyau.&lt;br /&gt;
Pour les noyaux inférieurs à 2.6.9, il est possible de modifier le code source de votre noyau pour intégrer votre DSDT mais il est préférable d&#039;utiliser le patch permettant l&#039;insertion de la table DSDT dans l&#039;initrd. Recompilez votre noyau avec ce patch, puis suivez la procédure décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Certaines distributions Linux comme « Mandriva Linux » possèdent le patch qui permet de n&#039;avoir qu&#039;à reconstruire l&#039;initrd avec la commande « mkinitrd –dsdt=/boot/dsdt.aml /boot/initrd-`uname -r`.img `uname -r`  » puis de relancer lilo avant de redémarrer votre machine. Lors du démarrage de celle-ci vous devriez voir le message suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ACPI: Looking for DSDT in initrd... found (at offset 0x4f8d9).&lt;br /&gt;
ACPI-0294: *** Info: Table [DSDT] replaced by host OS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant avec une table DSDT correcte et un ACPI fonctionnel. La question qui reste ouverte est pourquoi les constructeurs n&#039;utilisent pas un compilateur digne de ce nom pour permettre à leur clients de pouvoir utiliser d&#039;autres systèmes d&#039;exploitation que Windows de Microsoft. &lt;br /&gt;
&lt;br /&gt;
Pour la petite histoire, si vous cherchez dans votre dsdt vous risquez de tomber ce genre de lignes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows NT&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft WindowsME: Millennium Edition&amp;quot;), Zero))&lt;br /&gt;
 If (LEqual (SizeOf (\_OS), 0x27)) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque qu&#039;un système d&#039;exploitation souhaite utiliser les ressources ACPI du BIOS, il utilise son nom de système d&#039;exploitation (acpi_os_name). On retrouve donc dans les bios des parties qui ne seront exécutées que pour certains systèmes d&#039;exploitation de Microsoft. On retrouve même certains tests où c&#039;est la longueur du nom qui compte...... Ceci prouve bien que les constructeurs d&#039;ordinateurs savent corriger des tables DSDT pour les systèmes d&#039;exploitation mais pas forcément pour le notre malheureusement. Depuis le noyau 2.6.9, le noyau Linux utilise « Windows NT » comme « acpi_os_name »  pour assurer une meilleure compatibilité matérielle dixit Len Bron d&#039;Intel dans le changelog de cette version.&lt;br /&gt;
&lt;br /&gt;
== Comment trouver le pilote qui va avec votre matériel ? ==&lt;br /&gt;
&lt;br /&gt;
Cette question on se la pose souvent mais uniquement lorsque l&#039;on essaye de brancher un nouveau périphérique sur sa machine. Les distributions récentes permettent de détecter automatiquement votre matériel et de lui associer un pilote avec sa configuration. Ce mécanisme fonctionne plutôt bien mais cela n&#039;évite pas les dysfonctionnements voir l&#039;absence de fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Pour vérifier si votre noyau Linux est capable de supporter un nouveau périphérique PCI par exemple, il suffit d&#039;en récupérer les identifiants PCI (constructeur et produit) puis de les rechercher dans le fichier « /lib/modules/`uname -r`/modules.pcimap » qui est auto-généré lors de la commande depmod.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire « lspcidrake -v » vous permet de trouver les identifiants PCI de votre carte, la commande « lspci » vous permet de trouver le nom de votre périphérique puis faites un « lspci -n » pour en trouver la correspondance numérique. On utilisera la position du périphérique sur le bus pour retrouver la correspondance numérique « 02:05.0 » dans cet exemple.&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome] lspci&lt;br /&gt;
[....]&lt;br /&gt;
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)&lt;br /&gt;
[root@pumphome] lspci -n&lt;br /&gt;
[...]&lt;br /&gt;
02:05.0 Class 0200: 14e4:4401 (rev 01)&lt;br /&gt;
[root@pumphome]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi cette carte réseau possède les identifiants 14e4 (constructeur) et 4401 (produit). Il suffit de rechercher cette valeur dans le modules.pcimap, ce qui nous donnera la correspondance en module (pilote).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome]  grep &amp;quot;0x000014e4 0x00004401&amp;quot; /lib/modules/2.6.12-12mdk-i686-up-4GB/modules.pcimap &lt;br /&gt;
b44               0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
bcm4400      0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit ici que cette carte peut utiliser le driver b44 ou le driver bcm4400. On ne trouve pas toujours les identifiants PCI de produit sous leur forme directe, on peut également trouver « 0Xffffffff » qui indique que tous les cartes du constructeur sont gérées par un module.&lt;br /&gt;
Il ne vous restera plus qu&#039;à effectuer la configuration associée à ce périphérique pour qu&#039;il fonctionne correctement.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
La fin de cet article conclut une toute petite série de deux articles ayant pour but de vulgariser l&#039;architecture de nos machines, de découvrir les outils disponibles pour mieux comprendre leur configuration et au besoin régler les problèmes de configuration matérielle qui ont souvent le don de nous pourrir la vie.&lt;br /&gt;
&lt;br /&gt;
Merci à LaurentJ de #Mandrivafr pour ses tests complémentaires sur les problèmes d&#039;IO-APIC. Un énorme merci à Nicolas Planel pour sa relecture pointue et également Anne pour sa patience de girafe à relire et « quaurigé »mes « photes »,  ainsi qu&#039;à tous ceux qui m&#039;ont aidé à découvrir ce que je restitue dans cet article.&lt;br /&gt;
&lt;br /&gt;
Cet article a été publié dans Linux Magazine France n°78. Il est publié sur Léa avec l&#039;aimable autorisation de l&#039;éditeur.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Fichier:Memtest.jpg&amp;diff=12775</id>
		<title>Fichier:Memtest.jpg</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Fichier:Memtest.jpg&amp;diff=12775"/>
		<updated>2006-06-11T20:26:01Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12774</id>
		<title>Découvrez les ressources de votre machine (La suite)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12774"/>
		<updated>2006-06-11T20:19:53Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* La mémoire qui flanche ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Découvrez les ressources de votre machine (La suite) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A nouvelle année, nouvelles résolutions ! Paru dans le numéro 68, un premier article dédié à la découverte des outils disponibles pour la récupération des configurations de votre machine promettait une suite.  Je vous propose donc de reprendre ce voyage au centre de votre ordinateur. &lt;br /&gt;
&lt;br /&gt;
Cet article sera articulé autour du diagnostic de pannes et des correctifs associés mais aussi de « trucs &amp;amp; astuces » permettant d&#039;optimiser votre configuration.&lt;br /&gt;
&lt;br /&gt;
== Savez-vous planter les choux ? ==&lt;br /&gt;
&lt;br /&gt;
Les choux peut-être pas mais les ordinateurs je pense que c&#039;est arrivé au moins une fois à chaque lecteur qui lit cet article. Rien de plus énervant qu&#039;un écran qui se fige, le pointeur de souris qui ne se déplace plus, le clavier qui ne répond plus non plus.... Planté ! Ce constat est assez facile à établir mais en trouver la cause reste un problème nettement plus complexe tellement le nombre de causes possibles est important.&lt;br /&gt;
&lt;br /&gt;
Deux solutions : ignorer le problème et relancer le système en se disant que ça « passera », ou alors chercher la cause du problème en essayant de trouver une méthode reproduisant le « plantage » tant redouté.&lt;br /&gt;
&lt;br /&gt;
La première solution fonctionne assez bien mais si l&#039;on à faire à un « vrai » problème de configuration matérielle ou logicielle, on arrivera assez vite à ne plus pouvoir éviter la seconde voire la troisième. J&#039;allais oublier cette troisième solution destinée aux plus riches d&#039;entre vous : changer de matériel. Cette solution coûteuse peut parfois se révéler efficace, parfois pas du tout. A quoi bon changer un composant sans savoir si c&#039;était bien celui-ci qui posait problème ?&lt;br /&gt;
Quelque soit la solution retenue, il sera de toute manière nécessaire de localiser la panne pour y apporter la réponse adéquate. Certaines sociétés ou particuliers se sont spécialisés dans ce dépannage ou l&#039;utilisateur est « dépassé » par les événements.&lt;br /&gt;
&lt;br /&gt;
Cet article vous fera, je l&#039;espère, découvrir quelques outils et méthodes pour valider un par un les composants de votre ordinateur. Cela vous permettra j&#039;espère d&#039;être un peu moins dépourvu quand un problème surviendra. L&#039;article reproduira les étapes qu&#039;il faut suivre pour isoler le « fautif ».&lt;br /&gt;
&lt;br /&gt;
== Les causes possibles d&#039;un « plantage » ==&lt;br /&gt;
&lt;br /&gt;
On retrouve deux grandes catégories de pannes provoquant des dysfonctionnements importants sur un système informatique.&lt;br /&gt;
* une panne du matériel&lt;br /&gt;
* une erreur logicielle au niveau du noyau et des pilotes (drivers)&lt;br /&gt;
&lt;br /&gt;
Il faudra donc être capable de séparer la panne matérielle qui « force » l&#039;ordinateur à entrer dans un mode de fonctionnement non prévu et instable, de l&#039;erreur logicielle qui équivaut à demander à l&#039;ordinateur de faire « n&#039;importe quoi » et qui va donc se « planter ».&lt;br /&gt;
&lt;br /&gt;
Le terme « planté » utilisé ici équivaut à un arrêt du système à cause d&#039;erreurs sévères : instruction illégale ou composants défaillants. Le terme de « plantage » est aussi utilisé pour décrire le fonctionnement d&#039;une application qui se ferme inopinément. Ce cas est plus souvent lié à une erreur de programmation de l&#039;application qu&#039;à une erreur du système. Nous ne parlerons donc pas de ce second cas dans cet article.&lt;br /&gt;
&lt;br /&gt;
== La mémoire qui flanche ? ==&lt;br /&gt;
&lt;br /&gt;
Une cause « classique » des dysfonctionnements se situe au niveau de la gestion de la mémoire de votre machine. Je ne parle pas d&#039;allocation mémoire réalisée par votre système d&#039;exploitation favori mais bien de la manière avec laquelle la carte mère configure et utilise vos barrettes de mémoire. Les applications chargent en mémoire des données et des instructions destinées au processeur. Voici un scénario qui peut provoquer l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Votre application favorite est lancée depuis la ligne de commande ou une interface graphique via un « clic » de souris. Votre système d&#039;exploitation va donc charger ce programme en mémoire puis en exécuter les instructions. Au plus bas niveau de votre système, le processeur exécute des instructions en langage machine (assembleur) présente en mémoire.&lt;br /&gt;
Malheureusement, votre mémoire est défaillante et elle n&#039;arrive pas à maintenir un état stable des informations qui lui sont confiées. Par exemple, la lettre C est représentée par le code 67, ou « 1000011 » en binaire. Si la zone mémoire change d&#039;état, alors le contenu de la valeur stocké à cet endroit changera : on pourrait se retrouver avec « 1000010 ». Un seul bit a changé, mais on passe de la lettre &#039;C&#039; (67) à la lettre &#039;B&#039;(66). Le résultat ne se fait pas attendre, le processeur se retrouve à exécuter des instructions qui n&#039;ont plus de sens, provoquant l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Les pannes de mémoires sont généralement dues à des composants endommagés, des barrettes incompatibles ou un  « timing d&#039;accès » à la mémoire (nommé CAS (Column Address Strobe) dans la plupart des BIOS) trop agressif permettant des lectures dans des zones mémoires avant que les écritures aient eu le temps de se stabiliser pour en garantir le contenu.&lt;br /&gt;
&lt;br /&gt;
Il est assez simple de valider votre configuration mémoire grâce à l&#039;utilitaire memtest (http://www.memtest.org). Cet utilitaire de taille très modeste, 96 Kilo-octets, est écrit en assembleur ce qui lui permet de s&#039;exécuter indépendamment du système d&#039;exploitation. Ceci garantit un test « proche » du matériel, sans sur-couche pouvant apporter d&#039;autres problèmes. &lt;br /&gt;
La version 1.65 actuelle est téléchargeable sous deux formes : une iso que l&#039;on peut graver sur un CDRW de préférence vu la petite taille du programme ou sous la forme d&#039;une amorce système (pre-compiled bootable binary). Il suffira de décompresser l&#039;archive puis d&#039;exécuter la commande suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;dd if=memtest.bin of=/dev/fda&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Ceci écrasera le contenu de votre disquette pour y  copier memtest. Rebootez l&#039;ordinateur avec la disquette placée dans le lecteur, memtest devrait se lancer. &lt;br /&gt;
&lt;br /&gt;
[[Image:memtest.jpg]]&lt;br /&gt;
&lt;br /&gt;
La figure 1, est une capture d&#039;écran de memtest en fonctionnement. Le barre de progression principale affichée en haut à droite de l&#039;écran (2% dans cet exemple) permet de suivre la progression du test. Les erreurs apparaissent dans la partie inférieure de l&#039;écran. Il suffit de laisser fonctionner memtest au moins une fois jusqu&#039;à 100%. Si aucune ligne ne s&#039;est affichée alors vou pouvez considérer que la mémoire est fonctionnelle. Dans le cas contraire,  il faudra soit procéder à son remplacement s&#039;il s&#039;agit d&#039;une seule barrette mémoire, soit tester les barrettes indépendamment (l&#039;une puis l&#039;autre) avec ce logiciel. Dans le cas de 2 ou 3 barrettes qui ne fonctionnement pas correctement ensemble mais qui fonctionnement correctement individuellement, il faudra vérifier qu&#039;elles sont bien de même modèle/marque et remettre le Bios dans une configuration initiale.&lt;br /&gt;
&lt;br /&gt;
Votre mémoire est bonne ? Testons les autres composants de votre machine pour traquer la source de ce plantage.&lt;br /&gt;
&lt;br /&gt;
== Il ne fait pas un peu chaud là ? ==&lt;br /&gt;
&lt;br /&gt;
Ces dix dernières années la puissance consommée et dissipée par nos ordinateurs a littéralement explosé ! Du 486 qui ne nécessitait quasiment pas de ventilateur, on est arrivé à des stations de travail/jeu avec des alimentations pouvant atteindre 1KiloWatt pour les dernières et 500watt pour des modèles plus « grand public ». Le processeur est un des composants gourmands de la machine. Certains modèles peuvent consommer plus de 130W ! Autant dire que si le système est mal ventilé, la montée en charge du processeur peut provoquer un échauffement important provoquant une surchauffe de celui-ci. S&#039;il dépasse ces caractéristiques de fonctionnement, il va alors exécuter du code incorrect provocant  un plantage du système.&lt;br /&gt;
&lt;br /&gt;
Un bon test pour vérifier que votre processeur n&#039;est pas la cause de votre instabilité : commencez par relever la température de votre machine au repos à l&#039;aide des informations fournies soit par l&#039;acpi soit pas lm_sensors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[erwan@R1 ~]$ cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             42 C&lt;br /&gt;
[erwan@R1 ~]$ &lt;br /&gt;
&lt;br /&gt;
[root@konilope ~]# sensors | grep Temp&lt;br /&gt;
M/B Temp:    +39°C  (low  =   +15°C, high =   +40°C)   sensor = thermistor   &lt;br /&gt;
CPU Temp:   +127°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
Temp3:       +44°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
[root@konilope ~]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode utilisant lm_sensors nécessite une interprétation de la part de l&#039;utilisateur. Dans cet exemple, il apparaît évidant que le processeur ne peut avoir une température de fonctionnement aussi élevée (127°C). L&#039;erreur est du à un mauvais calcul de la part de lm_sensors. Il se base sur le type de capteurs thermiques utilisé par la carte mère pour calculer la température des différents composants. Malheureusement, le montage électrique autour du capteur de température peut varier d&#039;un modèle de carte à un autre, ce qui fausse les calculs. On considéra donc, que pour cette machine (konilope) sa température se situe aux alentours de 42° : valeur moyenne entre les deux valeurs « cohérentes » relevées par lm_sensors. On pourra cependant vérifier cette approximation en relevant la température du disque sur à l&#039;aide de smartmontools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# smartctl -A /dev/hda | grep Temperature&lt;br /&gt;
194 Temperature_Celsius     0x0022   042   052   000    Old_age   Always       -       42&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, il est préférable de maintenir sa machine en dessous des 55° et celle de son processeur en dessous de 70°C. Au delà, le système risque d&#039;être instable. Si ce n&#039;est pas le cas, effectuez les modification nécessaire pour y parvenir : meilleure ventilation du processeur ou du boîtier par exemple.&lt;br /&gt;
&lt;br /&gt;
Ensuite, téléchargez l&#039;utilitaire cpuburn depuis un mirroir  (http://pages.sbcglobal.net/redelm/cpuburn_1_4_tar.gz)  ou depuis votre distribution linux favorite (oui, oui, urpmi cpuburn ça fonctionne ;o)).&lt;br /&gt;
&lt;br /&gt;
Vous y trouverez plusieurs programmes nommés burnXX ou XX représente votre processeur. La version P6 sera à utiliser sur les processeurs Intel Pentium 4, la version K7 pour les processeurs Athlon x86. Pour les processeurs plus récents, utilisez la version P6.&lt;br /&gt;
Ce logiciel réalise des boucles en langage assembleur ayant pour but de stresser votre processeur de manière importante et donc le faire chauffer. Lancez cpuburn autant de fois que vous avez de processeur sur votre machine puis observez la température de votre machine. Si lors de la montée en température votre système se fige, alors vous avez un problème de thermie. Si cpuburn ne fait pas planter votre ordinateur au bout de 10mn, vous pouvez considérez que votre système est stable de ce coté là. Vous pouvez aussi utiliser ce test pour vérifier que vos ventilateurs d&#039;ordinateurs portable se déclenchent bien en cas de surchauffe.&lt;br /&gt;
Sur un portable récent, on obtient le résultat suivant au bout de quelques minutes de cpuburn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             80 C&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Malgré la température très élevée du processeur, le système est resté stable ce qui permet de valider qu&#039;il est capable d&#039;encaisser une montée en température élevée. Bien entendu, plus votre machine sera « chaude » plus elle s&#039;usera rapidement. Il ne faut pas oublier que les autres composants peuvent souffrir de la chaleur dégagée par le processeur par exemple : les disques durs en sont un bon exemple car les plateaux ne supportent pas la chaleur.&lt;br /&gt;
Ce test est bon aussi ? A priori, les composants de base de votre système sont en bon état, vous pouvez commencer à regarder du coté configuration logicielle.&lt;br /&gt;
&lt;br /&gt;
== APIC es tu là ? ==&lt;br /&gt;
&lt;br /&gt;
Le manque de stabilité peut aussi s&#039;expliquer par la gestion des interruptions. &lt;br /&gt;
L&#039;architecture PIC (Programmable Interrupt Controllers)  représentée par la famille de composants Intel 8259, permettait une gestion de 8 interruptions pour un unique processeur. On les associe par 2 pour obtenir les 16 niveaux d&#039;interruptions nécessaire depuis nos vieux 80286 (milieu des années 80). Avec l&#039;arrivée des systèmes multi-processeurs, l&#039;architecture APIC (Advanced Programmable Interrupt Controllers) (Intel 82093) à été ajoutée pour permettre une gestion plus fine des interruptions. En effet, dans un contexte multi-processeurs, il est nécessaire de pouvoir choisir quel processeur traitera quelle interruption pour ne pas rester figé dans l&#039;ancien modèle (PIC) où le processeur de  « boot » est assigné à un ensemble d&#039;interruptions. &lt;br /&gt;
&lt;br /&gt;
De plus, l&#039;architecture APIC apporte une gestion de 24 interruptions, une gestion de priorité des interruptions et le routage de l&#039;interruption sur le bon processeur, contre un simple routage de 2*8 interruptions dans le modèle PIC sur un seul processeur. Depuis une dizaine d&#039;années, Intel propose le modèle APIC comme nouvelle architecture, y compris pour les systèmes mono-processeurs. Les ordinateurs récents, y compris les portables, sont maintenant équipés uniquement de composants APIC même si l&#039;on peut obtenir un comportement de type PIC avec ceux-ci.&lt;br /&gt;
&lt;br /&gt;
L&#039;architecture APIC est constituée d&#039;un ou plusieurs composants situé physiquement dans le southbridge (IO-APIC), généralement un par bus, et un composant situé dans le processeur : le Local APIC (LAPIC). Le LAPIC va permettre la gestion des interruptions au niveau du processeur local. Il permet aussi de générer des interruptions par exemple pour transmettre des interruptions à des processeurs voisins dans le contexte d&#039;un système multi-processeurs, ces messages sont appelés IPI (Inter Processor Interrupts). &lt;br /&gt;
&lt;br /&gt;
De plus le Local APIC (LAPIC) inclut un « timer » de précision cadencé à la fréquence du bus, généralement il peut être utilisé par l&#039;ordonnanceur de votre système d&#039;exploitation favori ou d&#039;autres outils de haut niveau (profiler kernel : oprofile, vtune). Les LAPIC et l&#039;IO-APIC sont reliés par un bus spécifique pour permettre un échange rapide des informations. &lt;br /&gt;
Schema logique d&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les IO-APIC vont donc se charger de collecter les interruptions provenant des périphériques systèmes et d&#039;en assurer le transfert vers le ou les processeur(s) suivant une route préalablement programmée par le BIOS et/ou le système d&#039;exploitation.&lt;br /&gt;
&lt;br /&gt;
Cependant, l&#039;implémentation des APIC dans les BIOS peut provoquer certaines instabilités sur votre système Linux. Par expérience, il n&#039;y a pas de règle pour trouver la configuration qui peut aider votre machine à se stabiliser car cela dépend de chaque machine. Des différences peuvent même exister entre  deux versions de BIOS d&#039;un même ordinateur. Cependant, dans la série 2.6 du noyau Linux et les version 2.4 récentes nous disposons d&#039;outils permettant de re-paramétrer cette configuration en activant/désactivant les IO-APIC ou les LAPIC.&lt;br /&gt;
&lt;br /&gt;
Chaque composant possède un activateur ou un inhibiteur, on aura donc d&#039;un coté « apic » et « noapic » pour la gestion des IO-APIC, « nolapic » et « lapic » de l&#039;autre pour la gestion des LAPIC. Ces 4 options sont à utiliser sur la ligne de commande du noyau, c&#039;est à dire au moment où le « bootloader » (lilo ou grub par exemple) va charger le noyau en mémoire. L&#039;utilisation de « apic » et « lapic » permet d&#039;activer ces composants qui ne l&#039;ont pas été par le BIOS. L&#039;activateur « apic » n&#039;est disponible que les architectures de type x86_64 car celui-ci est déjà activé sur les systèmes de type x86. On désactivera les APIC dans le cas où le système affiche des messages d&#039;erreurs sur les APIC comme : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;« APIC error on CPU0: 40(40) »&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ou&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;MP-BIOS bug: 8254 timer not connected to IO-APIC&lt;br /&gt;
failed.&lt;br /&gt;
timer doesn&#039;t work through the IO-APIC - disabling NMI Watchdog!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La désactivation des IO-APIC permet par exemple de corriger le comportement parfois récalcitrant de certaines cartes vidéos qui ne parviennent pas à afficher correctement en mode 2D/3D (écran noir par exemple).&lt;br /&gt;
&lt;br /&gt;
La non activation des LAPIC peut avoir comme conséquence un dysfonctionnement de l&#039;ACPI (gestion d&#039;énergie avancée). Ce cas est traité par le noyau, vous retrouverez dans les messages de démarrage la ligne suivante : « &amp;quot;Local APIC disabled by BIOS you can enable it with lapic ».&lt;br /&gt;
&lt;br /&gt;
Pour résumer, si votre machine, en général à architecture mono-processeur, a tendance à se bloquer lors de l&#039;utilisation de périphériques tels que le port usb, la carte graphique ou la carte son, essayez de désactiver le LAPIC puis l&#039; IO-APIC puis les 2.  Pour exemple, les cartes mère A7N8X de chez Asus ont largement tendance à se bloquer si l&#039;on ne spécifie pas « nolapic » lors du boot. Sur certaines machines, il faudra faire le contraire à savoir forcer l&#039;activation des LAPIC. Ceci dépendra de votre machine et de sa conception.&lt;br /&gt;
&lt;br /&gt;
== A vos marques, rebootez ! ==&lt;br /&gt;
&lt;br /&gt;
Certains machines peuvent présenter quelques soucis pour redémarrer. Encore une fois, on retrouve au coeur de ce problème l&#039;interaction entre le noyau et le matériel notamment l&#039;ACPI. Les ordinateurs portables dont le modèle HP nc6120 ont par exemple le bon goût de rester bloqués sur le message « No reboot fixup found for your hardware ». Ceci indique que le noyau ne connaît pas de contournement pour ce matériel (ce qui est le cas de la quasi totalité des ordinateurs) mais puisque vous voyez ce message c&#039;est que votre machine n&#039;a pas réussi à rebooter. Heureusement, il existe des contournements pour permettre un redémarrage plus « bas niveau ». Le noyau défini les modes suivants : « b » « c » « h » « s » et « w ».&lt;br /&gt;
Le mode de reboot peut être défini sur la ligne de commande du noyau suivant la forme « reboot=&amp;lt;mode&amp;gt; ». Le mode « s » est réservé au systèmes multi-processeurs, elle va réinitialiser chacun des processeurs.&lt;br /&gt;
&lt;br /&gt;
Le mode « b » permet quant à lui de rebooter en faisant un appel direct au bios qui se chargera de faire redémarrer la machine. Ce mode fonctionne plutôt bien car dans le cas d&#039;un BIOS posant problème sur l&#039;ACPI, on peut espérer avoir un reboot correct. C&#039;est le cas sur de notre portable cité précédement.&lt;br /&gt;
&lt;br /&gt;
Le mode « h » se chargera de faire redémarrer la machine en réinitialisant le processeur. C&#039;est l&#039;équivalent du mode « s » pour les environnements mono-processeurs.  Pour finir, les modes « c » et « w » correspondent aux modes « cold » et « warn » : ces modes sont plus connus sous le nom de « reboot à froid »  et « reboot à chaud ». Le premier effectuera les tests de mémoire tandis que le second exécutera un reboot plus court.&lt;br /&gt;
&lt;br /&gt;
De manière générale, on utilisera plutôt le mode « b » ou « h » pour les systèmes mono-processeurs récalcitrant et le mode « s » pour les systèmes multi-processeurs.&lt;br /&gt;
&lt;br /&gt;
== Toujours plus de performance ==&lt;br /&gt;
Votre configuration est bien stable depuis un certain temps. Toutefois vous trouvez qu&#039;elle est un peu lente, elle ne vous donne pas satisfaction par rapport à ce qu&#039;elle devrait fournir.&lt;br /&gt;
Cette partie de l&#039;article va explorer comment vérifier et corriger les problèmes de performance des différents composants.&lt;br /&gt;
Note: certaines configuration mono-processeur nécessitent de désactiver LAPIC (nolapic)&lt;br /&gt;
&lt;br /&gt;
=== Le disque dur ===&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le disque dur semble un peu lent et pénalise le système dans son ensemble. Hdparm est là pour vous aider à y voir plus clair. Hdparm est à l&#039;origine conçu pour les systèmes de disques IDE de type PATA. Le nouveau système de disque SATA, ne permet pas toujours en fonction de l&#039;implémentation, l&#039;appel à toutes ces astuces. Cependant les nouvelles séries de kernel à partir du 2.6.15 devrait permettre une gestion plus unifiée des systèmes de disques PATA et SATA.&lt;br /&gt;
&lt;br /&gt;
Le test « hdparm -t /dev/&amp;lt;mon_device&amp;gt; » permet de tester la vitesse de lecture depuis le disque dur jusqu&#039;en mémoire. Une valeur de 25Mo/sec est un minimum pour des machines récentes. Plusieurs paramètres peuvent influencer les performances d&#039;un disque IDE. &lt;br /&gt;
La commande « hdparm -cd » permet de vérifier que les entrées/sorties sont réalisées en 16-bit (le mode 32-bit n&#039;offre pas de performance supplémentaire) alors que le DMA (Direct Memory Access) est activé. Ceci permet la minimisation de l&#039;utilisation du processeur pendant les accès au disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -cd /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
 IO_support   =  0 (default 16-bit)&lt;br /&gt;
 using_dma    =  1 (on)&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande « hdparm -c0d1 /dev/&amp;lt;mon_device&amp;gt; » permet de configurer le périphérique dans ce mode. Le noyau de votre distribution Linux devrait le réaliser de manière automatique.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -I » permet d&#039;obtenir plus d&#039;informations sur la configuration de votre disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -I /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
ATA device, with non-removable media&lt;br /&gt;
	Model Number:       FUJITSU MHT2040AT                       &lt;br /&gt;
	Serial Number:      NN77T3C13KB9&lt;br /&gt;
	Firmware Revision:  0022    &lt;br /&gt;
Standards:&lt;br /&gt;
	Used: ATA/ATAPI-6 T13 1410D revision 3a &lt;br /&gt;
	Supported: 6 5 4 3 &lt;br /&gt;
Configuration:&lt;br /&gt;
	Logical		max	current&lt;br /&gt;
	cylinders	16383	16383&lt;br /&gt;
	heads		16	16&lt;br /&gt;
	sectors/track	63	63&lt;br /&gt;
	--&lt;br /&gt;
	CHS current addressable sectors:   16514064&lt;br /&gt;
	LBA    user addressable sectors:   78140160&lt;br /&gt;
	device size with M = 1024*1024:       38154 MBytes&lt;br /&gt;
	device size with M = 1000*1000:       40007 MBytes (40 GB)&lt;br /&gt;
Capabilities:&lt;br /&gt;
	LBA, IORDY(cannot be disabled)&lt;br /&gt;
	bytes avail on r/w long: 4	Queue depth: 1&lt;br /&gt;
	Standby timer values: spec&#039;d by Standard, no device specific minimum&lt;br /&gt;
	R/W multiple sector transfer: Max = 16	Current = 16&lt;br /&gt;
	Advanced power management level: 128 (0x80)&lt;br /&gt;
	Recommended acoustic management value: 254, current value: 254&lt;br /&gt;
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 &lt;br /&gt;
	     Cycle time: min=120ns recommended=120ns&lt;br /&gt;
	PIO: pio0 pio1 pio2 pio3 pio4 &lt;br /&gt;
	     Cycle time: no flow control=240ns  IORDY flow control=120ns&lt;br /&gt;
Commands/features:&lt;br /&gt;
	Enabled	Supported:&lt;br /&gt;
	   *	READ BUFFER cmd&lt;br /&gt;
	   *	WRITE BUFFER cmd&lt;br /&gt;
	   *	Host Protected Area feature set&lt;br /&gt;
	   *	Look-ahead&lt;br /&gt;
	   *	Write cache&lt;br /&gt;
	   *	Power Management feature set&lt;br /&gt;
		Security Mode feature set&lt;br /&gt;
	   *	SMART feature set&lt;br /&gt;
	   *	Mandatory FLUSH CACHE command &lt;br /&gt;
	   *	Device Configuration Overlay feature set &lt;br /&gt;
	   *	Automatic Acoustic Management feature set &lt;br /&gt;
	   *	SET MAX security extension&lt;br /&gt;
		Power-Up In Standby feature set&lt;br /&gt;
	   *	Advanced Power Management feature set&lt;br /&gt;
	   *	DOWNLOAD MICROCODE cmd&lt;br /&gt;
	   *	SMART self-test &lt;br /&gt;
	   *	SMART error logging &lt;br /&gt;
Security: &lt;br /&gt;
		supported&lt;br /&gt;
	not	enabled&lt;br /&gt;
	not	locked&lt;br /&gt;
		frozen&lt;br /&gt;
	not	expired: security count&lt;br /&gt;
	not	supported: enhanced erase&lt;br /&gt;
	40min for SECURITY ERASE UNIT. &lt;br /&gt;
HW reset results:&lt;br /&gt;
	CBLID- above Vih&lt;br /&gt;
	Device num = 0 determined by the jumper&lt;br /&gt;
Checksum: correct&lt;br /&gt;
[root@R1 ~]#&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On y retrouve le modèle, le numéro de série et la version du firmware qui peuvent être utiles en cas de contact avec le Service Après-Vente ou de mise à jour pour une série de firmwares défaillante.&lt;br /&gt;
&lt;br /&gt;
La ligne commençant par « DMA » dans la partie « Capabilities » permet d&#039;afficher la vitesse de transfert négociée entre le disque dur et le driver IDE de Linux. L&#039;étoile précède la valeur actuelle. Dans cet exemple, le mode udma5 est sélectionné : ceci est conforme aux machines disponibles sur le marché depuis environ 3 ans.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, voici le tableau de conversion entre le mode DMA et la vitesse maximale associée.&lt;br /&gt;
&lt;br /&gt;
Type de fonctionnement&lt;br /&gt;
Vitesse Maximale en MO/sec&lt;br /&gt;
UltraDMA 0&lt;br /&gt;
16,6&lt;br /&gt;
UltraDMA 1&lt;br /&gt;
25&lt;br /&gt;
UltraDMA 2&lt;br /&gt;
33,3&lt;br /&gt;
UltraDMA 3&lt;br /&gt;
44,4&lt;br /&gt;
UltraDMA 4&lt;br /&gt;
66,6&lt;br /&gt;
UltraDMA 5&lt;br /&gt;
100&lt;br /&gt;
UltraDMA 6&lt;br /&gt;
133,33&lt;br /&gt;
&lt;br /&gt;
Une configuration actuelle ne devrait pas être en dessous de UDMA5. Si ce n&#039;était pas le cas, on peut essayer de renégocier la vitesse de transfert à l&#039;aide de la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hdparm -X udma5 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celle-ci permet de forcer le mode UltraDMA5. Il faut utiliser cette commande avec précaution car elle pourrait générer des pertes ou de la corruption de données en cas de transfert pendant ce changement de mode.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi impacter les performances de votre disque dur en modifiant sa vitesse de rotation. Cette fonctionnalité connue sous le nom de Automatic Acoustic Management (AAM) est utilisable avec l&#039;option « -M » de hdparm. La valeur 128 représentera la vitesse la plus faible avec un disque silencieux, la valeur 254 la vitesse la plus élevée mais avec comme contre-partie un disque plus bruyant. On pourra noter des différences de quelques Mo/sec selon les configurations.&lt;br /&gt;
&lt;br /&gt;
Il est aussi à noter que l&#039;utilisation de logiciels permettant une meilleure gestion d&#039;énergie (cpufreq, laptop-mode) peut dégrader les performances d&#039;un disque dur de manière notable.&lt;br /&gt;
&lt;br /&gt;
=== Configuration bas niveau du réseau ===&lt;br /&gt;
&lt;br /&gt;
Le réseau local filaire peut parfois être un peu lent. Voici quelques tests pour vérifier si la lenteur provient du logiciel, du noyau ou du matériel. Tout d&#039;abord, explorons la trousse à outils indispensable pour analyser votre carte réseau : ethtool. Digne successeur de mii-tool, il permet de s&#039;informer sur la configuration de votre carte réseau. &lt;br /&gt;
&lt;br /&gt;
Il suffit de lancer « ethtool &amp;lt;votre_interface&amp;gt; » » pour obtenir la configuration matérielle de votre carte. On y retrouve les modes supportés par votre carte (Supported Link Modes ainsi que la vitesse actuelle (Speed), obtenue par auto-négociation dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
On peut également savoir si le câble réseau est connecté à la carte grâce à la ligne « Link Detected ». Le type de « duplex » utilisé permet également de savoir si la négociation avec l&#039; élément actif au bout de votre câble (commutateur, concentrateur ou une autre machine) a correctement fonctionné. Le duplex définit le mode de  transmission : le mode half-duplex indique que l&#039;on émet puis on reçoit des données, le mode full-duplex indique que l&#039;on peut émettre et recevoir en même temps des données. Le mode full-duplex est donc plus que recommandé pour vos équipements réseaux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# ethtool  eth1&lt;br /&gt;
Settings for eth1:&lt;br /&gt;
	Supported ports: [ TP MII ]&lt;br /&gt;
	Supported link modes:   10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Supports auto-negotiation: Yes&lt;br /&gt;
	Advertised link modes:  10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Advertised auto-negotiation: Yes&lt;br /&gt;
	Speed: 100Mb/s&lt;br /&gt;
	Duplex: Full&lt;br /&gt;
	Port: MII&lt;br /&gt;
	PHYAD: 1&lt;br /&gt;
	Transceiver: internal&lt;br /&gt;
	Auto-negotiation: on&lt;br /&gt;
	Current message level: 0x000020c1 (8385)&lt;br /&gt;
	Link detected: yes&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesurer les {contre}performances de votre réseau ===&lt;br /&gt;
&lt;br /&gt;
Une fois vérifiée la bonne configuration de votre matériel, nous pouvons passer à la vérification des performances entre deux machines.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire netpipe (http://www.scl.ameslab.gov/netpipe/) permet de réaliser des tests de performance mais aussi d&#039;intégrité entre deux machines. Il permet de tester les performances du réseau au travers la couche IP et non pas depuis un mode plus bas niveau comme pourrait l&#039;être un test utilisant directement le driver Ethernet. Ce test permet donc de valider que la configuration matérielle mais aussi logicielle est correcte.&lt;br /&gt;
&lt;br /&gt;
Sur la première machine, exécutez « NPtcp » : netpipe se positionne en mode « serveur ».&lt;br /&gt;
Sur la seconde machine, exécutez « NPtcp -h &amp;lt;machine1&amp;gt; » : netpipe se connecte au serveur netpipe de la machine nommée machine1 pour effectuer le test de performance.&lt;br /&gt;
&lt;br /&gt;
Le test par défaut teste les communication allant de 1 octet jusqu&#039;à 8 Mo. Il peut prendre plusieurs minutes si le réseau est « lent ». Le test va montrer pour chaque taille de paquet la performance obtenue. Il est normal d&#039;obtenir des performances faibles pour des paquets d&#039;une taille inférieure à 8 Ko. Transporter des petits paquets nécessite de réaliser beaucoup d&#039;opérations pour le processeur pour une quantité d&#039;information minime. Les performances seront meilleures à partir d&#039;environ 16 Ko et maximales à partir de 128 Ko. Sur un système utilisant du gigabit ethernet, on constatera une performance de 39Mbps à 256 octets, 287Mbps à 4Ko, 614Mbps à 16Ko, 845Mbps à 128Ko, 895Mbps à 8Mo.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ainsi vérifier et comparer facilement les performances de votre configuration réseau. Netpipe permet également de tester la vitesse du réseau pour une taille de paquets définie entre la taille indiqué par l&#039;option « -l » et la taille indiquée par l&#039;option « -u ». Ainsi, NPtcp -l 16384 -u 16384 permet de tester la bande passante réseau pour une taille de paquet égale à 16Ko.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -n &amp;lt;nb-cycle&amp;gt; » permet de définir le nombre de boucles à réaliser pour le test (50 par défaut). Enfin, pour réaliser des tests « full-duplex », on utilisera l&#039;option « -2 ». Ce test permet de s&#039;assurer du bon fonctionnement du mode de communication permettant l&#039;écriture et la lecture simultanées.&lt;br /&gt;
&lt;br /&gt;
Attention, même si ce test donne de bons résultats, cela ne veut pas dire que la configuration est exempte d&#039;erreur de configuration. Par exemple, les performances réseaux peuvent être très bonnes en point à point mais mauvaises lorsque l&#039;on aura une charge réseau avec plusieurs clients. Dans cette situation, il faut vérifier que le contrôle de flux est bien activé sur toutes les machines. L&#039;option « ethtool -a » permet de vérifier que les champs « rx » et « tx » sont placés sur « on ». Si ce n&#039;était pas le cas activez-les avec la commande « ethtool -A eth0 rx on » et « ethtool -A eth0 tx on ».&lt;br /&gt;
&lt;br /&gt;
Les cartes réseaux, des serveurs essentiellement, permettent maintenant de réaliser le « tcp segment offload ». Cette technique permet de décharger une partie du traitement TCP directement dans l&#039;électronique de la carte réseau. Ceci à pour effet de décharger le processeur central d&#039;un traitement fastidieux. L&#039;option « -k » d&#039;ethtool permet de consulter l&#039;état de cette fonctionnalité (off/on). On pourra l&#039;activer sur des serveurs générant un gros trafic réseau par exemple : « ethtool -K eth0 tso on ».&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant équipé de nouveau outils pour traquer la perte de performances de votre installation réseau. Ceci couplé aux habituels tcpdump/ethereal, voilà une belle panoplie du zorro du réseau.&lt;br /&gt;
&lt;br /&gt;
=== Quand la latence s&#039;en mêle ===&lt;br /&gt;
&lt;br /&gt;
La latence représente le temps nécessaire à un système pour prendre en compte un événement.&lt;br /&gt;
&lt;br /&gt;
Il arrive que certains périphériques de votre machine nécessitant des débits importants ou une latence assez faible sur le bus PCI soient « poussifs ». On retrouve dans cette catégorie les cartes vidéos accélératrice 3D, les cartes son et les cartes d&#039;acquisition firewire ou DVB (récepteur de télévision numérique terrestre : TNT).&lt;br /&gt;
&lt;br /&gt;
Un périphérique branché sur le bus PCI doit attendre que le bus soit libre pour émettre les données vers la mémoire centrale. Le bus PCI qui est le coeur de communication des périphériques est donc soumis en permanence à un arbitrage qui permet de décider qui doit émettre des données et qui doit attendre. Cet arbitrage est en partie réalisé grâce au « latency_timer ».&lt;br /&gt;
&lt;br /&gt;
Chaque périphérique possède une valeur de « latency_timer » comprise en 0 et 248 cycles d&#039;horloge du bus. Plus la valeur sera importante plus le périphérique disposera de temps pour transmettre des informations. Une latence de 248 cycles permet d&#039;obtenir une priorité forte sur le bus, ce qui permet un débit important. A contrario, une latence de 0 indiquera au périphérique qu&#039;il doit cesser ses transmissions si un autre composant à besoin du bus : ceci se traduira par une perte de bande passante importante.&lt;br /&gt;
&lt;br /&gt;
La configuration réalisée par défaut sur votre machine doit être correcte mais il peut arriver qu&#039;une carte 3D ou DVB soit configurée avec une latence trop faible, ce qui  aurait pour conséquence d&#039;offrir une image saccadée et peu fluide. Une carte son offrirait également le même type de symptômes avec un son hâché ou excessivement métallique.&lt;br /&gt;
&lt;br /&gt;
Heureusement, une série d&#039;outils est là pour vous aider à diagnostiquer le problème mais aussi à le résoudre. Le projet pciutils  (http://atrey.karlin.mff.cuni.cz/~mj/linux.shtml#pciutils) contient deux outils indispensables: lspci et setpci. Bien entendu, votre distribution favorite devrait posséder ce logiciel, il vous suffira de l&#039;installer avec  votre gestionnaire de paquet favori (urpmi, apt, smart).&lt;br /&gt;
&lt;br /&gt;
La commande « lspci » vous permet de lister les périphériques PCI disponibles sur votre ordinateur (cf article paru dans le numéro 68).  Cet exemple se basera sur une carte vidéo  ayant pour adresse sur le bus PCI « 01:00.0 ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@lagirafe] lspci -v -s 01:00.0&lt;br /&gt;
01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go5200 32M/64M] (rev a1) (prog-if 00 [VGA])&lt;br /&gt;
	Subsystem: Samsung Electronics Co Ltd: Unknown device c00f&lt;br /&gt;
	Flags: bus master, 66Mhz, medium devsel, latency 16, IRQ 11&lt;br /&gt;
	Memory at c8000000 (32-bit, non-prefetchable) [size=16M]&lt;br /&gt;
	Memory at d8000000 (32-bit, prefetchable) [size=128M]&lt;br /&gt;
	Expansion ROM at &amp;lt;unassigned&amp;gt; [disabled] [size=128K]&lt;br /&gt;
	Capabilities: [60] Power Management version 2&lt;br /&gt;
	Capabilities: [44] AGP version 3.0&lt;br /&gt;
[root@lagirafe]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On retiendra dans cette ligne, la valeur &#039;latency 16&#039;. Ceci risque de poser problème lorsque celle-ci aura besoin d&#039;un fort débit pendant un jeu par exemple. Augmenter la latence va donc se révéler nécessaire pour ce périphérique.&lt;br /&gt;
&lt;br /&gt;
La commande setpci permet de modifier les paramètres PCI d&#039;un périphérique ou d&#039;un bus complet avec tous ses périphériques. &lt;br /&gt;
&lt;br /&gt;
La commande « setpci -v -d 01:* latency_timer=20 » permet de positionner tous les périphériques  du bus 01 à une valeur de 32 cycles. Il est à noter que la commande setpci utilise des valeurs en hexadécimal mais lspci affichera les valeurs en décimal.&lt;br /&gt;
&lt;br /&gt;
Pour en revenir à nos moutons, la correction de la latence de cette carte graphique se fera avec la commande «  setpci -v -d 01:00.0 latency_timer=f8 ». Ceci positionne donc la carte sur la plus grande valeur de latence possible, ce qui lui garantira la plus grande bande passante possible. Il est possible d&#039;utiliser la valeur « ff » comme paramètre pour « latency_timer » mais celui-ci sera converti à la volée par la commande setpci en « 0xf8 ».&lt;br /&gt;
&lt;br /&gt;
Attention, certains composants de votre machine doivent rester en « latency_timer=0 » pour garantir une bon fonctionnement de votre système : il ne faudra donc pas modifier les latences des contrôleurs mémoire et des ponts PCI connectés généralement sur le bus « 0:* ».&lt;br /&gt;
&lt;br /&gt;
== DSDT : le cauchemar continue ! ==&lt;br /&gt;
&lt;br /&gt;
Cette partie de l&#039;article a pour but d&#039;expliquer le problème que peut représenter la table DSDT pour un certain nombre de machines et surtout les ordinateurs portables. &lt;br /&gt;
&lt;br /&gt;
La norme ACPI 3.0 de Septembre 2004 disponible gratuitement à l&#039;adresse http://www.acpi.info/DOWNLOADS/ACPIspec30.pdf définit la DSDT comme une table remplie par un OEM permettant au système d&#039;exploitation de découvrir les ressources pour la gestion de l&#039;énergie avancée, de la gestion thermique ainsi que la gestion du Plug&#039;nPlay des ressources définies par l&#039;ACPI.&lt;br /&gt;
&lt;br /&gt;
Voici une description certes un peu théorique mais nécessaire pour bien comprendre la problématique et ses conséquences. Le constructeur de l&#039;ordinateur doit donc définir dans le BIOS une table contenant une liste de ressources et leurs configuration et ce pour que le système d&#039;exploitation puisse s&#039;en servir. Noble cause n&#039;est il pas ? Tout au long des 618 pages de ce document sont spécifiés les éléments du langage à utiliser ainsi que sa syntaxe. L&#039; « ACPI Source Language » permettra donc aux développeurs d&#039;écrire des DSDT puis de les compiler dans un format nommé « ACPI Machine Language » en utilisant un compilateur adéquat. Le système d&#039;exploitation utilisera la table compilée (AML) pour accéder aux ressources ACPI. &lt;br /&gt;
Sur la plupart des ordinateurs portables, la table DSDT ne respecte pas la norme ACPI dans sa syntaxe. Ceci est très gênant car cela bloque le code de l&#039;interpréteur ACPI du noyau Linux qui essaie de la lire. Le résultat est sans appel, pas d&#039;ACPI, pas de gestion d&#039;énergie avancée, plus de ventilation automatique sur certains modèles d&#039;ordinateurs, plus de touche de gestion de contraste/luminosité sur d&#039;autres etc...&lt;br /&gt;
&lt;br /&gt;
Ceci est très gênant sur un ordinateur portable. Alors que faire ? Dans un premier temps, prévenir le constructeur que son BIOS est incorrect et ne respecte pas la norme ACPI. La réponse se fait toujours attendre pour tous ceux qui « osent » poser la question au support technique : à savoir, les constructeurs ignorent tout simplement les mails de ce type.&lt;br /&gt;
La seconde étape puisque vous êtes devant le fait accompli d&#039;une machine non conforme, il va falloir corriger cette table. Il suffit de récupérer la table actuelle via la commande &#039;cat /proc/acpi/dsdt &amp;gt; dsdt.aml&#039; si vous avez la chance d&#039;avoir un répertoire /proc/acpi malgré une table DSDT endommagée, sinon utilisez la commande &#039;acpidump -b -t dsdt -o dsdt.aml&#039;. La commande acpidump est  fournit dans le projet pmtools (ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools-20050926.tar.bz2) &lt;br /&gt;
Vous avez donc extrait la table DSDT de votre système. Il ne reste plus qu&#039;à essayer de la recompiler. Pour cela, le compilateur IASL de la société Intel (http://developer.intel.com/technology/iapc/acpi/downloads.htm) offre sous Linux et Windows une plate-forme de compilation pour le langage ASL.&lt;br /&gt;
&lt;br /&gt;
Suivez les instructions du site pour télécharger et compiler la version unix d&#039;iasl. Ensuite, décompilez la table avec la commande « iasl -d dsdt.aml ». Le fichier dsdt.dsl vient d&#039;être créé par le décompilateur. Il suffit de le recompiler avec la commande « iasl -tc dsdt.dsl » pour constater les dégâts ! La DSDT que vous avez dans votre BIOS est généralement compilée par le compilateur de Microsoft qui semble autoriser une syntaxe plus qu&#039;approximative.&lt;br /&gt;
Si vous avez de la chance, votre DSDT s&#039;est recompilée sans erreurs, vous obtenez donc un fichier dsdt.hex et un fichier dsdt.aml. Il ne reste plus qu&#039;à injecter cette dsdt dans le noyau Linux et le tour sera joué.&lt;br /&gt;
&lt;br /&gt;
Si vous avez moins de chance, votre DSDT est syntaxiquement incorrecte et génère des erreurs. Les expliquer plus en détails nécessiterait un article complet, il ne sera cité que les plus « habituelles » (sic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2626:                     Field (ECR, DWordAcc, Lock, Preserve) &lt;br /&gt;
Error    1048 -                              ^ Host Operation Region requires ByteAcc access &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette erreur présente à ligne 2626 du fichier dsdt.asl indique une erreur de type dans la déclaration du champ ECR. Il suffit dans ce cas de changer le mot « DWordAcc » par « ByteAcc ». Celle-ci reste assez simple à corriger, on se demande donc pourquoi les constructeurs ne prennent pas le temps de vérifier et de corriger leur BIOS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2672:                     Method (_GLK, 1, NotSerialized) &lt;br /&gt;
Warning  2024 -                                ^ Reserved method has too many arguments ( _GLK requires 0) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode _GLK n&#039;a besoin que de 0 paramètre tandis que ce code en utilise 2 ! La correction est assez simple : il suffit de remplacer la ligne 2672 par « Method(_GLK) ».&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur la correction des erreurs de compilation de votre table dsdt, je vous recommande les tutoriaux disponibles depuis la page http://acpi.sourceforge.net/dsdt/index.php du projet ACPI.&lt;br /&gt;
&lt;br /&gt;
Votre DSDT est compilée avec succès, il ne vous reste plus qu&#039;à l&#039;ajouter pour que votre noyau puisse l&#039;utiliser à la place de celle fourni par le BIOS (modifiable uniquement par le constructeur, via une mise à jour).&lt;br /&gt;
&lt;br /&gt;
Il existe trois possibilités pour inclure une table DSDT : la modification du noyau Linux ( noyau &amp;lt; 2.6.9), l&#039;injection de la DSDT dans la configuration du noyau (noyau &amp;gt;= 2.6.9), l&#039;intégration de la table DSDT dans l&#039;initrd qui nécessite un patch kernel disponible à l&#039;adresse http://gaugusch.at/kernel.shtml.&lt;br /&gt;
&lt;br /&gt;
Pour les noyaux 2.6.9 et supérieur, copiez votre fichier dsdt.hex sous le nom «/usr/src/linux/include/acpi/dsdt_table.h » puis reconfigurez votre noyau.&lt;br /&gt;
Insérer « dsdt_table.h » dans l&#039;option « Include you custom DSDT » disponible dans le menu « Power Management/ACPI/ ». Recompilez votre noyau et redémarrez avec votre nouveau noyau.&lt;br /&gt;
Pour les noyaux inférieurs à 2.6.9, il est possible de modifier le code source de votre noyau pour intégrer votre DSDT mais il est préférable d&#039;utiliser le patch permettant l&#039;insertion de la table DSDT dans l&#039;initrd. Recompilez votre noyau avec ce patch, puis suivez la procédure décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Certaines distributions Linux comme « Mandriva Linux » possèdent le patch qui permet de n&#039;avoir qu&#039;à reconstruire l&#039;initrd avec la commande « mkinitrd –dsdt=/boot/dsdt.aml /boot/initrd-`uname -r`.img `uname -r`  » puis de relancer lilo avant de redémarrer votre machine. Lors du démarrage de celle-ci vous devriez voir le message suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ACPI: Looking for DSDT in initrd... found (at offset 0x4f8d9).&lt;br /&gt;
ACPI-0294: *** Info: Table [DSDT] replaced by host OS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant avec une table DSDT correcte et un ACPI fonctionnel. La question qui reste ouverte est pourquoi les constructeurs n&#039;utilisent pas un compilateur digne de ce nom pour permettre à leur clients de pouvoir utiliser d&#039;autres systèmes d&#039;exploitation que Windows de Microsoft. &lt;br /&gt;
&lt;br /&gt;
Pour la petite histoire, si vous cherchez dans votre dsdt vous risquez de tomber ce genre de lignes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows NT&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft WindowsME: Millennium Edition&amp;quot;), Zero))&lt;br /&gt;
 If (LEqual (SizeOf (\_OS), 0x27)) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque qu&#039;un système d&#039;exploitation souhaite utiliser les ressources ACPI du BIOS, il utilise son nom de système d&#039;exploitation (acpi_os_name). On retrouve donc dans les bios des parties qui ne seront exécutées que pour certains systèmes d&#039;exploitation de Microsoft. On retrouve même certains tests où c&#039;est la longueur du nom qui compte...... Ceci prouve bien que les constructeurs d&#039;ordinateurs savent corriger des tables DSDT pour les systèmes d&#039;exploitation mais pas forcément pour le notre malheureusement. Depuis le noyau 2.6.9, le noyau Linux utilise « Windows NT » comme « acpi_os_name »  pour assurer une meilleure compatibilité matérielle dixit Len Bron d&#039;Intel dans le changelog de cette version.&lt;br /&gt;
&lt;br /&gt;
== Comment trouver le pilote qui va avec votre matériel ? ==&lt;br /&gt;
&lt;br /&gt;
Cette question on se la pose souvent mais uniquement lorsque l&#039;on essaye de brancher un nouveau périphérique sur sa machine. Les distributions récentes permettent de détecter automatiquement votre matériel et de lui associer un pilote avec sa configuration. Ce mécanisme fonctionne plutôt bien mais cela n&#039;évite pas les dysfonctionnements voir l&#039;absence de fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Pour vérifier si votre noyau Linux est capable de supporter un nouveau périphérique PCI par exemple, il suffit d&#039;en récupérer les identifiants PCI (constructeur et produit) puis de les rechercher dans le fichier « /lib/modules/`uname -r`/modules.pcimap » qui est auto-généré lors de la commande depmod.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire « lspcidrake -v » vous permet de trouver les identifiants PCI de votre carte, la commande « lspci » vous permet de trouver le nom de votre périphérique puis faites un « lspci -n » pour en trouver la correspondance numérique. On utilisera la position du périphérique sur le bus pour retrouver la correspondance numérique « 02:05.0 » dans cet exemple.&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome] lspci&lt;br /&gt;
[....]&lt;br /&gt;
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)&lt;br /&gt;
[root@pumphome] lspci -n&lt;br /&gt;
[...]&lt;br /&gt;
02:05.0 Class 0200: 14e4:4401 (rev 01)&lt;br /&gt;
[root@pumphome]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi cette carte réseau possède les identifiants 14e4 (constructeur) et 4401 (produit). Il suffit de rechercher cette valeur dans le modules.pcimap, ce qui nous donnera la correspondance en module (pilote).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome]  grep &amp;quot;0x000014e4 0x00004401&amp;quot; /lib/modules/2.6.12-12mdk-i686-up-4GB/modules.pcimap &lt;br /&gt;
b44               0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
bcm4400      0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit ici que cette carte peut utiliser le driver b44 ou le driver bcm4400. On ne trouve pas toujours les identifiants PCI de produit sous leur forme directe, on peut également trouver « 0Xffffffff » qui indique que tous les cartes du constructeur sont gérées par un module.&lt;br /&gt;
Il ne vous restera plus qu&#039;à effectuer la configuration associée à ce périphérique pour qu&#039;il fonctionne correctement.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
La fin de cet article conclut une toute petite série de deux articles ayant pour but de vulgariser l&#039;architecture de nos machines, de découvrir les outils disponibles pour mieux comprendre leur configuration et au besoin régler les problèmes de configuration matérielle qui ont souvent le don de nous pourrir la vie.&lt;br /&gt;
&lt;br /&gt;
Merci à LaurentJ de #Mandrivafr pour ses tests complémentaires sur les problèmes d&#039;IO-APIC. Un énorme merci à Nicolas Planel pour sa relecture pointue et également Anne pour sa patience de girafe à relire et « quaurigé »mes « photes »,  ainsi qu&#039;à tous ceux qui m&#039;ont aidé à découvrir ce que je restitue dans cet article.&lt;br /&gt;
&lt;br /&gt;
Cet article a été publié dans Linux Magazine France n°78. Il est publié sur Léa avec l&#039;aimable autorisation de l&#039;éditeur.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12763</id>
		<title>Découvrez les ressources de votre machine (La suite)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12763"/>
		<updated>2006-06-10T21:52:42Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Découvrez les ressources de votre machine (La suite) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A nouvelle année, nouvelles résolutions ! Paru dans le numéro 68, un premier article dédié à la découverte des outils disponibles pour la récupération des configurations de votre machine promettait une suite.  Je vous propose donc de reprendre ce voyage au centre de votre ordinateur. &lt;br /&gt;
&lt;br /&gt;
Cet article sera articulé autour du diagnostic de pannes et des correctifs associés mais aussi de « trucs &amp;amp; astuces » permettant d&#039;optimiser votre configuration.&lt;br /&gt;
&lt;br /&gt;
== Savez-vous planter les choux ? ==&lt;br /&gt;
&lt;br /&gt;
Les choux peut-être pas mais les ordinateurs je pense que c&#039;est arrivé au moins une fois à chaque lecteur qui lit cet article. Rien de plus énervant qu&#039;un écran qui se fige, le pointeur de souris qui ne se déplace plus, le clavier qui ne répond plus non plus.... Planté ! Ce constat est assez facile à établir mais en trouver la cause reste un problème nettement plus complexe tellement le nombre de causes possibles est important.&lt;br /&gt;
&lt;br /&gt;
Deux solutions : ignorer le problème et relancer le système en se disant que ça « passera », ou alors chercher la cause du problème en essayant de trouver une méthode reproduisant le « plantage » tant redouté.&lt;br /&gt;
&lt;br /&gt;
La première solution fonctionne assez bien mais si l&#039;on à faire à un « vrai » problème de configuration matérielle ou logicielle, on arrivera assez vite à ne plus pouvoir éviter la seconde voire la troisième. J&#039;allais oublier cette troisième solution destinée aux plus riches d&#039;entre vous : changer de matériel. Cette solution coûteuse peut parfois se révéler efficace, parfois pas du tout. A quoi bon changer un composant sans savoir si c&#039;était bien celui-ci qui posait problème ?&lt;br /&gt;
Quelque soit la solution retenue, il sera de toute manière nécessaire de localiser la panne pour y apporter la réponse adéquate. Certaines sociétés ou particuliers se sont spécialisés dans ce dépannage ou l&#039;utilisateur est « dépassé » par les événements.&lt;br /&gt;
&lt;br /&gt;
Cet article vous fera, je l&#039;espère, découvrir quelques outils et méthodes pour valider un par un les composants de votre ordinateur. Cela vous permettra j&#039;espère d&#039;être un peu moins dépourvu quand un problème surviendra. L&#039;article reproduira les étapes qu&#039;il faut suivre pour isoler le « fautif ».&lt;br /&gt;
&lt;br /&gt;
== Les causes possibles d&#039;un « plantage » ==&lt;br /&gt;
&lt;br /&gt;
On retrouve deux grandes catégories de pannes provoquant des dysfonctionnements importants sur un système informatique.&lt;br /&gt;
* une panne du matériel&lt;br /&gt;
* une erreur logicielle au niveau du noyau et des pilotes (drivers)&lt;br /&gt;
&lt;br /&gt;
Il faudra donc être capable de séparer la panne matérielle qui « force » l&#039;ordinateur à entrer dans un mode de fonctionnement non prévu et instable, de l&#039;erreur logicielle qui équivaut à demander à l&#039;ordinateur de faire « n&#039;importe quoi » et qui va donc se « planter ».&lt;br /&gt;
&lt;br /&gt;
Le terme « planté » utilisé ici équivaut à un arrêt du système à cause d&#039;erreurs sévères : instruction illégale ou composants défaillants. Le terme de « plantage » est aussi utilisé pour décrire le fonctionnement d&#039;une application qui se ferme inopinément. Ce cas est plus souvent lié à une erreur de programmation de l&#039;application qu&#039;à une erreur du système. Nous ne parlerons donc pas de ce second cas dans cet article.&lt;br /&gt;
&lt;br /&gt;
== La mémoire qui flanche ? ==&lt;br /&gt;
&lt;br /&gt;
Une cause « classique » des dysfonctionnements se situe au niveau de la gestion de la mémoire de votre machine. Je ne parle pas d&#039;allocation mémoire réalisée par votre système d&#039;exploitation favori mais bien de la manière avec laquelle la carte mère configure et utilise vos barrettes de mémoire. Les applications chargent en mémoire des données et des instructions destinées au processeur. Voici un scénario qui peut provoquer l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Votre application favorite est lancée depuis la ligne de commande ou une interface graphique via un « clic » de souris. Votre système d&#039;exploitation va donc charger ce programme en mémoire puis en exécuter les instructions. Au plus bas niveau de votre système, le processeur exécute des instructions en langage machine (assembleur) présente en mémoire.&lt;br /&gt;
Malheureusement, votre mémoire est défaillante et elle n&#039;arrive pas à maintenir un état stable des informations qui lui sont confiées. Par exemple, la lettre C est représentée par le code 67, ou « 1000011 » en binaire. Si la zone mémoire change d&#039;état, alors le contenu de la valeur stocké à cet endroit changera : on pourrait se retrouver avec « 1000010 ». Un seul bit a changé, mais on passe de la lettre &#039;C&#039; (67) à la lettre &#039;B&#039;(66). Le résultat ne se fait pas attendre, le processeur se retrouve à exécuter des instructions qui n&#039;ont plus de sens, provoquant l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Les pannes de mémoires sont généralement dues à des composants endommagés, des barrettes incompatibles ou un  « timing d&#039;accès » à la mémoire (nommé CAS (Column Address Strobe) dans la plupart des BIOS) trop agressif permettant des lectures dans des zones mémoires avant que les écritures aient eu le temps de se stabiliser pour en garantir le contenu.&lt;br /&gt;
&lt;br /&gt;
Il est assez simple de valider votre configuration mémoire grâce à l&#039;utilitaire memtest (http://www.memtest.org). Cet utilitaire de taille très modeste, 96 Kilo-octets, est écrit en assembleur ce qui lui permet de s&#039;exécuter indépendamment du système d&#039;exploitation. Ceci garantit un test « proche » du matériel, sans sur-couche pouvant apporter d&#039;autres problèmes. &lt;br /&gt;
La version 1.65 actuelle est téléchargeable sous deux formes : une iso que l&#039;on peut graver sur un CDRW de préférence vu la petite taille du programme ou sous la forme d&#039;une amorce système (pre-compiled bootable binary). Il suffira de décompresser l&#039;archive puis d&#039;exécuter la commande suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;dd if=memtest.bin of=/dev/fda&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Ceci écrasera le contenu de votre disquette pour y  copier memtest. Rebootez l&#039;ordinateur avec la disquette placée dans le lecteur, memtest devrait se lancer. &lt;br /&gt;
&lt;br /&gt;
La figure 1, est une capture d&#039;écran de memtest en fonctionnement. Le barre de progression principale affichée en haut à droite de l&#039;écran (2% dans cet exemple) permet de suivre la progression du test. Les erreurs apparaissent dans la partie inférieure de l&#039;écran. Il suffit de laisser fonctionner memtest au moins une fois jusqu&#039;à 100%. Si aucune ligne ne s&#039;est affichée alors vou pouvez considérer que la mémoire est fonctionnelle. Dans le cas contraire,  il faudra soit procéder à son remplacement s&#039;il s&#039;agit d&#039;une seule barrette mémoire, soit tester les barrettes indépendamment (l&#039;une puis l&#039;autre) avec ce logiciel. Dans le cas de 2 ou 3 barrettes qui ne fonctionnement pas correctement ensemble mais qui fonctionnement correctement individuellement, il faudra vérifier qu&#039;elles sont bien de même modèle/marque et remettre le Bios dans une configuration initiale.&lt;br /&gt;
&lt;br /&gt;
Votre mémoire est bonne ? Testons les autres composants de votre machine pour traquer la source de ce plantage.&lt;br /&gt;
&lt;br /&gt;
== Il ne fait pas un peu chaud là ? ==&lt;br /&gt;
&lt;br /&gt;
Ces dix dernières années la puissance consommée et dissipée par nos ordinateurs a littéralement explosé ! Du 486 qui ne nécessitait quasiment pas de ventilateur, on est arrivé à des stations de travail/jeu avec des alimentations pouvant atteindre 1KiloWatt pour les dernières et 500watt pour des modèles plus « grand public ». Le processeur est un des composants gourmands de la machine. Certains modèles peuvent consommer plus de 130W ! Autant dire que si le système est mal ventilé, la montée en charge du processeur peut provoquer un échauffement important provoquant une surchauffe de celui-ci. S&#039;il dépasse ces caractéristiques de fonctionnement, il va alors exécuter du code incorrect provocant  un plantage du système.&lt;br /&gt;
&lt;br /&gt;
Un bon test pour vérifier que votre processeur n&#039;est pas la cause de votre instabilité : commencez par relever la température de votre machine au repos à l&#039;aide des informations fournies soit par l&#039;acpi soit pas lm_sensors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[erwan@R1 ~]$ cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             42 C&lt;br /&gt;
[erwan@R1 ~]$ &lt;br /&gt;
&lt;br /&gt;
[root@konilope ~]# sensors | grep Temp&lt;br /&gt;
M/B Temp:    +39°C  (low  =   +15°C, high =   +40°C)   sensor = thermistor   &lt;br /&gt;
CPU Temp:   +127°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
Temp3:       +44°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
[root@konilope ~]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode utilisant lm_sensors nécessite une interprétation de la part de l&#039;utilisateur. Dans cet exemple, il apparaît évidant que le processeur ne peut avoir une température de fonctionnement aussi élevée (127°C). L&#039;erreur est du à un mauvais calcul de la part de lm_sensors. Il se base sur le type de capteurs thermiques utilisé par la carte mère pour calculer la température des différents composants. Malheureusement, le montage électrique autour du capteur de température peut varier d&#039;un modèle de carte à un autre, ce qui fausse les calculs. On considéra donc, que pour cette machine (konilope) sa température se situe aux alentours de 42° : valeur moyenne entre les deux valeurs « cohérentes » relevées par lm_sensors. On pourra cependant vérifier cette approximation en relevant la température du disque sur à l&#039;aide de smartmontools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# smartctl -A /dev/hda | grep Temperature&lt;br /&gt;
194 Temperature_Celsius     0x0022   042   052   000    Old_age   Always       -       42&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, il est préférable de maintenir sa machine en dessous des 55° et celle de son processeur en dessous de 70°C. Au delà, le système risque d&#039;être instable. Si ce n&#039;est pas le cas, effectuez les modification nécessaire pour y parvenir : meilleure ventilation du processeur ou du boîtier par exemple.&lt;br /&gt;
&lt;br /&gt;
Ensuite, téléchargez l&#039;utilitaire cpuburn depuis un mirroir  (http://pages.sbcglobal.net/redelm/cpuburn_1_4_tar.gz)  ou depuis votre distribution linux favorite (oui, oui, urpmi cpuburn ça fonctionne ;o)).&lt;br /&gt;
&lt;br /&gt;
Vous y trouverez plusieurs programmes nommés burnXX ou XX représente votre processeur. La version P6 sera à utiliser sur les processeurs Intel Pentium 4, la version K7 pour les processeurs Athlon x86. Pour les processeurs plus récents, utilisez la version P6.&lt;br /&gt;
Ce logiciel réalise des boucles en langage assembleur ayant pour but de stresser votre processeur de manière importante et donc le faire chauffer. Lancez cpuburn autant de fois que vous avez de processeur sur votre machine puis observez la température de votre machine. Si lors de la montée en température votre système se fige, alors vous avez un problème de thermie. Si cpuburn ne fait pas planter votre ordinateur au bout de 10mn, vous pouvez considérez que votre système est stable de ce coté là. Vous pouvez aussi utiliser ce test pour vérifier que vos ventilateurs d&#039;ordinateurs portable se déclenchent bien en cas de surchauffe.&lt;br /&gt;
Sur un portable récent, on obtient le résultat suivant au bout de quelques minutes de cpuburn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             80 C&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Malgré la température très élevée du processeur, le système est resté stable ce qui permet de valider qu&#039;il est capable d&#039;encaisser une montée en température élevée. Bien entendu, plus votre machine sera « chaude » plus elle s&#039;usera rapidement. Il ne faut pas oublier que les autres composants peuvent souffrir de la chaleur dégagée par le processeur par exemple : les disques durs en sont un bon exemple car les plateaux ne supportent pas la chaleur.&lt;br /&gt;
Ce test est bon aussi ? A priori, les composants de base de votre système sont en bon état, vous pouvez commencer à regarder du coté configuration logicielle.&lt;br /&gt;
&lt;br /&gt;
== APIC es tu là ? ==&lt;br /&gt;
&lt;br /&gt;
Le manque de stabilité peut aussi s&#039;expliquer par la gestion des interruptions. &lt;br /&gt;
L&#039;architecture PIC (Programmable Interrupt Controllers)  représentée par la famille de composants Intel 8259, permettait une gestion de 8 interruptions pour un unique processeur. On les associe par 2 pour obtenir les 16 niveaux d&#039;interruptions nécessaire depuis nos vieux 80286 (milieu des années 80). Avec l&#039;arrivée des systèmes multi-processeurs, l&#039;architecture APIC (Advanced Programmable Interrupt Controllers) (Intel 82093) à été ajoutée pour permettre une gestion plus fine des interruptions. En effet, dans un contexte multi-processeurs, il est nécessaire de pouvoir choisir quel processeur traitera quelle interruption pour ne pas rester figé dans l&#039;ancien modèle (PIC) où le processeur de  « boot » est assigné à un ensemble d&#039;interruptions. &lt;br /&gt;
&lt;br /&gt;
De plus, l&#039;architecture APIC apporte une gestion de 24 interruptions, une gestion de priorité des interruptions et le routage de l&#039;interruption sur le bon processeur, contre un simple routage de 2*8 interruptions dans le modèle PIC sur un seul processeur. Depuis une dizaine d&#039;années, Intel propose le modèle APIC comme nouvelle architecture, y compris pour les systèmes mono-processeurs. Les ordinateurs récents, y compris les portables, sont maintenant équipés uniquement de composants APIC même si l&#039;on peut obtenir un comportement de type PIC avec ceux-ci.&lt;br /&gt;
&lt;br /&gt;
L&#039;architecture APIC est constituée d&#039;un ou plusieurs composants situé physiquement dans le southbridge (IO-APIC), généralement un par bus, et un composant situé dans le processeur : le Local APIC (LAPIC). Le LAPIC va permettre la gestion des interruptions au niveau du processeur local. Il permet aussi de générer des interruptions par exemple pour transmettre des interruptions à des processeurs voisins dans le contexte d&#039;un système multi-processeurs, ces messages sont appelés IPI (Inter Processor Interrupts). &lt;br /&gt;
&lt;br /&gt;
De plus le Local APIC (LAPIC) inclut un « timer » de précision cadencé à la fréquence du bus, généralement il peut être utilisé par l&#039;ordonnanceur de votre système d&#039;exploitation favori ou d&#039;autres outils de haut niveau (profiler kernel : oprofile, vtune). Les LAPIC et l&#039;IO-APIC sont reliés par un bus spécifique pour permettre un échange rapide des informations. &lt;br /&gt;
Schema logique d&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les IO-APIC vont donc se charger de collecter les interruptions provenant des périphériques systèmes et d&#039;en assurer le transfert vers le ou les processeur(s) suivant une route préalablement programmée par le BIOS et/ou le système d&#039;exploitation.&lt;br /&gt;
&lt;br /&gt;
Cependant, l&#039;implémentation des APIC dans les BIOS peut provoquer certaines instabilités sur votre système Linux. Par expérience, il n&#039;y a pas de règle pour trouver la configuration qui peut aider votre machine à se stabiliser car cela dépend de chaque machine. Des différences peuvent même exister entre  deux versions de BIOS d&#039;un même ordinateur. Cependant, dans la série 2.6 du noyau Linux et les version 2.4 récentes nous disposons d&#039;outils permettant de re-paramétrer cette configuration en activant/désactivant les IO-APIC ou les LAPIC.&lt;br /&gt;
&lt;br /&gt;
Chaque composant possède un activateur ou un inhibiteur, on aura donc d&#039;un coté « apic » et « noapic » pour la gestion des IO-APIC, « nolapic » et « lapic » de l&#039;autre pour la gestion des LAPIC. Ces 4 options sont à utiliser sur la ligne de commande du noyau, c&#039;est à dire au moment où le « bootloader » (lilo ou grub par exemple) va charger le noyau en mémoire. L&#039;utilisation de « apic » et « lapic » permet d&#039;activer ces composants qui ne l&#039;ont pas été par le BIOS. L&#039;activateur « apic » n&#039;est disponible que les architectures de type x86_64 car celui-ci est déjà activé sur les systèmes de type x86. On désactivera les APIC dans le cas où le système affiche des messages d&#039;erreurs sur les APIC comme : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;« APIC error on CPU0: 40(40) »&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ou&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;MP-BIOS bug: 8254 timer not connected to IO-APIC&lt;br /&gt;
failed.&lt;br /&gt;
timer doesn&#039;t work through the IO-APIC - disabling NMI Watchdog!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La désactivation des IO-APIC permet par exemple de corriger le comportement parfois récalcitrant de certaines cartes vidéos qui ne parviennent pas à afficher correctement en mode 2D/3D (écran noir par exemple).&lt;br /&gt;
&lt;br /&gt;
La non activation des LAPIC peut avoir comme conséquence un dysfonctionnement de l&#039;ACPI (gestion d&#039;énergie avancée). Ce cas est traité par le noyau, vous retrouverez dans les messages de démarrage la ligne suivante : « &amp;quot;Local APIC disabled by BIOS you can enable it with lapic ».&lt;br /&gt;
&lt;br /&gt;
Pour résumer, si votre machine, en général à architecture mono-processeur, a tendance à se bloquer lors de l&#039;utilisation de périphériques tels que le port usb, la carte graphique ou la carte son, essayez de désactiver le LAPIC puis l&#039; IO-APIC puis les 2.  Pour exemple, les cartes mère A7N8X de chez Asus ont largement tendance à se bloquer si l&#039;on ne spécifie pas « nolapic » lors du boot. Sur certaines machines, il faudra faire le contraire à savoir forcer l&#039;activation des LAPIC. Ceci dépendra de votre machine et de sa conception.&lt;br /&gt;
&lt;br /&gt;
== A vos marques, rebootez ! ==&lt;br /&gt;
&lt;br /&gt;
Certains machines peuvent présenter quelques soucis pour redémarrer. Encore une fois, on retrouve au coeur de ce problème l&#039;interaction entre le noyau et le matériel notamment l&#039;ACPI. Les ordinateurs portables dont le modèle HP nc6120 ont par exemple le bon goût de rester bloqués sur le message « No reboot fixup found for your hardware ». Ceci indique que le noyau ne connaît pas de contournement pour ce matériel (ce qui est le cas de la quasi totalité des ordinateurs) mais puisque vous voyez ce message c&#039;est que votre machine n&#039;a pas réussi à rebooter. Heureusement, il existe des contournements pour permettre un redémarrage plus « bas niveau ». Le noyau défini les modes suivants : « b » « c » « h » « s » et « w ».&lt;br /&gt;
Le mode de reboot peut être défini sur la ligne de commande du noyau suivant la forme « reboot=&amp;lt;mode&amp;gt; ». Le mode « s » est réservé au systèmes multi-processeurs, elle va réinitialiser chacun des processeurs.&lt;br /&gt;
&lt;br /&gt;
Le mode « b » permet quant à lui de rebooter en faisant un appel direct au bios qui se chargera de faire redémarrer la machine. Ce mode fonctionne plutôt bien car dans le cas d&#039;un BIOS posant problème sur l&#039;ACPI, on peut espérer avoir un reboot correct. C&#039;est le cas sur de notre portable cité précédement.&lt;br /&gt;
&lt;br /&gt;
Le mode « h » se chargera de faire redémarrer la machine en réinitialisant le processeur. C&#039;est l&#039;équivalent du mode « s » pour les environnements mono-processeurs.  Pour finir, les modes « c » et « w » correspondent aux modes « cold » et « warn » : ces modes sont plus connus sous le nom de « reboot à froid »  et « reboot à chaud ». Le premier effectuera les tests de mémoire tandis que le second exécutera un reboot plus court.&lt;br /&gt;
&lt;br /&gt;
De manière générale, on utilisera plutôt le mode « b » ou « h » pour les systèmes mono-processeurs récalcitrant et le mode « s » pour les systèmes multi-processeurs.&lt;br /&gt;
&lt;br /&gt;
== Toujours plus de performance ==&lt;br /&gt;
Votre configuration est bien stable depuis un certain temps. Toutefois vous trouvez qu&#039;elle est un peu lente, elle ne vous donne pas satisfaction par rapport à ce qu&#039;elle devrait fournir.&lt;br /&gt;
Cette partie de l&#039;article va explorer comment vérifier et corriger les problèmes de performance des différents composants.&lt;br /&gt;
Note: certaines configuration mono-processeur nécessitent de désactiver LAPIC (nolapic)&lt;br /&gt;
&lt;br /&gt;
=== Le disque dur ===&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le disque dur semble un peu lent et pénalise le système dans son ensemble. Hdparm est là pour vous aider à y voir plus clair. Hdparm est à l&#039;origine conçu pour les systèmes de disques IDE de type PATA. Le nouveau système de disque SATA, ne permet pas toujours en fonction de l&#039;implémentation, l&#039;appel à toutes ces astuces. Cependant les nouvelles séries de kernel à partir du 2.6.15 devrait permettre une gestion plus unifiée des systèmes de disques PATA et SATA.&lt;br /&gt;
&lt;br /&gt;
Le test « hdparm -t /dev/&amp;lt;mon_device&amp;gt; » permet de tester la vitesse de lecture depuis le disque dur jusqu&#039;en mémoire. Une valeur de 25Mo/sec est un minimum pour des machines récentes. Plusieurs paramètres peuvent influencer les performances d&#039;un disque IDE. &lt;br /&gt;
La commande « hdparm -cd » permet de vérifier que les entrées/sorties sont réalisées en 16-bit (le mode 32-bit n&#039;offre pas de performance supplémentaire) alors que le DMA (Direct Memory Access) est activé. Ceci permet la minimisation de l&#039;utilisation du processeur pendant les accès au disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -cd /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
 IO_support   =  0 (default 16-bit)&lt;br /&gt;
 using_dma    =  1 (on)&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande « hdparm -c0d1 /dev/&amp;lt;mon_device&amp;gt; » permet de configurer le périphérique dans ce mode. Le noyau de votre distribution Linux devrait le réaliser de manière automatique.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -I » permet d&#039;obtenir plus d&#039;informations sur la configuration de votre disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -I /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
ATA device, with non-removable media&lt;br /&gt;
	Model Number:       FUJITSU MHT2040AT                       &lt;br /&gt;
	Serial Number:      NN77T3C13KB9&lt;br /&gt;
	Firmware Revision:  0022    &lt;br /&gt;
Standards:&lt;br /&gt;
	Used: ATA/ATAPI-6 T13 1410D revision 3a &lt;br /&gt;
	Supported: 6 5 4 3 &lt;br /&gt;
Configuration:&lt;br /&gt;
	Logical		max	current&lt;br /&gt;
	cylinders	16383	16383&lt;br /&gt;
	heads		16	16&lt;br /&gt;
	sectors/track	63	63&lt;br /&gt;
	--&lt;br /&gt;
	CHS current addressable sectors:   16514064&lt;br /&gt;
	LBA    user addressable sectors:   78140160&lt;br /&gt;
	device size with M = 1024*1024:       38154 MBytes&lt;br /&gt;
	device size with M = 1000*1000:       40007 MBytes (40 GB)&lt;br /&gt;
Capabilities:&lt;br /&gt;
	LBA, IORDY(cannot be disabled)&lt;br /&gt;
	bytes avail on r/w long: 4	Queue depth: 1&lt;br /&gt;
	Standby timer values: spec&#039;d by Standard, no device specific minimum&lt;br /&gt;
	R/W multiple sector transfer: Max = 16	Current = 16&lt;br /&gt;
	Advanced power management level: 128 (0x80)&lt;br /&gt;
	Recommended acoustic management value: 254, current value: 254&lt;br /&gt;
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 &lt;br /&gt;
	     Cycle time: min=120ns recommended=120ns&lt;br /&gt;
	PIO: pio0 pio1 pio2 pio3 pio4 &lt;br /&gt;
	     Cycle time: no flow control=240ns  IORDY flow control=120ns&lt;br /&gt;
Commands/features:&lt;br /&gt;
	Enabled	Supported:&lt;br /&gt;
	   *	READ BUFFER cmd&lt;br /&gt;
	   *	WRITE BUFFER cmd&lt;br /&gt;
	   *	Host Protected Area feature set&lt;br /&gt;
	   *	Look-ahead&lt;br /&gt;
	   *	Write cache&lt;br /&gt;
	   *	Power Management feature set&lt;br /&gt;
		Security Mode feature set&lt;br /&gt;
	   *	SMART feature set&lt;br /&gt;
	   *	Mandatory FLUSH CACHE command &lt;br /&gt;
	   *	Device Configuration Overlay feature set &lt;br /&gt;
	   *	Automatic Acoustic Management feature set &lt;br /&gt;
	   *	SET MAX security extension&lt;br /&gt;
		Power-Up In Standby feature set&lt;br /&gt;
	   *	Advanced Power Management feature set&lt;br /&gt;
	   *	DOWNLOAD MICROCODE cmd&lt;br /&gt;
	   *	SMART self-test &lt;br /&gt;
	   *	SMART error logging &lt;br /&gt;
Security: &lt;br /&gt;
		supported&lt;br /&gt;
	not	enabled&lt;br /&gt;
	not	locked&lt;br /&gt;
		frozen&lt;br /&gt;
	not	expired: security count&lt;br /&gt;
	not	supported: enhanced erase&lt;br /&gt;
	40min for SECURITY ERASE UNIT. &lt;br /&gt;
HW reset results:&lt;br /&gt;
	CBLID- above Vih&lt;br /&gt;
	Device num = 0 determined by the jumper&lt;br /&gt;
Checksum: correct&lt;br /&gt;
[root@R1 ~]#&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On y retrouve le modèle, le numéro de série et la version du firmware qui peuvent être utiles en cas de contact avec le Service Après-Vente ou de mise à jour pour une série de firmwares défaillante.&lt;br /&gt;
&lt;br /&gt;
La ligne commençant par « DMA » dans la partie « Capabilities » permet d&#039;afficher la vitesse de transfert négociée entre le disque dur et le driver IDE de Linux. L&#039;étoile précède la valeur actuelle. Dans cet exemple, le mode udma5 est sélectionné : ceci est conforme aux machines disponibles sur le marché depuis environ 3 ans.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, voici le tableau de conversion entre le mode DMA et la vitesse maximale associée.&lt;br /&gt;
&lt;br /&gt;
Type de fonctionnement&lt;br /&gt;
Vitesse Maximale en MO/sec&lt;br /&gt;
UltraDMA 0&lt;br /&gt;
16,6&lt;br /&gt;
UltraDMA 1&lt;br /&gt;
25&lt;br /&gt;
UltraDMA 2&lt;br /&gt;
33,3&lt;br /&gt;
UltraDMA 3&lt;br /&gt;
44,4&lt;br /&gt;
UltraDMA 4&lt;br /&gt;
66,6&lt;br /&gt;
UltraDMA 5&lt;br /&gt;
100&lt;br /&gt;
UltraDMA 6&lt;br /&gt;
133,33&lt;br /&gt;
&lt;br /&gt;
Une configuration actuelle ne devrait pas être en dessous de UDMA5. Si ce n&#039;était pas le cas, on peut essayer de renégocier la vitesse de transfert à l&#039;aide de la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hdparm -X udma5 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celle-ci permet de forcer le mode UltraDMA5. Il faut utiliser cette commande avec précaution car elle pourrait générer des pertes ou de la corruption de données en cas de transfert pendant ce changement de mode.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi impacter les performances de votre disque dur en modifiant sa vitesse de rotation. Cette fonctionnalité connue sous le nom de Automatic Acoustic Management (AAM) est utilisable avec l&#039;option « -M » de hdparm. La valeur 128 représentera la vitesse la plus faible avec un disque silencieux, la valeur 254 la vitesse la plus élevée mais avec comme contre-partie un disque plus bruyant. On pourra noter des différences de quelques Mo/sec selon les configurations.&lt;br /&gt;
&lt;br /&gt;
Il est aussi à noter que l&#039;utilisation de logiciels permettant une meilleure gestion d&#039;énergie (cpufreq, laptop-mode) peut dégrader les performances d&#039;un disque dur de manière notable.&lt;br /&gt;
&lt;br /&gt;
=== Configuration bas niveau du réseau ===&lt;br /&gt;
&lt;br /&gt;
Le réseau local filaire peut parfois être un peu lent. Voici quelques tests pour vérifier si la lenteur provient du logiciel, du noyau ou du matériel. Tout d&#039;abord, explorons la trousse à outils indispensable pour analyser votre carte réseau : ethtool. Digne successeur de mii-tool, il permet de s&#039;informer sur la configuration de votre carte réseau. &lt;br /&gt;
&lt;br /&gt;
Il suffit de lancer « ethtool &amp;lt;votre_interface&amp;gt; » » pour obtenir la configuration matérielle de votre carte. On y retrouve les modes supportés par votre carte (Supported Link Modes ainsi que la vitesse actuelle (Speed), obtenue par auto-négociation dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
On peut également savoir si le câble réseau est connecté à la carte grâce à la ligne « Link Detected ». Le type de « duplex » utilisé permet également de savoir si la négociation avec l&#039; élément actif au bout de votre câble (commutateur, concentrateur ou une autre machine) a correctement fonctionné. Le duplex définit le mode de  transmission : le mode half-duplex indique que l&#039;on émet puis on reçoit des données, le mode full-duplex indique que l&#039;on peut émettre et recevoir en même temps des données. Le mode full-duplex est donc plus que recommandé pour vos équipements réseaux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# ethtool  eth1&lt;br /&gt;
Settings for eth1:&lt;br /&gt;
	Supported ports: [ TP MII ]&lt;br /&gt;
	Supported link modes:   10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Supports auto-negotiation: Yes&lt;br /&gt;
	Advertised link modes:  10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Advertised auto-negotiation: Yes&lt;br /&gt;
	Speed: 100Mb/s&lt;br /&gt;
	Duplex: Full&lt;br /&gt;
	Port: MII&lt;br /&gt;
	PHYAD: 1&lt;br /&gt;
	Transceiver: internal&lt;br /&gt;
	Auto-negotiation: on&lt;br /&gt;
	Current message level: 0x000020c1 (8385)&lt;br /&gt;
	Link detected: yes&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesurer les {contre}performances de votre réseau ===&lt;br /&gt;
&lt;br /&gt;
Une fois vérifiée la bonne configuration de votre matériel, nous pouvons passer à la vérification des performances entre deux machines.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire netpipe (http://www.scl.ameslab.gov/netpipe/) permet de réaliser des tests de performance mais aussi d&#039;intégrité entre deux machines. Il permet de tester les performances du réseau au travers la couche IP et non pas depuis un mode plus bas niveau comme pourrait l&#039;être un test utilisant directement le driver Ethernet. Ce test permet donc de valider que la configuration matérielle mais aussi logicielle est correcte.&lt;br /&gt;
&lt;br /&gt;
Sur la première machine, exécutez « NPtcp » : netpipe se positionne en mode « serveur ».&lt;br /&gt;
Sur la seconde machine, exécutez « NPtcp -h &amp;lt;machine1&amp;gt; » : netpipe se connecte au serveur netpipe de la machine nommée machine1 pour effectuer le test de performance.&lt;br /&gt;
&lt;br /&gt;
Le test par défaut teste les communication allant de 1 octet jusqu&#039;à 8 Mo. Il peut prendre plusieurs minutes si le réseau est « lent ». Le test va montrer pour chaque taille de paquet la performance obtenue. Il est normal d&#039;obtenir des performances faibles pour des paquets d&#039;une taille inférieure à 8 Ko. Transporter des petits paquets nécessite de réaliser beaucoup d&#039;opérations pour le processeur pour une quantité d&#039;information minime. Les performances seront meilleures à partir d&#039;environ 16 Ko et maximales à partir de 128 Ko. Sur un système utilisant du gigabit ethernet, on constatera une performance de 39Mbps à 256 octets, 287Mbps à 4Ko, 614Mbps à 16Ko, 845Mbps à 128Ko, 895Mbps à 8Mo.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ainsi vérifier et comparer facilement les performances de votre configuration réseau. Netpipe permet également de tester la vitesse du réseau pour une taille de paquets définie entre la taille indiqué par l&#039;option « -l » et la taille indiquée par l&#039;option « -u ». Ainsi, NPtcp -l 16384 -u 16384 permet de tester la bande passante réseau pour une taille de paquet égale à 16Ko.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -n &amp;lt;nb-cycle&amp;gt; » permet de définir le nombre de boucles à réaliser pour le test (50 par défaut). Enfin, pour réaliser des tests « full-duplex », on utilisera l&#039;option « -2 ». Ce test permet de s&#039;assurer du bon fonctionnement du mode de communication permettant l&#039;écriture et la lecture simultanées.&lt;br /&gt;
&lt;br /&gt;
Attention, même si ce test donne de bons résultats, cela ne veut pas dire que la configuration est exempte d&#039;erreur de configuration. Par exemple, les performances réseaux peuvent être très bonnes en point à point mais mauvaises lorsque l&#039;on aura une charge réseau avec plusieurs clients. Dans cette situation, il faut vérifier que le contrôle de flux est bien activé sur toutes les machines. L&#039;option « ethtool -a » permet de vérifier que les champs « rx » et « tx » sont placés sur « on ». Si ce n&#039;était pas le cas activez-les avec la commande « ethtool -A eth0 rx on » et « ethtool -A eth0 tx on ».&lt;br /&gt;
&lt;br /&gt;
Les cartes réseaux, des serveurs essentiellement, permettent maintenant de réaliser le « tcp segment offload ». Cette technique permet de décharger une partie du traitement TCP directement dans l&#039;électronique de la carte réseau. Ceci à pour effet de décharger le processeur central d&#039;un traitement fastidieux. L&#039;option « -k » d&#039;ethtool permet de consulter l&#039;état de cette fonctionnalité (off/on). On pourra l&#039;activer sur des serveurs générant un gros trafic réseau par exemple : « ethtool -K eth0 tso on ».&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant équipé de nouveau outils pour traquer la perte de performances de votre installation réseau. Ceci couplé aux habituels tcpdump/ethereal, voilà une belle panoplie du zorro du réseau.&lt;br /&gt;
&lt;br /&gt;
=== Quand la latence s&#039;en mêle ===&lt;br /&gt;
&lt;br /&gt;
La latence représente le temps nécessaire à un système pour prendre en compte un événement.&lt;br /&gt;
&lt;br /&gt;
Il arrive que certains périphériques de votre machine nécessitant des débits importants ou une latence assez faible sur le bus PCI soient « poussifs ». On retrouve dans cette catégorie les cartes vidéos accélératrice 3D, les cartes son et les cartes d&#039;acquisition firewire ou DVB (récepteur de télévision numérique terrestre : TNT).&lt;br /&gt;
&lt;br /&gt;
Un périphérique branché sur le bus PCI doit attendre que le bus soit libre pour émettre les données vers la mémoire centrale. Le bus PCI qui est le coeur de communication des périphériques est donc soumis en permanence à un arbitrage qui permet de décider qui doit émettre des données et qui doit attendre. Cet arbitrage est en partie réalisé grâce au « latency_timer ».&lt;br /&gt;
&lt;br /&gt;
Chaque périphérique possède une valeur de « latency_timer » comprise en 0 et 248 cycles d&#039;horloge du bus. Plus la valeur sera importante plus le périphérique disposera de temps pour transmettre des informations. Une latence de 248 cycles permet d&#039;obtenir une priorité forte sur le bus, ce qui permet un débit important. A contrario, une latence de 0 indiquera au périphérique qu&#039;il doit cesser ses transmissions si un autre composant à besoin du bus : ceci se traduira par une perte de bande passante importante.&lt;br /&gt;
&lt;br /&gt;
La configuration réalisée par défaut sur votre machine doit être correcte mais il peut arriver qu&#039;une carte 3D ou DVB soit configurée avec une latence trop faible, ce qui  aurait pour conséquence d&#039;offrir une image saccadée et peu fluide. Une carte son offrirait également le même type de symptômes avec un son hâché ou excessivement métallique.&lt;br /&gt;
&lt;br /&gt;
Heureusement, une série d&#039;outils est là pour vous aider à diagnostiquer le problème mais aussi à le résoudre. Le projet pciutils  (http://atrey.karlin.mff.cuni.cz/~mj/linux.shtml#pciutils) contient deux outils indispensables: lspci et setpci. Bien entendu, votre distribution favorite devrait posséder ce logiciel, il vous suffira de l&#039;installer avec  votre gestionnaire de paquet favori (urpmi, apt, smart).&lt;br /&gt;
&lt;br /&gt;
La commande « lspci » vous permet de lister les périphériques PCI disponibles sur votre ordinateur (cf article paru dans le numéro 68).  Cet exemple se basera sur une carte vidéo  ayant pour adresse sur le bus PCI « 01:00.0 ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@lagirafe] lspci -v -s 01:00.0&lt;br /&gt;
01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go5200 32M/64M] (rev a1) (prog-if 00 [VGA])&lt;br /&gt;
	Subsystem: Samsung Electronics Co Ltd: Unknown device c00f&lt;br /&gt;
	Flags: bus master, 66Mhz, medium devsel, latency 16, IRQ 11&lt;br /&gt;
	Memory at c8000000 (32-bit, non-prefetchable) [size=16M]&lt;br /&gt;
	Memory at d8000000 (32-bit, prefetchable) [size=128M]&lt;br /&gt;
	Expansion ROM at &amp;lt;unassigned&amp;gt; [disabled] [size=128K]&lt;br /&gt;
	Capabilities: [60] Power Management version 2&lt;br /&gt;
	Capabilities: [44] AGP version 3.0&lt;br /&gt;
[root@lagirafe]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On retiendra dans cette ligne, la valeur &#039;latency 16&#039;. Ceci risque de poser problème lorsque celle-ci aura besoin d&#039;un fort débit pendant un jeu par exemple. Augmenter la latence va donc se révéler nécessaire pour ce périphérique.&lt;br /&gt;
&lt;br /&gt;
La commande setpci permet de modifier les paramètres PCI d&#039;un périphérique ou d&#039;un bus complet avec tous ses périphériques. &lt;br /&gt;
&lt;br /&gt;
La commande « setpci -v -d 01:* latency_timer=20 » permet de positionner tous les périphériques  du bus 01 à une valeur de 32 cycles. Il est à noter que la commande setpci utilise des valeurs en hexadécimal mais lspci affichera les valeurs en décimal.&lt;br /&gt;
&lt;br /&gt;
Pour en revenir à nos moutons, la correction de la latence de cette carte graphique se fera avec la commande «  setpci -v -d 01:00.0 latency_timer=f8 ». Ceci positionne donc la carte sur la plus grande valeur de latence possible, ce qui lui garantira la plus grande bande passante possible. Il est possible d&#039;utiliser la valeur « ff » comme paramètre pour « latency_timer » mais celui-ci sera converti à la volée par la commande setpci en « 0xf8 ».&lt;br /&gt;
&lt;br /&gt;
Attention, certains composants de votre machine doivent rester en « latency_timer=0 » pour garantir une bon fonctionnement de votre système : il ne faudra donc pas modifier les latences des contrôleurs mémoire et des ponts PCI connectés généralement sur le bus « 0:* ».&lt;br /&gt;
&lt;br /&gt;
== DSDT : le cauchemar continue ! ==&lt;br /&gt;
&lt;br /&gt;
Cette partie de l&#039;article a pour but d&#039;expliquer le problème que peut représenter la table DSDT pour un certain nombre de machines et surtout les ordinateurs portables. &lt;br /&gt;
&lt;br /&gt;
La norme ACPI 3.0 de Septembre 2004 disponible gratuitement à l&#039;adresse http://www.acpi.info/DOWNLOADS/ACPIspec30.pdf définit la DSDT comme une table remplie par un OEM permettant au système d&#039;exploitation de découvrir les ressources pour la gestion de l&#039;énergie avancée, de la gestion thermique ainsi que la gestion du Plug&#039;nPlay des ressources définies par l&#039;ACPI.&lt;br /&gt;
&lt;br /&gt;
Voici une description certes un peu théorique mais nécessaire pour bien comprendre la problématique et ses conséquences. Le constructeur de l&#039;ordinateur doit donc définir dans le BIOS une table contenant une liste de ressources et leurs configuration et ce pour que le système d&#039;exploitation puisse s&#039;en servir. Noble cause n&#039;est il pas ? Tout au long des 618 pages de ce document sont spécifiés les éléments du langage à utiliser ainsi que sa syntaxe. L&#039; « ACPI Source Language » permettra donc aux développeurs d&#039;écrire des DSDT puis de les compiler dans un format nommé « ACPI Machine Language » en utilisant un compilateur adéquat. Le système d&#039;exploitation utilisera la table compilée (AML) pour accéder aux ressources ACPI. &lt;br /&gt;
Sur la plupart des ordinateurs portables, la table DSDT ne respecte pas la norme ACPI dans sa syntaxe. Ceci est très gênant car cela bloque le code de l&#039;interpréteur ACPI du noyau Linux qui essaie de la lire. Le résultat est sans appel, pas d&#039;ACPI, pas de gestion d&#039;énergie avancée, plus de ventilation automatique sur certains modèles d&#039;ordinateurs, plus de touche de gestion de contraste/luminosité sur d&#039;autres etc...&lt;br /&gt;
&lt;br /&gt;
Ceci est très gênant sur un ordinateur portable. Alors que faire ? Dans un premier temps, prévenir le constructeur que son BIOS est incorrect et ne respecte pas la norme ACPI. La réponse se fait toujours attendre pour tous ceux qui « osent » poser la question au support technique : à savoir, les constructeurs ignorent tout simplement les mails de ce type.&lt;br /&gt;
La seconde étape puisque vous êtes devant le fait accompli d&#039;une machine non conforme, il va falloir corriger cette table. Il suffit de récupérer la table actuelle via la commande &#039;cat /proc/acpi/dsdt &amp;gt; dsdt.aml&#039; si vous avez la chance d&#039;avoir un répertoire /proc/acpi malgré une table DSDT endommagée, sinon utilisez la commande &#039;acpidump -b -t dsdt -o dsdt.aml&#039;. La commande acpidump est  fournit dans le projet pmtools (ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools-20050926.tar.bz2) &lt;br /&gt;
Vous avez donc extrait la table DSDT de votre système. Il ne reste plus qu&#039;à essayer de la recompiler. Pour cela, le compilateur IASL de la société Intel (http://developer.intel.com/technology/iapc/acpi/downloads.htm) offre sous Linux et Windows une plate-forme de compilation pour le langage ASL.&lt;br /&gt;
&lt;br /&gt;
Suivez les instructions du site pour télécharger et compiler la version unix d&#039;iasl. Ensuite, décompilez la table avec la commande « iasl -d dsdt.aml ». Le fichier dsdt.dsl vient d&#039;être créé par le décompilateur. Il suffit de le recompiler avec la commande « iasl -tc dsdt.dsl » pour constater les dégâts ! La DSDT que vous avez dans votre BIOS est généralement compilée par le compilateur de Microsoft qui semble autoriser une syntaxe plus qu&#039;approximative.&lt;br /&gt;
Si vous avez de la chance, votre DSDT s&#039;est recompilée sans erreurs, vous obtenez donc un fichier dsdt.hex et un fichier dsdt.aml. Il ne reste plus qu&#039;à injecter cette dsdt dans le noyau Linux et le tour sera joué.&lt;br /&gt;
&lt;br /&gt;
Si vous avez moins de chance, votre DSDT est syntaxiquement incorrecte et génère des erreurs. Les expliquer plus en détails nécessiterait un article complet, il ne sera cité que les plus « habituelles » (sic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2626:                     Field (ECR, DWordAcc, Lock, Preserve) &lt;br /&gt;
Error    1048 -                              ^ Host Operation Region requires ByteAcc access &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette erreur présente à ligne 2626 du fichier dsdt.asl indique une erreur de type dans la déclaration du champ ECR. Il suffit dans ce cas de changer le mot « DWordAcc » par « ByteAcc ». Celle-ci reste assez simple à corriger, on se demande donc pourquoi les constructeurs ne prennent pas le temps de vérifier et de corriger leur BIOS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2672:                     Method (_GLK, 1, NotSerialized) &lt;br /&gt;
Warning  2024 -                                ^ Reserved method has too many arguments ( _GLK requires 0) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode _GLK n&#039;a besoin que de 0 paramètre tandis que ce code en utilise 2 ! La correction est assez simple : il suffit de remplacer la ligne 2672 par « Method(_GLK) ».&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur la correction des erreurs de compilation de votre table dsdt, je vous recommande les tutoriaux disponibles depuis la page http://acpi.sourceforge.net/dsdt/index.php du projet ACPI.&lt;br /&gt;
&lt;br /&gt;
Votre DSDT est compilée avec succès, il ne vous reste plus qu&#039;à l&#039;ajouter pour que votre noyau puisse l&#039;utiliser à la place de celle fourni par le BIOS (modifiable uniquement par le constructeur, via une mise à jour).&lt;br /&gt;
&lt;br /&gt;
Il existe trois possibilités pour inclure une table DSDT : la modification du noyau Linux ( noyau &amp;lt; 2.6.9), l&#039;injection de la DSDT dans la configuration du noyau (noyau &amp;gt;= 2.6.9), l&#039;intégration de la table DSDT dans l&#039;initrd qui nécessite un patch kernel disponible à l&#039;adresse http://gaugusch.at/kernel.shtml.&lt;br /&gt;
&lt;br /&gt;
Pour les noyaux 2.6.9 et supérieur, copiez votre fichier dsdt.hex sous le nom «/usr/src/linux/include/acpi/dsdt_table.h » puis reconfigurez votre noyau.&lt;br /&gt;
Insérer « dsdt_table.h » dans l&#039;option « Include you custom DSDT » disponible dans le menu « Power Management/ACPI/ ». Recompilez votre noyau et redémarrez avec votre nouveau noyau.&lt;br /&gt;
Pour les noyaux inférieurs à 2.6.9, il est possible de modifier le code source de votre noyau pour intégrer votre DSDT mais il est préférable d&#039;utiliser le patch permettant l&#039;insertion de la table DSDT dans l&#039;initrd. Recompilez votre noyau avec ce patch, puis suivez la procédure décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Certaines distributions Linux comme « Mandriva Linux » possèdent le patch qui permet de n&#039;avoir qu&#039;à reconstruire l&#039;initrd avec la commande « mkinitrd –dsdt=/boot/dsdt.aml /boot/initrd-`uname -r`.img `uname -r`  » puis de relancer lilo avant de redémarrer votre machine. Lors du démarrage de celle-ci vous devriez voir le message suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ACPI: Looking for DSDT in initrd... found (at offset 0x4f8d9).&lt;br /&gt;
ACPI-0294: *** Info: Table [DSDT] replaced by host OS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant avec une table DSDT correcte et un ACPI fonctionnel. La question qui reste ouverte est pourquoi les constructeurs n&#039;utilisent pas un compilateur digne de ce nom pour permettre à leur clients de pouvoir utiliser d&#039;autres systèmes d&#039;exploitation que Windows de Microsoft. &lt;br /&gt;
&lt;br /&gt;
Pour la petite histoire, si vous cherchez dans votre dsdt vous risquez de tomber ce genre de lignes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows NT&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft WindowsME: Millennium Edition&amp;quot;), Zero))&lt;br /&gt;
 If (LEqual (SizeOf (\_OS), 0x27)) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque qu&#039;un système d&#039;exploitation souhaite utiliser les ressources ACPI du BIOS, il utilise son nom de système d&#039;exploitation (acpi_os_name). On retrouve donc dans les bios des parties qui ne seront exécutées que pour certains systèmes d&#039;exploitation de Microsoft. On retrouve même certains tests où c&#039;est la longueur du nom qui compte...... Ceci prouve bien que les constructeurs d&#039;ordinateurs savent corriger des tables DSDT pour les systèmes d&#039;exploitation mais pas forcément pour le notre malheureusement. Depuis le noyau 2.6.9, le noyau Linux utilise « Windows NT » comme « acpi_os_name »  pour assurer une meilleure compatibilité matérielle dixit Len Bron d&#039;Intel dans le changelog de cette version.&lt;br /&gt;
&lt;br /&gt;
== Comment trouver le pilote qui va avec votre matériel ? ==&lt;br /&gt;
&lt;br /&gt;
Cette question on se la pose souvent mais uniquement lorsque l&#039;on essaye de brancher un nouveau périphérique sur sa machine. Les distributions récentes permettent de détecter automatiquement votre matériel et de lui associer un pilote avec sa configuration. Ce mécanisme fonctionne plutôt bien mais cela n&#039;évite pas les dysfonctionnements voir l&#039;absence de fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Pour vérifier si votre noyau Linux est capable de supporter un nouveau périphérique PCI par exemple, il suffit d&#039;en récupérer les identifiants PCI (constructeur et produit) puis de les rechercher dans le fichier « /lib/modules/`uname -r`/modules.pcimap » qui est auto-généré lors de la commande depmod.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire « lspcidrake -v » vous permet de trouver les identifiants PCI de votre carte, la commande « lspci » vous permet de trouver le nom de votre périphérique puis faites un « lspci -n » pour en trouver la correspondance numérique. On utilisera la position du périphérique sur le bus pour retrouver la correspondance numérique « 02:05.0 » dans cet exemple.&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome] lspci&lt;br /&gt;
[....]&lt;br /&gt;
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)&lt;br /&gt;
[root@pumphome] lspci -n&lt;br /&gt;
[...]&lt;br /&gt;
02:05.0 Class 0200: 14e4:4401 (rev 01)&lt;br /&gt;
[root@pumphome]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi cette carte réseau possède les identifiants 14e4 (constructeur) et 4401 (produit). Il suffit de rechercher cette valeur dans le modules.pcimap, ce qui nous donnera la correspondance en module (pilote).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome]  grep &amp;quot;0x000014e4 0x00004401&amp;quot; /lib/modules/2.6.12-12mdk-i686-up-4GB/modules.pcimap &lt;br /&gt;
b44               0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
bcm4400      0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit ici que cette carte peut utiliser le driver b44 ou le driver bcm4400. On ne trouve pas toujours les identifiants PCI de produit sous leur forme directe, on peut également trouver « 0Xffffffff » qui indique que tous les cartes du constructeur sont gérées par un module.&lt;br /&gt;
Il ne vous restera plus qu&#039;à effectuer la configuration associée à ce périphérique pour qu&#039;il fonctionne correctement.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
La fin de cet article conclut une toute petite série de deux articles ayant pour but de vulgariser l&#039;architecture de nos machines, de découvrir les outils disponibles pour mieux comprendre leur configuration et au besoin régler les problèmes de configuration matérielle qui ont souvent le don de nous pourrir la vie.&lt;br /&gt;
&lt;br /&gt;
Merci à LaurentJ de #Mandrivafr pour ses tests complémentaires sur les problèmes d&#039;IO-APIC. Un énorme merci à Nicolas Planel pour sa relecture pointue et également Anne pour sa patience de girafe à relire et « quaurigé »mes « photes »,  ainsi qu&#039;à tous ceux qui m&#039;ont aidé à découvrir ce que je restitue dans cet article.&lt;br /&gt;
&lt;br /&gt;
Cet article a été publié dans Linux Magazine France n°78. Il est publié sur Léa avec l&#039;aimable autorisation de l&#039;éditeur.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12762</id>
		<title>Découvrez les ressources de votre machine (La suite)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12762"/>
		<updated>2006-06-10T21:51:37Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Découvrez les ressources de votre machine (La suite) =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A nouvelle année, nouvelles résolutions ! Paru dans le numéro 68, un premier article dédié à la découverte des outils disponibles pour la récupération des configurations de votre machine promettait une suite.  Je vous propose donc de reprendre ce voyage au centre de votre ordinateur. &lt;br /&gt;
&lt;br /&gt;
Cet article sera articulé autour du diagnostic de pannes et des correctifs associés mais aussi de « trucs &amp;amp; astuces » permettant d&#039;optimiser votre configuration.&lt;br /&gt;
&lt;br /&gt;
== Savez-vous planter les choux ? ==&lt;br /&gt;
&lt;br /&gt;
Les choux peut-être pas mais les ordinateurs je pense que c&#039;est arrivé au moins une fois à chaque lecteur qui lit cet article. Rien de plus énervant qu&#039;un écran qui se fige, le pointeur de souris qui ne se déplace plus, le clavier qui ne répond plus non plus.... Planté ! Ce constat est assez facile à établir mais en trouver la cause reste un problème nettement plus complexe tellement le nombre de causes possibles est important.&lt;br /&gt;
&lt;br /&gt;
Deux solutions : ignorer le problème et relancer le système en se disant que ça « passera », ou alors chercher la cause du problème en essayant de trouver une méthode reproduisant le « plantage » tant redouté.&lt;br /&gt;
&lt;br /&gt;
La première solution fonctionne assez bien mais si l&#039;on à faire à un « vrai » problème de configuration matérielle ou logicielle, on arrivera assez vite à ne plus pouvoir éviter la seconde voire la troisième. J&#039;allais oublier cette troisième solution destinée aux plus riches d&#039;entre vous : changer de matériel. Cette solution coûteuse peut parfois se révéler efficace, parfois pas du tout. A quoi bon changer un composant sans savoir si c&#039;était bien celui-ci qui posait problème ?&lt;br /&gt;
Quelque soit la solution retenue, il sera de toute manière nécessaire de localiser la panne pour y apporter la réponse adéquate. Certaines sociétés ou particuliers se sont spécialisés dans ce dépannage ou l&#039;utilisateur est « dépassé » par les événements.&lt;br /&gt;
&lt;br /&gt;
Cet article vous fera, je l&#039;espère, découvrir quelques outils et méthodes pour valider un par un les composants de votre ordinateur. Cela vous permettra j&#039;espère d&#039;être un peu moins dépourvu quand un problème surviendra. L&#039;article reproduira les étapes qu&#039;il faut suivre pour isoler le « fautif ».&lt;br /&gt;
&lt;br /&gt;
== Les causes possibles d&#039;un « plantage » ==&lt;br /&gt;
&lt;br /&gt;
On retrouve deux grandes catégories de pannes provoquant des dysfonctionnements importants sur un système informatique.&lt;br /&gt;
* une panne du matériel&lt;br /&gt;
* une erreur logicielle au niveau du noyau et des pilotes (drivers)&lt;br /&gt;
&lt;br /&gt;
Il faudra donc être capable de séparer la panne matérielle qui « force » l&#039;ordinateur à entrer dans un mode de fonctionnement non prévu et instable, de l&#039;erreur logicielle qui équivaut à demander à l&#039;ordinateur de faire « n&#039;importe quoi » et qui va donc se « planter ».&lt;br /&gt;
&lt;br /&gt;
Le terme « planté » utilisé ici équivaut à un arrêt du système à cause d&#039;erreurs sévères : instruction illégale ou composants défaillants. Le terme de « plantage » est aussi utilisé pour décrire le fonctionnement d&#039;une application qui se ferme inopinément. Ce cas est plus souvent lié à une erreur de programmation de l&#039;application qu&#039;à une erreur du système. Nous ne parlerons donc pas de ce second cas dans cet article.&lt;br /&gt;
&lt;br /&gt;
== La mémoire qui flanche ? ==&lt;br /&gt;
&lt;br /&gt;
Une cause « classique » des dysfonctionnements se situe au niveau de la gestion de la mémoire de votre machine. Je ne parle pas d&#039;allocation mémoire réalisée par votre système d&#039;exploitation favori mais bien de la manière avec laquelle la carte mère configure et utilise vos barrettes de mémoire. Les applications chargent en mémoire des données et des instructions destinées au processeur. Voici un scénario qui peut provoquer l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Votre application favorite est lancée depuis la ligne de commande ou une interface graphique via un « clic » de souris. Votre système d&#039;exploitation va donc charger ce programme en mémoire puis en exécuter les instructions. Au plus bas niveau de votre système, le processeur exécute des instructions en langage machine (assembleur) présente en mémoire.&lt;br /&gt;
Malheureusement, votre mémoire est défaillante et elle n&#039;arrive pas à maintenir un état stable des informations qui lui sont confiées. Par exemple, la lettre C est représentée par le code 67, ou « 1000011 » en binaire. Si la zone mémoire change d&#039;état, alors le contenu de la valeur stocké à cet endroit changera : on pourrait se retrouver avec « 1000010 ». Un seul bit a changé, mais on passe de la lettre &#039;C&#039; (67) à la lettre &#039;B&#039;(66). Le résultat ne se fait pas attendre, le processeur se retrouve à exécuter des instructions qui n&#039;ont plus de sens, provoquant l&#039;arrêt de la machine.&lt;br /&gt;
&lt;br /&gt;
Les pannes de mémoires sont généralement dues à des composants endommagés, des barrettes incompatibles ou un  « timing d&#039;accès » à la mémoire (nommé CAS (Column Address Strobe) dans la plupart des BIOS) trop agressif permettant des lectures dans des zones mémoires avant que les écritures aient eu le temps de se stabiliser pour en garantir le contenu.&lt;br /&gt;
&lt;br /&gt;
Il est assez simple de valider votre configuration mémoire grâce à l&#039;utilitaire memtest (http://www.memtest.org). Cet utilitaire de taille très modeste, 96 Kilo-octets, est écrit en assembleur ce qui lui permet de s&#039;exécuter indépendamment du système d&#039;exploitation. Ceci garantit un test « proche » du matériel, sans sur-couche pouvant apporter d&#039;autres problèmes. &lt;br /&gt;
La version 1.65 actuelle est téléchargeable sous deux formes : une iso que l&#039;on peut graver sur un CDRW de préférence vu la petite taille du programme ou sous la forme d&#039;une amorce système (pre-compiled bootable binary). Il suffira de décompresser l&#039;archive puis d&#039;exécuter la commande suivante : &lt;br /&gt;
&amp;lt;code&amp;gt;dd if=memtest.bin of=/dev/fda&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Ceci écrasera le contenu de votre disquette pour y  copier memtest. Rebootez l&#039;ordinateur avec la disquette placée dans le lecteur, memtest devrait se lancer. &lt;br /&gt;
&lt;br /&gt;
La figure 1, est une capture d&#039;écran de memtest en fonctionnement. Le barre de progression principale affichée en haut à droite de l&#039;écran (2% dans cet exemple) permet de suivre la progression du test. Les erreurs apparaissent dans la partie inférieure de l&#039;écran. Il suffit de laisser fonctionner memtest au moins une fois jusqu&#039;à 100%. Si aucune ligne ne s&#039;est affichée alors vou pouvez considérer que la mémoire est fonctionnelle. Dans le cas contraire,  il faudra soit procéder à son remplacement s&#039;il s&#039;agit d&#039;une seule barrette mémoire, soit tester les barrettes indépendamment (l&#039;une puis l&#039;autre) avec ce logiciel. Dans le cas de 2 ou 3 barrettes qui ne fonctionnement pas correctement ensemble mais qui fonctionnement correctement individuellement, il faudra vérifier qu&#039;elles sont bien de même modèle/marque et remettre le Bios dans une configuration initiale.&lt;br /&gt;
&lt;br /&gt;
Votre mémoire est bonne ? Testons les autres composants de votre machine pour traquer la source de ce plantage.&lt;br /&gt;
&lt;br /&gt;
== Il ne fait pas un peu chaud là ? ==&lt;br /&gt;
&lt;br /&gt;
Ces dix dernières années la puissance consommée et dissipée par nos ordinateurs a littéralement explosé ! Du 486 qui ne nécessitait quasiment pas de ventilateur, on est arrivé à des stations de travail/jeu avec des alimentations pouvant atteindre 1KiloWatt pour les dernières et 500watt pour des modèles plus « grand public ». Le processeur est un des composants gourmands de la machine. Certains modèles peuvent consommer plus de 130W ! Autant dire que si le système est mal ventilé, la montée en charge du processeur peut provoquer un échauffement important provoquant une surchauffe de celui-ci. S&#039;il dépasse ces caractéristiques de fonctionnement, il va alors exécuter du code incorrect provocant  un plantage du système.&lt;br /&gt;
&lt;br /&gt;
Un bon test pour vérifier que votre processeur n&#039;est pas la cause de votre instabilité : commencez par relever la température de votre machine au repos à l&#039;aide des informations fournies soit par l&#039;acpi soit pas lm_sensors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[erwan@R1 ~]$ cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             42 C&lt;br /&gt;
[erwan@R1 ~]$ &lt;br /&gt;
&lt;br /&gt;
[root@konilope ~]# sensors | grep Temp&lt;br /&gt;
M/B Temp:    +39°C  (low  =   +15°C, high =   +40°C)   sensor = thermistor   &lt;br /&gt;
CPU Temp:   +127°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
Temp3:       +44°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
[root@konilope ~]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode utilisant lm_sensors nécessite une interprétation de la part de l&#039;utilisateur. Dans cet exemple, il apparaît évidant que le processeur ne peut avoir une température de fonctionnement aussi élevée (127°C). L&#039;erreur est du à un mauvais calcul de la part de lm_sensors. Il se base sur le type de capteurs thermiques utilisé par la carte mère pour calculer la température des différents composants. Malheureusement, le montage électrique autour du capteur de température peut varier d&#039;un modèle de carte à un autre, ce qui fausse les calculs. On considéra donc, que pour cette machine (konilope) sa température se situe aux alentours de 42° : valeur moyenne entre les deux valeurs « cohérentes » relevées par lm_sensors. On pourra cependant vérifier cette approximation en relevant la température du disque sur à l&#039;aide de smartmontools.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# smartctl -A /dev/hda | grep Temperature&lt;br /&gt;
194 Temperature_Celsius     0x0022   042   052   000    Old_age   Always       -       42&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De manière générale, il est préférable de maintenir sa machine en dessous des 55° et celle de son processeur en dessous de 70°C. Au delà, le système risque d&#039;être instable. Si ce n&#039;est pas le cas, effectuez les modification nécessaire pour y parvenir : meilleure ventilation du processeur ou du boîtier par exemple.&lt;br /&gt;
&lt;br /&gt;
Ensuite, téléchargez l&#039;utilitaire cpuburn depuis un mirroir  (http://pages.sbcglobal.net/redelm/cpuburn_1_4_tar.gz)  ou depuis votre distribution linux favorite (oui, oui, urpmi cpuburn ça fonctionne ;o)).&lt;br /&gt;
&lt;br /&gt;
Vous y trouverez plusieurs programmes nommés burnXX ou XX représente votre processeur. La version P6 sera à utiliser sur les processeurs Intel Pentium 4, la version K7 pour les processeurs Athlon x86. Pour les processeurs plus récents, utilisez la version P6.&lt;br /&gt;
Ce logiciel réalise des boucles en langage assembleur ayant pour but de stresser votre processeur de manière importante et donc le faire chauffer. Lancez cpuburn autant de fois que vous avez de processeur sur votre machine puis observez la température de votre machine. Si lors de la montée en température votre système se fige, alors vous avez un problème de thermie. Si cpuburn ne fait pas planter votre ordinateur au bout de 10mn, vous pouvez considérez que votre système est stable de ce coté là. Vous pouvez aussi utiliser ce test pour vérifier que vos ventilateurs d&#039;ordinateurs portable se déclenchent bien en cas de surchauffe.&lt;br /&gt;
Sur un portable récent, on obtient le résultat suivant au bout de quelques minutes de cpuburn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             80 C&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Malgré la température très élevée du processeur, le système est resté stable ce qui permet de valider qu&#039;il est capable d&#039;encaisser une montée en température élevée. Bien entendu, plus votre machine sera « chaude » plus elle s&#039;usera rapidement. Il ne faut pas oublier que les autres composants peuvent souffrir de la chaleur dégagée par le processeur par exemple : les disques durs en sont un bon exemple car les plateaux ne supportent pas la chaleur.&lt;br /&gt;
Ce test est bon aussi ? A priori, les composants de base de votre système sont en bon état, vous pouvez commencer à regarder du coté configuration logicielle.&lt;br /&gt;
&lt;br /&gt;
== APIC es tu là ? ==&lt;br /&gt;
&lt;br /&gt;
Le manque de stabilité peut aussi s&#039;expliquer par la gestion des interruptions. &lt;br /&gt;
L&#039;architecture PIC (Programmable Interrupt Controllers)  représentée par la famille de composants Intel 8259, permettait une gestion de 8 interruptions pour un unique processeur. On les associe par 2 pour obtenir les 16 niveaux d&#039;interruptions nécessaire depuis nos vieux 80286 (milieu des années 80). Avec l&#039;arrivée des systèmes multi-processeurs, l&#039;architecture APIC (Advanced Programmable Interrupt Controllers) (Intel 82093) à été ajoutée pour permettre une gestion plus fine des interruptions. En effet, dans un contexte multi-processeurs, il est nécessaire de pouvoir choisir quel processeur traitera quelle interruption pour ne pas rester figé dans l&#039;ancien modèle (PIC) où le processeur de  « boot » est assigné à un ensemble d&#039;interruptions. &lt;br /&gt;
&lt;br /&gt;
De plus, l&#039;architecture APIC apporte une gestion de 24 interruptions, une gestion de priorité des interruptions et le routage de l&#039;interruption sur le bon processeur, contre un simple routage de 2*8 interruptions dans le modèle PIC sur un seul processeur. Depuis une dizaine d&#039;années, Intel propose le modèle APIC comme nouvelle architecture, y compris pour les systèmes mono-processeurs. Les ordinateurs récents, y compris les portables, sont maintenant équipés uniquement de composants APIC même si l&#039;on peut obtenir un comportement de type PIC avec ceux-ci.&lt;br /&gt;
&lt;br /&gt;
L&#039;architecture APIC est constituée d&#039;un ou plusieurs composants situé physiquement dans le southbridge (IO-APIC), généralement un par bus, et un composant situé dans le processeur : le Local APIC (LAPIC). Le LAPIC va permettre la gestion des interruptions au niveau du processeur local. Il permet aussi de générer des interruptions par exemple pour transmettre des interruptions à des processeurs voisins dans le contexte d&#039;un système multi-processeurs, ces messages sont appelés IPI (Inter Processor Interrupts). &lt;br /&gt;
&lt;br /&gt;
De plus le Local APIC (LAPIC) inclut un « timer » de précision cadencé à la fréquence du bus, généralement il peut être utilisé par l&#039;ordonnanceur de votre système d&#039;exploitation favori ou d&#039;autres outils de haut niveau (profiler kernel : oprofile, vtune). Les LAPIC et l&#039;IO-APIC sont reliés par un bus spécifique pour permettre un échange rapide des informations. &lt;br /&gt;
Schema logique d&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les IO-APIC vont donc se charger de collecter les interruptions provenant des périphériques systèmes et d&#039;en assurer le transfert vers le ou les processeur(s) suivant une route préalablement programmée par le BIOS et/ou le système d&#039;exploitation.&lt;br /&gt;
&lt;br /&gt;
Cependant, l&#039;implémentation des APIC dans les BIOS peut provoquer certaines instabilités sur votre système Linux. Par expérience, il n&#039;y a pas de règle pour trouver la configuration qui peut aider votre machine à se stabiliser car cela dépend de chaque machine. Des différences peuvent même exister entre  deux versions de BIOS d&#039;un même ordinateur. Cependant, dans la série 2.6 du noyau Linux et les version 2.4 récentes nous disposons d&#039;outils permettant de re-paramétrer cette configuration en activant/désactivant les IO-APIC ou les LAPIC.&lt;br /&gt;
&lt;br /&gt;
Chaque composant possède un activateur ou un inhibiteur, on aura donc d&#039;un coté « apic » et « noapic » pour la gestion des IO-APIC, « nolapic » et « lapic » de l&#039;autre pour la gestion des LAPIC. Ces 4 options sont à utiliser sur la ligne de commande du noyau, c&#039;est à dire au moment où le « bootloader » (lilo ou grub par exemple) va charger le noyau en mémoire. L&#039;utilisation de « apic » et « lapic » permet d&#039;activer ces composants qui ne l&#039;ont pas été par le BIOS. L&#039;activateur « apic » n&#039;est disponible que les architectures de type x86_64 car celui-ci est déjà activé sur les systèmes de type x86. On désactivera les APIC dans le cas où le système affiche des messages d&#039;erreurs sur les APIC comme : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;« APIC error on CPU0: 40(40) »&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ou&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;MP-BIOS bug: 8254 timer not connected to IO-APIC&lt;br /&gt;
failed.&lt;br /&gt;
timer doesn&#039;t work through the IO-APIC - disabling NMI Watchdog!&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La désactivation des IO-APIC permet par exemple de corriger le comportement parfois récalcitrant de certaines cartes vidéos qui ne parviennent pas à afficher correctement en mode 2D/3D (écran noir par exemple).&lt;br /&gt;
&lt;br /&gt;
La non activation des LAPIC peut avoir comme conséquence un dysfonctionnement de l&#039;ACPI (gestion d&#039;énergie avancée). Ce cas est traité par le noyau, vous retrouverez dans les messages de démarrage la ligne suivante : « &amp;quot;Local APIC disabled by BIOS you can enable it with lapic ».&lt;br /&gt;
&lt;br /&gt;
Pour résumer, si votre machine, en général à architecture mono-processeur, a tendance à se bloquer lors de l&#039;utilisation de périphériques tels que le port usb, la carte graphique ou la carte son, essayez de désactiver le LAPIC puis l&#039; IO-APIC puis les 2.  Pour exemple, les cartes mère A7N8X de chez Asus ont largement tendance à se bloquer si l&#039;on ne spécifie pas « nolapic » lors du boot. Sur certaines machines, il faudra faire le contraire à savoir forcer l&#039;activation des LAPIC. Ceci dépendra de votre machine et de sa conception.&lt;br /&gt;
&lt;br /&gt;
== A vos marques, rebootez ! ==&lt;br /&gt;
&lt;br /&gt;
Certains machines peuvent présenter quelques soucis pour redémarrer. Encore une fois, on retrouve au coeur de ce problème l&#039;interaction entre le noyau et le matériel notamment l&#039;ACPI. Les ordinateurs portables dont le modèle HP nc6120 ont par exemple le bon goût de rester bloqués sur le message « No reboot fixup found for your hardware ». Ceci indique que le noyau ne connaît pas de contournement pour ce matériel (ce qui est le cas de la quasi totalité des ordinateurs) mais puisque vous voyez ce message c&#039;est que votre machine n&#039;a pas réussi à rebooter. Heureusement, il existe des contournements pour permettre un redémarrage plus « bas niveau ». Le noyau défini les modes suivants : « b » « c » « h » « s » et « w ».&lt;br /&gt;
Le mode de reboot peut être défini sur la ligne de commande du noyau suivant la forme « reboot=&amp;lt;mode&amp;gt; ». Le mode « s » est réservé au systèmes multi-processeurs, elle va réinitialiser chacun des processeurs.&lt;br /&gt;
&lt;br /&gt;
Le mode « b » permet quant à lui de rebooter en faisant un appel direct au bios qui se chargera de faire redémarrer la machine. Ce mode fonctionne plutôt bien car dans le cas d&#039;un BIOS posant problème sur l&#039;ACPI, on peut espérer avoir un reboot correct. C&#039;est le cas sur de notre portable cité précédement.&lt;br /&gt;
&lt;br /&gt;
Le mode « h » se chargera de faire redémarrer la machine en réinitialisant le processeur. C&#039;est l&#039;équivalent du mode « s » pour les environnements mono-processeurs.  Pour finir, les modes « c » et « w » correspondent aux modes « cold » et « warn » : ces modes sont plus connus sous le nom de « reboot à froid »  et « reboot à chaud ». Le premier effectuera les tests de mémoire tandis que le second exécutera un reboot plus court.&lt;br /&gt;
&lt;br /&gt;
De manière générale, on utilisera plutôt le mode « b » ou « h » pour les systèmes mono-processeurs récalcitrant et le mode « s » pour les systèmes multi-processeurs.&lt;br /&gt;
&lt;br /&gt;
== Toujours plus de performance ==&lt;br /&gt;
Votre configuration est bien stable depuis un certain temps. Toutefois vous trouvez qu&#039;elle est un peu lente, elle ne vous donne pas satisfaction par rapport à ce qu&#039;elle devrait fournir.&lt;br /&gt;
Cette partie de l&#039;article va explorer comment vérifier et corriger les problèmes de performance des différents composants.&lt;br /&gt;
Note: certaines configuration mono-processeur nécessitent de désactiver LAPIC (nolapic)&lt;br /&gt;
&lt;br /&gt;
=== Le disque dur ===&lt;br /&gt;
&lt;br /&gt;
Il arrive parfois que le disque dur semble un peu lent et pénalise le système dans son ensemble. Hdparm est là pour vous aider à y voir plus clair. Hdparm est à l&#039;origine conçu pour les systèmes de disques IDE de type PATA. Le nouveau système de disque SATA, ne permet pas toujours en fonction de l&#039;implémentation, l&#039;appel à toutes ces astuces. Cependant les nouvelles séries de kernel à partir du 2.6.15 devrait permettre une gestion plus unifiée des systèmes de disques PATA et SATA.&lt;br /&gt;
&lt;br /&gt;
Le test « hdparm -t /dev/&amp;lt;mon_device&amp;gt; » permet de tester la vitesse de lecture depuis le disque dur jusqu&#039;en mémoire. Une valeur de 25Mo/sec est un minimum pour des machines récentes. Plusieurs paramètres peuvent influencer les performances d&#039;un disque IDE. &lt;br /&gt;
La commande « hdparm -cd » permet de vérifier que les entrées/sorties sont réalisées en 16-bit (le mode 32-bit n&#039;offre pas de performance supplémentaire) alors que le DMA (Direct Memory Access) est activé. Ceci permet la minimisation de l&#039;utilisation du processeur pendant les accès au disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -cd /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
 IO_support   =  0 (default 16-bit)&lt;br /&gt;
 using_dma    =  1 (on)&lt;br /&gt;
[root@R1 ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La commande « hdparm -c0d1 /dev/&amp;lt;mon_device&amp;gt; » permet de configurer le périphérique dans ce mode. Le noyau de votre distribution Linux devrait le réaliser de manière automatique.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -I » permet d&#039;obtenir plus d&#039;informations sur la configuration de votre disque dur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@R1 ~]# hdparm -I /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
ATA device, with non-removable media&lt;br /&gt;
	Model Number:       FUJITSU MHT2040AT                       &lt;br /&gt;
	Serial Number:      NN77T3C13KB9&lt;br /&gt;
	Firmware Revision:  0022    &lt;br /&gt;
Standards:&lt;br /&gt;
	Used: ATA/ATAPI-6 T13 1410D revision 3a &lt;br /&gt;
	Supported: 6 5 4 3 &lt;br /&gt;
Configuration:&lt;br /&gt;
	Logical		max	current&lt;br /&gt;
	cylinders	16383	16383&lt;br /&gt;
	heads		16	16&lt;br /&gt;
	sectors/track	63	63&lt;br /&gt;
	--&lt;br /&gt;
	CHS current addressable sectors:   16514064&lt;br /&gt;
	LBA    user addressable sectors:   78140160&lt;br /&gt;
	device size with M = 1024*1024:       38154 MBytes&lt;br /&gt;
	device size with M = 1000*1000:       40007 MBytes (40 GB)&lt;br /&gt;
Capabilities:&lt;br /&gt;
	LBA, IORDY(cannot be disabled)&lt;br /&gt;
	bytes avail on r/w long: 4	Queue depth: 1&lt;br /&gt;
	Standby timer values: spec&#039;d by Standard, no device specific minimum&lt;br /&gt;
	R/W multiple sector transfer: Max = 16	Current = 16&lt;br /&gt;
	Advanced power management level: 128 (0x80)&lt;br /&gt;
	Recommended acoustic management value: 254, current value: 254&lt;br /&gt;
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 &lt;br /&gt;
	     Cycle time: min=120ns recommended=120ns&lt;br /&gt;
	PIO: pio0 pio1 pio2 pio3 pio4 &lt;br /&gt;
	     Cycle time: no flow control=240ns  IORDY flow control=120ns&lt;br /&gt;
Commands/features:&lt;br /&gt;
	Enabled	Supported:&lt;br /&gt;
	   *	READ BUFFER cmd&lt;br /&gt;
	   *	WRITE BUFFER cmd&lt;br /&gt;
	   *	Host Protected Area feature set&lt;br /&gt;
	   *	Look-ahead&lt;br /&gt;
	   *	Write cache&lt;br /&gt;
	   *	Power Management feature set&lt;br /&gt;
		Security Mode feature set&lt;br /&gt;
	   *	SMART feature set&lt;br /&gt;
	   *	Mandatory FLUSH CACHE command &lt;br /&gt;
	   *	Device Configuration Overlay feature set &lt;br /&gt;
	   *	Automatic Acoustic Management feature set &lt;br /&gt;
	   *	SET MAX security extension&lt;br /&gt;
		Power-Up In Standby feature set&lt;br /&gt;
	   *	Advanced Power Management feature set&lt;br /&gt;
	   *	DOWNLOAD MICROCODE cmd&lt;br /&gt;
	   *	SMART self-test &lt;br /&gt;
	   *	SMART error logging &lt;br /&gt;
Security: &lt;br /&gt;
		supported&lt;br /&gt;
	not	enabled&lt;br /&gt;
	not	locked&lt;br /&gt;
		frozen&lt;br /&gt;
	not	expired: security count&lt;br /&gt;
	not	supported: enhanced erase&lt;br /&gt;
	40min for SECURITY ERASE UNIT. &lt;br /&gt;
HW reset results:&lt;br /&gt;
	CBLID- above Vih&lt;br /&gt;
	Device num = 0 determined by the jumper&lt;br /&gt;
Checksum: correct&lt;br /&gt;
[root@R1 ~]#&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On y retrouve le modèle, le numéro de série et la version du firmware qui peuvent être utiles en cas de contact avec le Service Après-Vente ou de mise à jour pour une série de firmwares défaillante.&lt;br /&gt;
&lt;br /&gt;
La ligne commençant par « DMA » dans la partie « Capabilities » permet d&#039;afficher la vitesse de transfert négociée entre le disque dur et le driver IDE de Linux. L&#039;étoile précède la valeur actuelle. Dans cet exemple, le mode udma5 est sélectionné : ceci est conforme aux machines disponibles sur le marché depuis environ 3 ans.&lt;br /&gt;
&lt;br /&gt;
Pour rappel, voici le tableau de conversion entre le mode DMA et la vitesse maximale associée.&lt;br /&gt;
&lt;br /&gt;
Type de fonctionnement&lt;br /&gt;
Vitesse Maximale en MO/sec&lt;br /&gt;
UltraDMA 0&lt;br /&gt;
16,6&lt;br /&gt;
UltraDMA 1&lt;br /&gt;
25&lt;br /&gt;
UltraDMA 2&lt;br /&gt;
33,3&lt;br /&gt;
UltraDMA 3&lt;br /&gt;
44,4&lt;br /&gt;
UltraDMA 4&lt;br /&gt;
66,6&lt;br /&gt;
UltraDMA 5&lt;br /&gt;
100&lt;br /&gt;
UltraDMA 6&lt;br /&gt;
133,33&lt;br /&gt;
&lt;br /&gt;
Une configuration actuelle ne devrait pas être en dessous de UDMA5. Si ce n&#039;était pas le cas, on peut essayer de renégocier la vitesse de transfert à l&#039;aide de la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hdparm -X udma5 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celle-ci permet de forcer le mode UltraDMA5. Il faut utiliser cette commande avec précaution car elle pourrait générer des pertes ou de la corruption de données en cas de transfert pendant ce changement de mode.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi impacter les performances de votre disque dur en modifiant sa vitesse de rotation. Cette fonctionnalité connue sous le nom de Automatic Acoustic Management (AAM) est utilisable avec l&#039;option « -M » de hdparm. La valeur 128 représentera la vitesse la plus faible avec un disque silencieux, la valeur 254 la vitesse la plus élevée mais avec comme contre-partie un disque plus bruyant. On pourra noter des différences de quelques Mo/sec selon les configurations.&lt;br /&gt;
&lt;br /&gt;
Il est aussi à noter que l&#039;utilisation de logiciels permettant une meilleure gestion d&#039;énergie (cpufreq, laptop-mode) peut dégrader les performances d&#039;un disque dur de manière notable.&lt;br /&gt;
&lt;br /&gt;
=== Configuration bas niveau du réseau ===&lt;br /&gt;
&lt;br /&gt;
Le réseau local filaire peut parfois être un peu lent. Voici quelques tests pour vérifier si la lenteur provient du logiciel, du noyau ou du matériel. Tout d&#039;abord, explorons la trousse à outils indispensable pour analyser votre carte réseau : ethtool. Digne successeur de mii-tool, il permet de s&#039;informer sur la configuration de votre carte réseau. &lt;br /&gt;
&lt;br /&gt;
Il suffit de lancer « ethtool &amp;lt;votre_interface&amp;gt; » » pour obtenir la configuration matérielle de votre carte. On y retrouve les modes supportés par votre carte (Supported Link Modes ainsi que la vitesse actuelle (Speed), obtenue par auto-négociation dans cet exemple.&lt;br /&gt;
&lt;br /&gt;
On peut également savoir si le câble réseau est connecté à la carte grâce à la ligne « Link Detected ». Le type de « duplex » utilisé permet également de savoir si la négociation avec l&#039; élément actif au bout de votre câble (commutateur, concentrateur ou une autre machine) a correctement fonctionné. Le duplex définit le mode de  transmission : le mode half-duplex indique que l&#039;on émet puis on reçoit des données, le mode full-duplex indique que l&#039;on peut émettre et recevoir en même temps des données. Le mode full-duplex est donc plus que recommandé pour vos équipements réseaux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@konilope ~]# ethtool  eth1&lt;br /&gt;
Settings for eth1:&lt;br /&gt;
	Supported ports: [ TP MII ]&lt;br /&gt;
	Supported link modes:   10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Supports auto-negotiation: Yes&lt;br /&gt;
	Advertised link modes:  10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Advertised auto-negotiation: Yes&lt;br /&gt;
	Speed: 100Mb/s&lt;br /&gt;
	Duplex: Full&lt;br /&gt;
	Port: MII&lt;br /&gt;
	PHYAD: 1&lt;br /&gt;
	Transceiver: internal&lt;br /&gt;
	Auto-negotiation: on&lt;br /&gt;
	Current message level: 0x000020c1 (8385)&lt;br /&gt;
	Link detected: yes&lt;br /&gt;
[root@konilope ~]# &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesurer les {contre}performances de votre réseau ===&lt;br /&gt;
&lt;br /&gt;
Une fois vérifiée la bonne configuration de votre matériel, nous pouvons passer à la vérification des performances entre deux machines.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire netpipe (http://www.scl.ameslab.gov/netpipe/) permet de réaliser des tests de performance mais aussi d&#039;intégrité entre deux machines. Il permet de tester les performances du réseau au travers la couche IP et non pas depuis un mode plus bas niveau comme pourrait l&#039;être un test utilisant directement le driver Ethernet. Ce test permet donc de valider que la configuration matérielle mais aussi logicielle est correcte.&lt;br /&gt;
&lt;br /&gt;
Sur la première machine, exécutez « NPtcp » : netpipe se positionne en mode « serveur ».&lt;br /&gt;
Sur la seconde machine, exécutez « NPtcp -h &amp;lt;machine1&amp;gt; » : netpipe se connecte au serveur netpipe de la machine nommée machine1 pour effectuer le test de performance.&lt;br /&gt;
&lt;br /&gt;
Le test par défaut teste les communication allant de 1 octet jusqu&#039;à 8 Mo. Il peut prendre plusieurs minutes si le réseau est « lent ». Le test va montrer pour chaque taille de paquet la performance obtenue. Il est normal d&#039;obtenir des performances faibles pour des paquets d&#039;une taille inférieure à 8 Ko. Transporter des petits paquets nécessite de réaliser beaucoup d&#039;opérations pour le processeur pour une quantité d&#039;information minime. Les performances seront meilleures à partir d&#039;environ 16 Ko et maximales à partir de 128 Ko. Sur un système utilisant du gigabit ethernet, on constatera une performance de 39Mbps à 256 octets, 287Mbps à 4Ko, 614Mbps à 16Ko, 845Mbps à 128Ko, 895Mbps à 8Mo.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ainsi vérifier et comparer facilement les performances de votre configuration réseau. Netpipe permet également de tester la vitesse du réseau pour une taille de paquets définie entre la taille indiqué par l&#039;option « -l » et la taille indiquée par l&#039;option « -u ». Ainsi, NPtcp -l 16384 -u 16384 permet de tester la bande passante réseau pour une taille de paquet égale à 16Ko.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -n &amp;lt;nb-cycle&amp;gt; » permet de définir le nombre de boucles à réaliser pour le test (50 par défaut). Enfin, pour réaliser des tests « full-duplex », on utilisera l&#039;option « -2 ». Ce test permet de s&#039;assurer du bon fonctionnement du mode de communication permettant l&#039;écriture et la lecture simultanées.&lt;br /&gt;
&lt;br /&gt;
Attention, même si ce test donne de bons résultats, cela ne veut pas dire que la configuration est exempte d&#039;erreur de configuration. Par exemple, les performances réseaux peuvent être très bonnes en point à point mais mauvaises lorsque l&#039;on aura une charge réseau avec plusieurs clients. Dans cette situation, il faut vérifier que le contrôle de flux est bien activé sur toutes les machines. L&#039;option « ethtool -a » permet de vérifier que les champs « rx » et « tx » sont placés sur « on ». Si ce n&#039;était pas le cas activez-les avec la commande « ethtool -A eth0 rx on » et « ethtool -A eth0 tx on ».&lt;br /&gt;
&lt;br /&gt;
Les cartes réseaux, des serveurs essentiellement, permettent maintenant de réaliser le « tcp segment offload ». Cette technique permet de décharger une partie du traitement TCP directement dans l&#039;électronique de la carte réseau. Ceci à pour effet de décharger le processeur central d&#039;un traitement fastidieux. L&#039;option « -k » d&#039;ethtool permet de consulter l&#039;état de cette fonctionnalité (off/on). On pourra l&#039;activer sur des serveurs générant un gros trafic réseau par exemple : « ethtool -K eth0 tso on ».&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant équipé de nouveau outils pour traquer la perte de performances de votre installation réseau. Ceci couplé aux habituels tcpdump/ethereal, voilà une belle panoplie du zorro du réseau.&lt;br /&gt;
&lt;br /&gt;
=== Quand la latence s&#039;en mêle ===&lt;br /&gt;
&lt;br /&gt;
La latence représente le temps nécessaire à un système pour prendre en compte un événement.&lt;br /&gt;
&lt;br /&gt;
Il arrive que certains périphériques de votre machine nécessitant des débits importants ou une latence assez faible sur le bus PCI soient « poussifs ». On retrouve dans cette catégorie les cartes vidéos accélératrice 3D, les cartes son et les cartes d&#039;acquisition firewire ou DVB (récepteur de télévision numérique terrestre : TNT).&lt;br /&gt;
&lt;br /&gt;
Un périphérique branché sur le bus PCI doit attendre que le bus soit libre pour émettre les données vers la mémoire centrale. Le bus PCI qui est le coeur de communication des périphériques est donc soumis en permanence à un arbitrage qui permet de décider qui doit émettre des données et qui doit attendre. Cet arbitrage est en partie réalisé grâce au « latency_timer ».&lt;br /&gt;
&lt;br /&gt;
Chaque périphérique possède une valeur de « latency_timer » comprise en 0 et 248 cycles d&#039;horloge du bus. Plus la valeur sera importante plus le périphérique disposera de temps pour transmettre des informations. Une latence de 248 cycles permet d&#039;obtenir une priorité forte sur le bus, ce qui permet un débit important. A contrario, une latence de 0 indiquera au périphérique qu&#039;il doit cesser ses transmissions si un autre composant à besoin du bus : ceci se traduira par une perte de bande passante importante.&lt;br /&gt;
&lt;br /&gt;
La configuration réalisée par défaut sur votre machine doit être correcte mais il peut arriver qu&#039;une carte 3D ou DVB soit configurée avec une latence trop faible, ce qui  aurait pour conséquence d&#039;offrir une image saccadée et peu fluide. Une carte son offrirait également le même type de symptômes avec un son hâché ou excessivement métallique.&lt;br /&gt;
&lt;br /&gt;
Heureusement, une série d&#039;outils est là pour vous aider à diagnostiquer le problème mais aussi à le résoudre. Le projet pciutils  (http://atrey.karlin.mff.cuni.cz/~mj/linux.shtml#pciutils) contient deux outils indispensables: lspci et setpci. Bien entendu, votre distribution favorite devrait posséder ce logiciel, il vous suffira de l&#039;installer avec  votre gestionnaire de paquet favori (urpmi, apt, smart).&lt;br /&gt;
&lt;br /&gt;
La commande « lspci » vous permet de lister les périphériques PCI disponibles sur votre ordinateur (cf article paru dans le numéro 68).  Cet exemple se basera sur une carte vidéo  ayant pour adresse sur le bus PCI « 01:00.0 ».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@lagirafe] lspci -v -s 01:00.0&lt;br /&gt;
01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go5200 32M/64M] (rev a1) (prog-if 00 [VGA])&lt;br /&gt;
	Subsystem: Samsung Electronics Co Ltd: Unknown device c00f&lt;br /&gt;
	Flags: bus master, 66Mhz, medium devsel, latency 16, IRQ 11&lt;br /&gt;
	Memory at c8000000 (32-bit, non-prefetchable) [size=16M]&lt;br /&gt;
	Memory at d8000000 (32-bit, prefetchable) [size=128M]&lt;br /&gt;
	Expansion ROM at &amp;lt;unassigned&amp;gt; [disabled] [size=128K]&lt;br /&gt;
	Capabilities: [60] Power Management version 2&lt;br /&gt;
	Capabilities: [44] AGP version 3.0&lt;br /&gt;
[root@lagirafe]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On retiendra dans cette ligne, la valeur &#039;latency 16&#039;. Ceci risque de poser problème lorsque celle-ci aura besoin d&#039;un fort débit pendant un jeu par exemple. Augmenter la latence va donc se révéler nécessaire pour ce périphérique.&lt;br /&gt;
&lt;br /&gt;
La commande setpci permet de modifier les paramètres PCI d&#039;un périphérique ou d&#039;un bus complet avec tous ses périphériques. &lt;br /&gt;
&lt;br /&gt;
La commande « setpci -v -d 01:* latency_timer=20 » permet de positionner tous les périphériques  du bus 01 à une valeur de 32 cycles. Il est à noter que la commande setpci utilise des valeurs en hexadécimal mais lspci affichera les valeurs en décimal.&lt;br /&gt;
&lt;br /&gt;
Pour en revenir à nos moutons, la correction de la latence de cette carte graphique se fera avec la commande «  setpci -v -d 01:00.0 latency_timer=f8 ». Ceci positionne donc la carte sur la plus grande valeur de latence possible, ce qui lui garantira la plus grande bande passante possible. Il est possible d&#039;utiliser la valeur « ff » comme paramètre pour « latency_timer » mais celui-ci sera converti à la volée par la commande setpci en « 0xf8 ».&lt;br /&gt;
&lt;br /&gt;
Attention, certains composants de votre machine doivent rester en « latency_timer=0 » pour garantir une bon fonctionnement de votre système : il ne faudra donc pas modifier les latences des contrôleurs mémoire et des ponts PCI connectés généralement sur le bus « 0:* ».&lt;br /&gt;
&lt;br /&gt;
== DSDT : le cauchemar continue ! ==&lt;br /&gt;
&lt;br /&gt;
Cette partie de l&#039;article a pour but d&#039;expliquer le problème que peut représenter la table DSDT pour un certain nombre de machines et surtout les ordinateurs portables. &lt;br /&gt;
&lt;br /&gt;
La norme ACPI 3.0 de Septembre 2004 disponible gratuitement à l&#039;adresse http://www.acpi.info/DOWNLOADS/ACPIspec30.pdf définit la DSDT comme une table remplie par un OEM permettant au système d&#039;exploitation de découvrir les ressources pour la gestion de l&#039;énergie avancée, de la gestion thermique ainsi que la gestion du Plug&#039;nPlay des ressources définies par l&#039;ACPI.&lt;br /&gt;
&lt;br /&gt;
Voici une description certes un peu théorique mais nécessaire pour bien comprendre la problématique et ses conséquences. Le constructeur de l&#039;ordinateur doit donc définir dans le BIOS une table contenant une liste de ressources et leurs configuration et ce pour que le système d&#039;exploitation puisse s&#039;en servir. Noble cause n&#039;est il pas ? Tout au long des 618 pages de ce document sont spécifiés les éléments du langage à utiliser ainsi que sa syntaxe. L&#039; « ACPI Source Language » permettra donc aux développeurs d&#039;écrire des DSDT puis de les compiler dans un format nommé « ACPI Machine Language » en utilisant un compilateur adéquat. Le système d&#039;exploitation utilisera la table compilée (AML) pour accéder aux ressources ACPI. &lt;br /&gt;
Sur la plupart des ordinateurs portables, la table DSDT ne respecte pas la norme ACPI dans sa syntaxe. Ceci est très gênant car cela bloque le code de l&#039;interpréteur ACPI du noyau Linux qui essaie de la lire. Le résultat est sans appel, pas d&#039;ACPI, pas de gestion d&#039;énergie avancée, plus de ventilation automatique sur certains modèles d&#039;ordinateurs, plus de touche de gestion de contraste/luminosité sur d&#039;autres etc...&lt;br /&gt;
&lt;br /&gt;
Ceci est très gênant sur un ordinateur portable. Alors que faire ? Dans un premier temps, prévenir le constructeur que son BIOS est incorrect et ne respecte pas la norme ACPI. La réponse se fait toujours attendre pour tous ceux qui « osent » poser la question au support technique : à savoir, les constructeurs ignorent tout simplement les mails de ce type.&lt;br /&gt;
La seconde étape puisque vous êtes devant le fait accompli d&#039;une machine non conforme, il va falloir corriger cette table. Il suffit de récupérer la table actuelle via la commande &#039;cat /proc/acpi/dsdt &amp;gt; dsdt.aml&#039; si vous avez la chance d&#039;avoir un répertoire /proc/acpi malgré une table DSDT endommagée, sinon utilisez la commande &#039;acpidump -b -t dsdt -o dsdt.aml&#039;. La commande acpidump est  fournit dans le projet pmtools (ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools-20050926.tar.bz2) &lt;br /&gt;
Vous avez donc extrait la table DSDT de votre système. Il ne reste plus qu&#039;à essayer de la recompiler. Pour cela, le compilateur IASL de la société Intel (http://developer.intel.com/technology/iapc/acpi/downloads.htm) offre sous Linux et Windows une plate-forme de compilation pour le langage ASL.&lt;br /&gt;
&lt;br /&gt;
Suivez les instructions du site pour télécharger et compiler la version unix d&#039;iasl. Ensuite, décompilez la table avec la commande « iasl -d dsdt.aml ». Le fichier dsdt.dsl vient d&#039;être créé par le décompilateur. Il suffit de le recompiler avec la commande « iasl -tc dsdt.dsl » pour constater les dégâts ! La DSDT que vous avez dans votre BIOS est généralement compilée par le compilateur de Microsoft qui semble autoriser une syntaxe plus qu&#039;approximative.&lt;br /&gt;
Si vous avez de la chance, votre DSDT s&#039;est recompilée sans erreurs, vous obtenez donc un fichier dsdt.hex et un fichier dsdt.aml. Il ne reste plus qu&#039;à injecter cette dsdt dans le noyau Linux et le tour sera joué.&lt;br /&gt;
&lt;br /&gt;
Si vous avez moins de chance, votre DSDT est syntaxiquement incorrecte et génère des erreurs. Les expliquer plus en détails nécessiterait un article complet, il ne sera cité que les plus « habituelles » (sic).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2626:                     Field (ECR, DWordAcc, Lock, Preserve) &lt;br /&gt;
Error    1048 -                              ^ Host Operation Region requires ByteAcc access &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette erreur présente à ligne 2626 du fichier dsdt.asl indique une erreur de type dans la déclaration du champ ECR. Il suffit dans ce cas de changer le mot « DWordAcc » par « ByteAcc ». Celle-ci reste assez simple à corriger, on se demande donc pourquoi les constructeurs ne prennent pas le temps de vérifier et de corriger leur BIOS.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dsdt.dsl  2672:                     Method (_GLK, 1, NotSerialized) &lt;br /&gt;
Warning  2024 -                                ^ Reserved method has too many arguments ( _GLK requires 0) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode _GLK n&#039;a besoin que de 0 paramètre tandis que ce code en utilise 2 ! La correction est assez simple : il suffit de remplacer la ligne 2672 par « Method(_GLK) ».&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur la correction des erreurs de compilation de votre table dsdt, je vous recommande les tutoriaux disponibles depuis la page http://acpi.sourceforge.net/dsdt/index.php du projet ACPI.&lt;br /&gt;
&lt;br /&gt;
Votre DSDT est compilée avec succès, il ne vous reste plus qu&#039;à l&#039;ajouter pour que votre noyau puisse l&#039;utiliser à la place de celle fourni par le BIOS (modifiable uniquement par le constructeur, via une mise à jour).&lt;br /&gt;
&lt;br /&gt;
Il existe trois possibilités pour inclure une table DSDT : la modification du noyau Linux ( noyau &amp;lt; 2.6.9), l&#039;injection de la DSDT dans la configuration du noyau (noyau &amp;gt;= 2.6.9), l&#039;intégration de la table DSDT dans l&#039;initrd qui nécessite un patch kernel disponible à l&#039;adresse http://gaugusch.at/kernel.shtml.&lt;br /&gt;
&lt;br /&gt;
Pour les noyaux 2.6.9 et supérieur, copiez votre fichier dsdt.hex sous le nom «/usr/src/linux/include/acpi/dsdt_table.h » puis reconfigurez votre noyau.&lt;br /&gt;
Insérer « dsdt_table.h » dans l&#039;option « Include you custom DSDT » disponible dans le menu « Power Management/ACPI/ ». Recompilez votre noyau et redémarrez avec votre nouveau noyau.&lt;br /&gt;
Pour les noyaux inférieurs à 2.6.9, il est possible de modifier le code source de votre noyau pour intégrer votre DSDT mais il est préférable d&#039;utiliser le patch permettant l&#039;insertion de la table DSDT dans l&#039;initrd. Recompilez votre noyau avec ce patch, puis suivez la procédure décrite ci-dessous.&lt;br /&gt;
&lt;br /&gt;
Certaines distributions Linux comme « Mandriva Linux » possèdent le patch qui permet de n&#039;avoir qu&#039;à reconstruire l&#039;initrd avec la commande « mkinitrd –dsdt=/boot/dsdt.aml /boot/initrd-`uname -r`.img `uname -r`  » puis de relancer lilo avant de redémarrer votre machine. Lors du démarrage de celle-ci vous devriez voir le message suivant : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ACPI: Looking for DSDT in initrd... found (at offset 0x4f8d9).&lt;br /&gt;
ACPI-0294: *** Info: Table [DSDT] replaced by host OS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous voilà maintenant avec une table DSDT correcte et un ACPI fonctionnel. La question qui reste ouverte est pourquoi les constructeurs n&#039;utilisent pas un compilateur digne de ce nom pour permettre à leur clients de pouvoir utiliser d&#039;autres systèmes d&#039;exploitation que Windows de Microsoft. &lt;br /&gt;
&lt;br /&gt;
Pour la petite histoire, si vous cherchez dans votre dsdt vous risquez de tomber ce genre de lignes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows NT&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft WindowsME: Millennium Edition&amp;quot;), Zero))&lt;br /&gt;
 If (LEqual (SizeOf (\_OS), 0x27)) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque qu&#039;un système d&#039;exploitation souhaite utiliser les ressources ACPI du BIOS, il utilise son nom de système d&#039;exploitation (acpi_os_name). On retrouve donc dans les bios des parties qui ne seront exécutées que pour certains systèmes d&#039;exploitation de Microsoft. On retrouve même certains tests où c&#039;est la longueur du nom qui compte...... Ceci prouve bien que les constructeurs d&#039;ordinateurs savent corriger des tables DSDT pour les systèmes d&#039;exploitation mais pas forcément pour le notre malheureusement. Depuis le noyau 2.6.9, le noyau Linux utilise « Windows NT » comme « acpi_os_name »  pour assurer une meilleure compatibilité matérielle dixit Len Bron d&#039;Intel dans le changelog de cette version.&lt;br /&gt;
&lt;br /&gt;
== Comment trouver le pilote qui va avec votre matériel ? ==&lt;br /&gt;
&lt;br /&gt;
Cette question on se la pose souvent mais uniquement lorsque l&#039;on essaye de brancher un nouveau périphérique sur sa machine. Les distributions récentes permettent de détecter automatiquement votre matériel et de lui associer un pilote avec sa configuration. Ce mécanisme fonctionne plutôt bien mais cela n&#039;évite pas les dysfonctionnements voir l&#039;absence de fonctionnement.&lt;br /&gt;
&lt;br /&gt;
Pour vérifier si votre noyau Linux est capable de supporter un nouveau périphérique PCI par exemple, il suffit d&#039;en récupérer les identifiants PCI (constructeur et produit) puis de les rechercher dans le fichier « /lib/modules/`uname -r`/modules.pcimap » qui est auto-généré lors de la commande depmod.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire « lspcidrake -v » vous permet de trouver les identifiants PCI de votre carte, la commande « lspci » vous permet de trouver le nom de votre périphérique puis faites un « lspci -n » pour en trouver la correspondance numérique. On utilisera la position du périphérique sur le bus pour retrouver la correspondance numérique « 02:05.0 » dans cet exemple.&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome] lspci&lt;br /&gt;
[....]&lt;br /&gt;
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)&lt;br /&gt;
[root@pumphome] lspci -n&lt;br /&gt;
[...]&lt;br /&gt;
02:05.0 Class 0200: 14e4:4401 (rev 01)&lt;br /&gt;
[root@pumphome]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi cette carte réseau possède les identifiants 14e4 (constructeur) et 4401 (produit). Il suffit de rechercher cette valeur dans le modules.pcimap, ce qui nous donnera la correspondance en module (pilote).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[root@pumphome]  grep &amp;quot;0x000014e4 0x00004401&amp;quot; /lib/modules/2.6.12-12mdk-i686-up-4GB/modules.pcimap &lt;br /&gt;
b44               0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
bcm4400      0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit ici que cette carte peut utiliser le driver b44 ou le driver bcm4400. On ne trouve pas toujours les identifiants PCI de produit sous leur forme directe, on peut également trouver « 0Xffffffff » qui indique que tous les cartes du constructeur sont gérées par un module.&lt;br /&gt;
Il ne vous restera plus qu&#039;à effectuer la configuration associée à ce périphérique pour qu&#039;il fonctionne correctement.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
La fin de cet article conclut une toute petite série de deux articles ayant pour but de vulgariser l&#039;architecture de nos machines, de découvrir les outils disponibles pour mieux comprendre leur configuration et au besoin régler les problèmes de configuration matérielle qui ont souvent le don de nous pourrir la vie.&lt;br /&gt;
&lt;br /&gt;
Merci à LaurentJ de #Mandrivafr pour ses tests complémentaires sur les problèmes d&#039;IO-APIC. Un énorme merci à Nicolas Planel pour sa relecture pointue et également Anne pour sa patience de girafe à relire et « quaurigé »mes « photes »,  ainsi qu&#039;à tous ceux qui m&#039;ont aidé à découvrir ce que je restitue dans cet article.&lt;br /&gt;
&lt;br /&gt;
Cet article a été publié dans Linux Magazine France n°78.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12761</id>
		<title>Découvrez les ressources de votre machine (La suite)</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=D%C3%A9couvrez_les_ressources_de_votre_machine_(La_suite)&amp;diff=12761"/>
		<updated>2006-06-10T21:40:10Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Découvrez les ressources de votre machine (La suite)&lt;br /&gt;
Introduction&lt;br /&gt;
A nouvelle année, nouvelles résolutions ! Paru dans le numéro 68, un premier article dédié à la découverte des outils disponibles pour la récupération des configurations de votre machine promettait une suite.  Je vous propose donc de reprendre ce voyage au centre de votre ordinateur. &lt;br /&gt;
Cet article sera articulé autour du diagnostic de pannes et des correctifs associés mais aussi de « trucs &amp;amp; astuces » permettant d&#039;optimiser votre configuration.&lt;br /&gt;
Savez-vous planter les choux ?&lt;br /&gt;
Les choux peut-être pas mais les ordinateurs je pense que c&#039;est arrivé au moins une fois à chaque lecteur qui lit cet article. Rien de plus énervant qu&#039;un écran qui se fige, le pointeur de souris qui ne se déplace plus, le clavier qui ne répond plus non plus.... Planté ! Ce constat est assez facile à établir mais en trouver la cause reste un problème nettement plus complexe tellement le nombre de causes possibles est important.&lt;br /&gt;
Deux solutions : ignorer le problème et relancer le système en se disant que ça « passera », ou alors chercher la cause du problème en essayant de trouver une méthode reproduisant le « plantage » tant redouté.&lt;br /&gt;
La première solution fonctionne assez bien mais si l&#039;on à faire à un « vrai » problème de configuration matérielle ou logicielle, on arrivera assez vite à ne plus pouvoir éviter la seconde voire la troisième. J&#039;allais oublier cette troisième solution destinée aux plus riches d&#039;entre vous : changer de matériel. Cette solution coûteuse peut parfois se révéler efficace, parfois pas du tout. A quoi bon changer un composant sans savoir si c&#039;était bien celui-ci qui posait problème ?&lt;br /&gt;
Quelque soit la solution retenue, il sera de toute manière nécessaire de localiser la panne pour y apporter la réponse adéquate. Certaines sociétés ou particuliers se sont spécialisés dans ce dépannage ou l&#039;utilisateur est « dépassé » par les événements.&lt;br /&gt;
Cet article vous fera, je l&#039;espère, découvrir quelques outils et méthodes pour valider un par un les composants de votre ordinateur. Cela vous permettra j&#039;espère d&#039;être un peu moins dépourvu quand un problème surviendra. L&#039;article reproduira les étapes qu&#039;il faut suivre pour isoler le « fautif ».&lt;br /&gt;
&lt;br /&gt;
Les causes possibles d&#039;un « plantage »&lt;br /&gt;
On retrouve deux grandes catégories de pannes provoquant des dysfonctionnements importants sur un système informatique.&lt;br /&gt;
une panne du matériel&lt;br /&gt;
une erreur logicielle au niveau du noyau et des pilotes (drivers)&lt;br /&gt;
Il faudra donc être capable de séparer la panne matérielle qui « force » l&#039;ordinateur à entrer dans un mode de fonctionnement non prévu et instable, de l&#039;erreur logicielle qui équivaut à demander à l&#039;ordinateur de faire « n&#039;importe quoi » et qui va donc se « planter ».&lt;br /&gt;
Le terme « planté » utilisé ici équivaut à un arrêt du système à cause d&#039;erreurs sévères : instruction illégale ou composants défaillants. Le terme de « plantage » est aussi utilisé pour décrire le fonctionnement d&#039;une application qui se ferme inopinément. Ce cas est plus souvent lié à une erreur de programmation de l&#039;application qu&#039;à une erreur du système. Nous ne parlerons donc pas de ce second cas dans cet article.&lt;br /&gt;
La mémoire qui flanche ?&lt;br /&gt;
Une cause « classique » des dysfonctionnements se situe au niveau de la gestion de la mémoire de votre machine. Je ne parle pas d&#039;allocation mémoire réalisée par votre système d&#039;exploitation favori mais bien de la manière avec laquelle la carte mère configure et utilise vos barrettes de mémoire. Les applications chargent en mémoire des données et des instructions destinées au processeur. Voici un scénario qui peut provoquer l&#039;arrêt de la machine.&lt;br /&gt;
Votre application favorite est lancée depuis la ligne de commande ou une interface graphique via un « clic » de souris. Votre système d&#039;exploitation va donc charger ce programme en mémoire puis en exécuter les instructions. Au plus bas niveau de votre système, le processeur exécute des instructions en langage machine (assembleur) présente en mémoire.&lt;br /&gt;
Malheureusement, votre mémoire est défaillante et elle n&#039;arrive pas à maintenir un état stable des informations qui lui sont confiées. Par exemple, la lettre C est représentée par le code 67, ou « 1000011 » en binaire. Si la zone mémoire change d&#039;état, alors le contenu de la valeur stocké à cet endroit changera : on pourrait se retrouver avec « 1000010 ». Un seul bit a changé, mais on passe de la lettre &#039;C&#039; (67) à la lettre &#039;B&#039;(66). Le résultat ne se fait pas attendre, le processeur se retrouve à exécuter des instructions qui n&#039;ont plus de sens, provoquant l&#039;arrêt de la machine.&lt;br /&gt;
Les pannes de mémoires sont généralement dues à des composants endommagés, des barrettes incompatibles ou un  « timing d&#039;accès » à la mémoire (nommé CAS (Column Address Strobe) dans la plupart des BIOS) trop agressif permettant des lectures dans des zones mémoires avant que les écritures aient eu le temps de se stabiliser pour en garantir le contenu.&lt;br /&gt;
Il est assez simple de valider votre configuration mémoire grâce à l&#039;utilitaire memtest (http://www.memtest.org). Cet utilitaire de taille très modeste, 96 Kilo-octets, est écrit en assembleur ce qui lui permet de s&#039;exécuter indépendamment du système d&#039;exploitation. Ceci garantit un test « proche » du matériel, sans sur-couche pouvant apporter d&#039;autres problèmes. &lt;br /&gt;
La version 1.65 actuelle est téléchargeable sous deux formes : une iso que l&#039;on peut graver sur un CDRW de préférence vu la petite taille du programme ou sous la forme d&#039;une amorce système (pre-compiled bootable binary). Il suffira de décompresser l&#039;archive puis d&#039;exécuter la commande suivante : « dd if=memtest.bin of=/dev/fda ».  Ceci écrasera le contenu de votre disquette pour y  copier memtest. Rebootez l&#039;ordinateur avec la disquette placée dans le lecteur, memtest devrait se lancer. &lt;br /&gt;
La figure 1, est une capture d&#039;écran de memtest en fonctionnement. Le barre de progression principale affichée en haut à droite de l&#039;écran (2% dans cet exemple) permet de suivre la progression du test. Les erreurs apparaissent dans la partie inférieure de l&#039;écran. Il suffit de laisser fonctionner memtest au moins une fois jusqu&#039;à 100%. Si aucune ligne ne s&#039;est affichée alors vou pouvez considérer que la mémoire est fonctionnelle. Dans le cas contraire,  il faudra soit procéder à son remplacement s&#039;il s&#039;agit d&#039;une seule barrette mémoire, soit tester les barrettes indépendamment (l&#039;une puis l&#039;autre) avec ce logiciel. Dans le cas de 2 ou 3 barrettes qui ne fonctionnement pas correctement ensemble mais qui fonctionnement correctement individuellement, il faudra vérifier qu&#039;elles sont bien de même modèle/marque et remettre le Bios dans une configuration initiale.&lt;br /&gt;
Votre mémoire est bonne ? Testons les autres composants de votre machine pour traquer la source de ce plantage.&lt;br /&gt;
Il ne fait pas un peu chaud là ?&lt;br /&gt;
Ces dix dernières années la puissance consommée et dissipée par nos ordinateurs a littéralement explosé ! Du 486 qui ne nécessitait quasiment pas de ventilateur, on est arrivé à des stations de travail/jeu avec des alimentations pouvant atteindre 1KiloWatt pour les dernières et 500watt pour des modèles plus « grand public ». Le processeur est un des composants gourmands de la machine. Certains modèles peuvent consommer plus de 130W ! Autant dire que si le système est mal ventilé, la montée en charge du processeur peut provoquer un échauffement important provoquant une surchauffe de celui-ci. S&#039;il dépasse ces caractéristiques de fonctionnement, il va alors exécuter du code incorrect provocant  un plantage du système.&lt;br /&gt;
Un bon test pour vérifier que votre processeur n&#039;est pas la cause de votre instabilité : commencez par relever la température de votre machine au repos à l&#039;aide des informations fournies soit par l&#039;acpi soit pas lm_sensors (cf le premier article : numéro 68).&lt;br /&gt;
[erwan@R1 ~]$ cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             42 C&lt;br /&gt;
[erwan@R1 ~]$ &lt;br /&gt;
&lt;br /&gt;
[root@konilope ~]# sensors | grep Temp&lt;br /&gt;
M/B Temp:    +39°C  (low  =   +15°C, high =   +40°C)   sensor = thermistor   &lt;br /&gt;
CPU Temp:   +127°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
Temp3:       +44°C  (low  =   +15°C, high =   +45°C)   sensor = thermistor   &lt;br /&gt;
[root@konilope ~]&lt;br /&gt;
La méthode utilisant lm_sensors nécessite une interprétation de la part de l&#039;utilisateur. Dans cet exemple, il apparaît évidant que le processeur ne peut avoir une température de fonctionnement aussi élevée (127°C). L&#039;erreur est du à un mauvais calcul de la part de lm_sensors. Il se base sur le type de capteurs thermiques utilisé par la carte mère pour calculer la température des différents composants. Malheureusement, le montage électrique autour du capteur de température peut varier d&#039;un modèle de carte à un autre, ce qui fausse les calculs. On considéra donc, que pour cette machine (konilope) sa température se situe aux alentours de 42° : valeur moyenne entre les deux valeurs « cohérentes » relevées par lm_sensors. On pourra cependant vérifier cette approximation en relevant la température du disque sur à l&#039;aide de smartmontools.&lt;br /&gt;
[root@konilope ~]# smartctl -A /dev/hda | grep Temperature&lt;br /&gt;
194 Temperature_Celsius     0x0022   042   052   000    Old_age   Always       -       42&lt;br /&gt;
[root@konilope ~]# &lt;br /&gt;
De manière générale, il est préférable de maintenir sa machine en dessous des 55° et celle de son processeur en dessous de 70°C. Au delà, le système risque d&#039;être instable. Si ce n&#039;est pas le cas, effectuez les modification nécessaire pour y parvenir : meilleure ventilation du processeur ou du boîtier par exemple.&lt;br /&gt;
Ensuite, téléchargez l&#039;utilitaire cpuburn depuis un mirroir  (http://pages.sbcglobal.net/redelm/cpuburn_1_4_tar.gz)  ou depuis votre distribution linux favorite (oui, oui, urpmi cpuburn ça fonctionne ;o)).&lt;br /&gt;
Vous y trouverez plusieurs programmes nommés burnXX ou XX représente votre processeur. La version P6 sera à utiliser sur les processeurs Intel Pentium 4, la version K7 pour les processeurs Athlon x86. Pour les processeurs plus récents, utilisez la version P6.&lt;br /&gt;
Ce logiciel réalise des boucles en langage assembleur ayant pour but de stresser votre processeur de manière importante et donc le faire chauffer. Lancez cpuburn autant de fois que vous avez de processeur sur votre machine puis observez la température de votre machine. Si lors de la montée en température votre système se fige, alors vous avez un problème de thermie. Si cpuburn ne fait pas planter votre ordinateur au bout de 10mn, vous pouvez considérez que votre système est stable de ce coté là. Vous pouvez aussi utiliser ce test pour vérifier que vos ventilateurs d&#039;ordinateurs portable se déclenchent bien en cas de surchauffe.&lt;br /&gt;
Sur un portable récent, on obtient le résultat suivant au bout de quelques minutes de cpuburn.&lt;br /&gt;
[root@R1 ~]# cat /proc/acpi/thermal_zone/THRM/temperature &lt;br /&gt;
temperature:             80 C&lt;br /&gt;
[root@R1 ~]# &lt;br /&gt;
&lt;br /&gt;
Malgré la température très élevée du processeur, le système est resté stable ce qui permet de valider qu&#039;il est capable d&#039;encaisser une montée en température élevée. Bien entendu, plus votre machine sera « chaude » plus elle s&#039;usera rapidement. Il ne faut pas oublier que les autres composants peuvent souffrir de la chaleur dégagée par le processeur par exemple : les disques durs en sont un bon exemple car les plateaux ne supportent pas la chaleur.&lt;br /&gt;
Ce test est bon aussi ? A priori, les composants de base de votre système sont en bon état, vous pouvez commencer à regarder du coté configuration logicielle.&lt;br /&gt;
APIC es tu là ?&lt;br /&gt;
Le manque de stabilité peut aussi s&#039;expliquer par la gestion des interruptions. &lt;br /&gt;
L&#039;architecture PIC (Programmable Interrupt Controllers)  représentée par la famille de composants Intel 8259, permettait une gestion de 8 interruptions pour un unique processeur. On les associe par 2 pour obtenir les 16 niveaux d&#039;interruptions nécessaire depuis nos vieux 80286 (milieu des années 80). Avec l&#039;arrivée des systèmes multi-processeurs, l&#039;architecture APIC (Advanced Programmable Interrupt Controllers) (Intel 82093) à été ajoutée pour permettre une gestion plus fine des interruptions. En effet, dans un contexte multi-processeurs, il est nécessaire de pouvoir choisir quel processeur traitera quelle interruption pour ne pas rester figé dans l&#039;ancien modèle (PIC) où le processeur de  « boot » est assigné à un ensemble d&#039;interruptions. &lt;br /&gt;
De plus, l&#039;architecture APIC apporte une gestion de 24 interruptions, une gestion de priorité des interruptions et le routage de l&#039;interruption sur le bon processeur, contre un simple routage de 2*8 interruptions dans le modèle PIC sur un seul processeur. Depuis une dizaine d&#039;années, Intel propose le modèle APIC comme nouvelle architecture, y compris pour les systèmes mono-processeurs. Les ordinateurs récents, y compris les portables, sont maintenant équipés uniquement de composants APIC même si l&#039;on peut obtenir un comportement de type PIC avec ceux-ci.&lt;br /&gt;
L&#039;architecture APIC est constituée d&#039;un ou plusieurs composants situé physiquement dans le southbridge (IO-APIC), généralement un par bus, et un composant situé dans le processeur : le Local APIC (LAPIC). Le LAPIC va permettre la gestion des interruptions au niveau du processeur local. Il permet aussi de générer des interruptions par exemple pour transmettre des interruptions à des processeurs voisins dans le contexte d&#039;un système multi-processeurs, ces messages sont appelés IPI (Inter Processor Interrupts). &lt;br /&gt;
De plus le Local APIC (LAPIC) inclut un « timer » de précision cadencé à la fréquence du bus, généralement il peut être utilisé par l&#039;ordonnanceur de votre système d&#039;exploitation favori ou d&#039;autres outils de haut niveau (profiler kernel : oprofile, vtune). Les LAPIC et l&#039;IO-APIC sont reliés par un bus spécifique pour permettre un échange rapide des informations. &lt;br /&gt;
Schema logique d&#039;implémentation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les IO-APIC vont donc se charger de collecter les interruptions provenant des périphériques systèmes et d&#039;en assurer le transfert vers le ou les processeur(s) suivant une route préalablement programmée par le BIOS et/ou le système d&#039;exploitation.&lt;br /&gt;
Cependant, l&#039;implémentation des APIC dans les BIOS peut provoquer certaines instabilités sur votre système Linux. Par expérience, il n&#039;y a pas de règle pour trouver la configuration qui peut aider votre machine à se stabiliser car cela dépend de chaque machine. Des différences peuvent même exister entre  deux versions de BIOS d&#039;un même ordinateur. Cependant, dans la série 2.6 du noyau Linux et les version 2.4 récentes nous disposons d&#039;outils permettant de re-paramétrer cette configuration en activant/désactivant les IO-APIC ou les LAPIC.&lt;br /&gt;
Chaque composant possède un activateur ou un inhibiteur, on aura donc d&#039;un coté « apic » et « noapic » pour la gestion des IO-APIC, « nolapic » et « lapic » de l&#039;autre pour la gestion des LAPIC. Ces 4 options sont à utiliser sur la ligne de commande du noyau, c&#039;est à dire au moment où le « bootloader » (lilo ou grub par exemple) va charger le noyau en mémoire. L&#039;utilisation de « apic » et « lapic » permet d&#039;activer ces composants qui ne l&#039;ont pas été par le BIOS. L&#039;activateur « apic » n&#039;est disponible que les architectures de type x86_64 car celui-ci est déjà activé sur les systèmes de type x86. On désactivera les APIC dans le cas où le système affiche des messages d&#039;erreurs sur les APIC comme : &lt;br /&gt;
« APIC error on CPU0: 40(40) »&lt;br /&gt;
 ou &lt;br /&gt;
MP-BIOS bug: 8254 timer not connected to IO-APIC&lt;br /&gt;
failed.&lt;br /&gt;
timer doesn&#039;t work through the IO-APIC - disabling NMI Watchdog!&lt;br /&gt;
La désactivation des IO-APIC permet par exemple de corriger le comportement parfois récalcitrant de certaines cartes vidéos qui ne parviennent pas à afficher correctement en mode 2D/3D (écran noir par exemple).&lt;br /&gt;
La non activation des LAPIC peut avoir comme conséquence un dysfonctionnement de l&#039;ACPI (gestion d&#039;énergie avancée). Ce cas est traité par le noyau, vous retrouverez dans les messages de démarrage la ligne suivante : « &amp;quot;Local APIC disabled by BIOS you can enable it with lapic ».&lt;br /&gt;
Pour résumer, si votre machine, en général à architecture mono-processeur, a tendance à se bloquer lors de l&#039;utilisation de périphériques tels que le port usb, la carte graphique ou la carte son, essayez de désactiver le LAPIC puis l&#039; IO-APIC puis les 2.  Pour exemple, les cartes mère A7N8X de chez Asus ont largement tendance à se bloquer si l&#039;on ne spécifie pas « nolapic » lors du boot. Sur certaines machines, il faudra faire le contraire à savoir forcer l&#039;activation des LAPIC. Ceci dépendra de votre machine et de sa conception.&lt;br /&gt;
A vos marques, rebootez !&lt;br /&gt;
Certains machines peuvent présenter quelques soucis pour redémarrer. Encore une fois, on retrouve au coeur de ce problème l&#039;interaction entre le noyau et le matériel notamment l&#039;ACPI. Les ordinateurs portables dont le modèle HP nc6120 ont par exemple le bon goût de rester bloqués sur le message « No reboot fixup found for your hardware ». Ceci indique que le noyau ne connaît pas de contournement pour ce matériel (ce qui est le cas de la quasi totalité des ordinateurs) mais puisque vous voyez ce message c&#039;est que votre machine n&#039;a pas réussi à rebooter. Heureusement, il existe des contournements pour permettre un redémarrage plus « bas niveau ». Le noyau défini les modes suivants : « b » « c » « h » « s » et « w ».&lt;br /&gt;
Le mode de reboot peut être défini sur la ligne de commande du noyau suivant la forme « reboot=&amp;lt;mode&amp;gt; ». Le mode « s » est réservé au systèmes multi-processeurs, elle va réinitialiser chacun des processeurs.&lt;br /&gt;
Le mode « b » permet quant à lui de rebooter en faisant un appel direct au bios qui se chargera de faire redémarrer la machine. Ce mode fonctionne plutôt bien car dans le cas d&#039;un BIOS posant problème sur l&#039;ACPI, on peut espérer avoir un reboot correct. C&#039;est le cas sur de notre portable cité précédement.&lt;br /&gt;
Le mode « h » se chargera de faire redémarrer la machine en réinitialisant le processeur. C&#039;est l&#039;équivalent du mode « s » pour les environnements mono-processeurs.  Pour finir, les modes « c » et « w » correspondent aux modes « cold » et « warn » : ces modes sont plus connus sous le nom de « reboot à froid »  et « reboot à chaud ». Le premier effectuera les tests de mémoire tandis que le second exécutera un reboot plus court.&lt;br /&gt;
De manière générale, on utilisera plutôt le mode « b » ou « h » pour les systèmes mono-processeurs récalcitrant et le mode « s » pour les systèmes multi-processeurs.&lt;br /&gt;
Toujours plus de performance&lt;br /&gt;
Votre configuration est bien stable depuis un certain temps. Toutefois vous trouvez qu&#039;elle est un peu lente, elle ne vous donne pas satisfaction par rapport à ce qu&#039;elle devrait fournir.&lt;br /&gt;
Cette partie de l&#039;article va explorer comment vérifier et corriger les problèmes de performance des différents composants.&lt;br /&gt;
Note: certaines configuration mono-processeur nécessitent de désactiver LAPIC (nolapic)&lt;br /&gt;
Le disque dur &lt;br /&gt;
Il arrive parfois que le disque dur semble un peu lent et pénalise le système dans son ensemble. Hdparm est là pour vous aider à y voir plus clair. Hdparm est à l&#039;origine conçu pour les systèmes de disques IDE de type PATA. Le nouveau système de disque SATA, ne permet pas toujours en fonction de l&#039;implémentation, l&#039;appel à toutes ces astuces. Cependant les nouvelles séries de kernel à partir du 2.6.15 devrait permettre une gestion plus unifiée des systèmes de disques PATA et SATA.&lt;br /&gt;
Le test « hdparm -t /dev/&amp;lt;mon_device&amp;gt; » permet de tester la vitesse de lecture depuis le disque dur jusqu&#039;en mémoire. Une valeur de 25Mo/sec est un minimum pour des machines récentes. Plusieurs paramètres peuvent influencer les performances d&#039;un disque IDE. &lt;br /&gt;
La commande « hdparm -cd » permet de vérifier que les entrées/sorties sont réalisées en 16-bit (le mode 32-bit n&#039;offre pas de performance supplémentaire) alors que le DMA (Direct Memory Access) est activé. Ceci permet la minimisation de l&#039;utilisation du processeur pendant les accès au disque dur.&lt;br /&gt;
[root@R1 ~]# hdparm -cd /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
 IO_support   =  0 (default 16-bit)&lt;br /&gt;
 using_dma    =  1 (on)&lt;br /&gt;
[root@R1 ~]# &lt;br /&gt;
La commande « hdparm -c0d1 /dev/&amp;lt;mon_device&amp;gt; » permet de configurer le périphérique dans ce mode. Le noyau de votre distribution Linux devrait le réaliser de manière automatique.&lt;br /&gt;
&lt;br /&gt;
L&#039;option « -I » permet d&#039;obtenir plus d&#039;informations sur la configuration de votre disque dur.&lt;br /&gt;
[root@R1 ~]# hdparm -I /dev/hda&lt;br /&gt;
/dev/hda:&lt;br /&gt;
ATA device, with non-removable media&lt;br /&gt;
	Model Number:       FUJITSU MHT2040AT                       &lt;br /&gt;
	Serial Number:      NN77T3C13KB9&lt;br /&gt;
	Firmware Revision:  0022    &lt;br /&gt;
Standards:&lt;br /&gt;
	Used: ATA/ATAPI-6 T13 1410D revision 3a &lt;br /&gt;
	Supported: 6 5 4 3 &lt;br /&gt;
Configuration:&lt;br /&gt;
	Logical		max	current&lt;br /&gt;
	cylinders	16383	16383&lt;br /&gt;
	heads		16	16&lt;br /&gt;
	sectors/track	63	63&lt;br /&gt;
	--&lt;br /&gt;
	CHS current addressable sectors:   16514064&lt;br /&gt;
	LBA    user addressable sectors:   78140160&lt;br /&gt;
	device size with M = 1024*1024:       38154 MBytes&lt;br /&gt;
	device size with M = 1000*1000:       40007 MBytes (40 GB)&lt;br /&gt;
Capabilities:&lt;br /&gt;
	LBA, IORDY(cannot be disabled)&lt;br /&gt;
	bytes avail on r/w long: 4	Queue depth: 1&lt;br /&gt;
	Standby timer values: spec&#039;d by Standard, no device specific minimum&lt;br /&gt;
	R/W multiple sector transfer: Max = 16	Current = 16&lt;br /&gt;
	Advanced power management level: 128 (0x80)&lt;br /&gt;
	Recommended acoustic management value: 254, current value: 254&lt;br /&gt;
	DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5 &lt;br /&gt;
	     Cycle time: min=120ns recommended=120ns&lt;br /&gt;
	PIO: pio0 pio1 pio2 pio3 pio4 &lt;br /&gt;
	     Cycle time: no flow control=240ns  IORDY flow control=120ns&lt;br /&gt;
Commands/features:&lt;br /&gt;
	Enabled	Supported:&lt;br /&gt;
	   *	READ BUFFER cmd&lt;br /&gt;
	   *	WRITE BUFFER cmd&lt;br /&gt;
	   *	Host Protected Area feature set&lt;br /&gt;
	   *	Look-ahead&lt;br /&gt;
	   *	Write cache&lt;br /&gt;
	   *	Power Management feature set&lt;br /&gt;
		Security Mode feature set&lt;br /&gt;
	   *	SMART feature set&lt;br /&gt;
	   *	Mandatory FLUSH CACHE command &lt;br /&gt;
	   *	Device Configuration Overlay feature set &lt;br /&gt;
	   *	Automatic Acoustic Management feature set &lt;br /&gt;
	   *	SET MAX security extension&lt;br /&gt;
		Power-Up In Standby feature set&lt;br /&gt;
	   *	Advanced Power Management feature set&lt;br /&gt;
	   *	DOWNLOAD MICROCODE cmd&lt;br /&gt;
	   *	SMART self-test &lt;br /&gt;
	   *	SMART error logging &lt;br /&gt;
Security: &lt;br /&gt;
		supported&lt;br /&gt;
	not	enabled&lt;br /&gt;
	not	locked&lt;br /&gt;
		frozen&lt;br /&gt;
	not	expired: security count&lt;br /&gt;
	not	supported: enhanced erase&lt;br /&gt;
	40min for SECURITY ERASE UNIT. &lt;br /&gt;
HW reset results:&lt;br /&gt;
	CBLID- above Vih&lt;br /&gt;
	Device num = 0 determined by the jumper&lt;br /&gt;
Checksum: correct&lt;br /&gt;
[root@R1 ~]#&lt;br /&gt;
On y retrouve le modèle, le numéro de série et la version du firmware qui peuvent être utiles en cas de contact avec le Service Après-Vente ou de mise à jour pour une série de firmwares défaillante.&lt;br /&gt;
La ligne commençant par « DMA » dans la partie « Capabilities » permet d&#039;afficher la vitesse de transfert négociée entre le disque dur et le driver IDE de Linux. L&#039;étoile précède la valeur actuelle. Dans cet exemple, le mode udma5 est sélectionné : ceci est conforme aux machines disponibles sur le marché depuis environ 3 ans.&lt;br /&gt;
Pour rappel, voici le tableau de conversion entre le mode DMA et la vitesse maximale associée.&lt;br /&gt;
Type de fonctionnement&lt;br /&gt;
Vitesse Maximale en MO/sec&lt;br /&gt;
UltraDMA 0&lt;br /&gt;
16,6&lt;br /&gt;
UltraDMA 1&lt;br /&gt;
25&lt;br /&gt;
UltraDMA 2&lt;br /&gt;
33,3&lt;br /&gt;
UltraDMA 3&lt;br /&gt;
44,4&lt;br /&gt;
UltraDMA 4&lt;br /&gt;
66,6&lt;br /&gt;
UltraDMA 5&lt;br /&gt;
100&lt;br /&gt;
UltraDMA 6&lt;br /&gt;
133,33&lt;br /&gt;
&lt;br /&gt;
Une configuration actuelle ne devrait pas être en dessous de UDMA5. Si ce n&#039;était pas le cas, on peut essayer de renégocier la vitesse de transfert à l&#039;aide de la commande :&lt;br /&gt;
« hdparm -X udma5 » &lt;br /&gt;
Celle-ci permet de forcer le mode UltraDMA5. Il faut utiliser cette commande avec précaution car elle pourrait générer des pertes ou de la corruption de données en cas de transfert pendant ce changement de mode.&lt;br /&gt;
Vous pouvez aussi impacter les performances de votre disque dur en modifiant sa vitesse de rotation. Cette fonctionnalité connue sous le nom de Automatic Acoustic Management (AAM) est utilisable avec l&#039;option « -M » de hdparm. La valeur 128 représentera la vitesse la plus faible avec un disque silencieux, la valeur 254 la vitesse la plus élevée mais avec comme contre-partie un disque plus bruyant. On pourra noter des différences de quelques Mo/sec selon les configurations.&lt;br /&gt;
Il est aussi à noter que l&#039;utilisation de logiciels permettant une meilleure gestion d&#039;énergie (cpufreq, laptop-mode) peut dégrader les performances d&#039;un disque dur de manière notable.&lt;br /&gt;
Configuration bas niveau du réseau&lt;br /&gt;
Le réseau local filaire peut parfois être un peu lent. Voici quelques tests pour vérifier si la lenteur provient du logiciel, du noyau ou du matériel. Tout d&#039;abord, explorons la trousse à outils indispensable pour analyser votre carte réseau : ethtool. Digne successeur de mii-tool, il permet de s&#039;informer sur la configuration de votre carte réseau. &lt;br /&gt;
Il suffit de lancer « ethtool &amp;lt;votre_interface&amp;gt; » » pour obtenir la configuration matérielle de votre carte. On y retrouve les modes supportés par votre carte (Supported Link Modes ainsi que la vitesse actuelle (Speed), obtenue par auto-négociation dans cet exemple.&lt;br /&gt;
On peut également savoir si le câble réseau est connecté à la carte grâce à la ligne « Link Detected ». Le type de « duplex » utilisé permet également de savoir si la négociation avec l&#039; élément actif au bout de votre câble (commutateur, concentrateur ou une autre machine) a correctement fonctionné. Le duplex définit le mode de  transmission : le mode half-duplex indique que l&#039;on émet puis on reçoit des données, le mode full-duplex indique que l&#039;on peut émettre et recevoir en même temps des données. Le mode full-duplex est donc plus que recommandé pour vos équipements réseaux.&lt;br /&gt;
[root@konilope ~]# ethtool  eth1&lt;br /&gt;
Settings for eth1:&lt;br /&gt;
	Supported ports: [ TP MII ]&lt;br /&gt;
	Supported link modes:   10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Supports auto-negotiation: Yes&lt;br /&gt;
	Advertised link modes:  10baseT/Half 10baseT/Full &lt;br /&gt;
	                        100baseT/Half 100baseT/Full &lt;br /&gt;
	Advertised auto-negotiation: Yes&lt;br /&gt;
	Speed: 100Mb/s&lt;br /&gt;
	Duplex: Full&lt;br /&gt;
	Port: MII&lt;br /&gt;
	PHYAD: 1&lt;br /&gt;
	Transceiver: internal&lt;br /&gt;
	Auto-negotiation: on&lt;br /&gt;
	Current message level: 0x000020c1 (8385)&lt;br /&gt;
	Link detected: yes&lt;br /&gt;
[root@konilope ~]# &lt;br /&gt;
Mesurer les {contre}performances de votre réseau&lt;br /&gt;
Une fois vérifiée la bonne configuration de votre matériel, nous pouvons passer à la vérification des performances entre deux machines.&lt;br /&gt;
L&#039;utilitaire netpipe (http://www.scl.ameslab.gov/netpipe/) permet de réaliser des tests de performance mais aussi d&#039;intégrité entre deux machines. Il permet de tester les performances du réseau au travers la couche IP et non pas depuis un mode plus bas niveau comme pourrait l&#039;être un test utilisant directement le driver Ethernet. Ce test permet donc de valider que la configuration matérielle mais aussi logicielle est correcte.&lt;br /&gt;
Sur la première machine, exécutez « NPtcp » : netpipe se positionne en mode « serveur ».&lt;br /&gt;
Sur la seconde machine, exécutez « NPtcp -h &amp;lt;machine1&amp;gt; » : netpipe se connecte au serveur netpipe de la machine nommée machine1 pour effectuer le test de performance.&lt;br /&gt;
Le test par défaut teste les communication allant de 1 octet jusqu&#039;à 8 Mo. Il peut prendre plusieurs minutes si le réseau est « lent ». Le test va montrer pour chaque taille de paquet la performance obtenue. Il est normal d&#039;obtenir des performances faibles pour des paquets d&#039;une taille inférieure à 8 Ko. Transporter des petits paquets nécessite de réaliser beaucoup d&#039;opérations pour le processeur pour une quantité d&#039;information minime. Les performances seront meilleures à partir d&#039;environ 16 Ko et maximales à partir de 128 Ko. Sur un système utilisant du gigabit ethernet, on constatera une performance de 39Mbps à 256 octets, 287Mbps à 4Ko, 614Mbps à 16Ko, 845Mbps à 128Ko, 895Mbps à 8Mo.&lt;br /&gt;
Vous pouvez ainsi vérifier et comparer facilement les performances de votre configuration réseau. Netpipe permet également de tester la vitesse du réseau pour une taille de paquets définie entre la taille indiqué par l&#039;option « -l » et la taille indiquée par l&#039;option « -u ». Ainsi, NPtcp -l 16384 -u 16384 permet de tester la bande passante réseau pour une taille de paquet égale à 16Ko.&lt;br /&gt;
L&#039;option « -n &amp;lt;nb-cycle&amp;gt; » permet de définir le nombre de boucles à réaliser pour le test (50 par défaut). Enfin, pour réaliser des tests « full-duplex », on utilisera l&#039;option « -2 ». Ce test permet de s&#039;assurer du bon fonctionnement du mode de communication permettant l&#039;écriture et la lecture simultanées.&lt;br /&gt;
Attention, même si ce test donne de bons résultats, cela ne veut pas dire que la configuration est exempte d&#039;erreur de configuration. Par exemple, les performances réseaux peuvent être très bonnes en point à point mais mauvaises lorsque l&#039;on aura une charge réseau avec plusieurs clients. Dans cette situation, il faut vérifier que le contrôle de flux est bien activé sur toutes les machines. L&#039;option « ethtool -a » permet de vérifier que les champs « rx » et « tx » sont placés sur « on ». Si ce n&#039;était pas le cas activez-les avec la commande « ethtool -A eth0 rx on » et « ethtool -A eth0 tx on ».&lt;br /&gt;
Les cartes réseaux, des serveurs essentiellement, permettent maintenant de réaliser le « tcp segment offload ». Cette technique permet de décharger une partie du traitement TCP directement dans l&#039;électronique de la carte réseau. Ceci à pour effet de décharger le processeur central d&#039;un traitement fastidieux. L&#039;option « -k » d&#039;ethtool permet de consulter l&#039;état de cette fonctionnalité (off/on). On pourra l&#039;activer sur des serveurs générant un gros trafic réseau par exemple : « ethtool -K eth0 tso on ».&lt;br /&gt;
Vous voilà maintenant équipé de nouveau outils pour traquer la perte de performances de votre installation réseau. Ceci couplé aux habituels tcpdump/ethereal, voilà une belle panoplie du zorro du réseau.&lt;br /&gt;
Quand la latence s&#039;en mêle&lt;br /&gt;
La latence représente le temps nécessaire à un système pour prendre en compte un événement.&lt;br /&gt;
Il arrive que certains périphériques de votre machine nécessitant des débits importants ou une latence assez faible sur le bus PCI soient « poussifs ». On retrouve dans cette catégorie les cartes vidéos accélératrice 3D, les cartes son et les cartes d&#039;acquisition firewire ou DVB (récepteur de télévision numérique terrestre : TNT).&lt;br /&gt;
Un périphérique branché sur le bus PCI doit attendre que le bus soit libre pour émettre les données vers la mémoire centrale. Le bus PCI qui est le coeur de communication des périphériques est donc soumis en permanence à un arbitrage qui permet de décider qui doit émettre des données et qui doit attendre. Cet arbitrage est en partie réalisé grâce au « latency_timer ».&lt;br /&gt;
Chaque périphérique possède une valeur de « latency_timer » comprise en 0 et 248 cycles d&#039;horloge du bus. Plus la valeur sera importante plus le périphérique disposera de temps pour transmettre des informations. Une latence de 248 cycles permet d&#039;obtenir une priorité forte sur le bus, ce qui permet un débit important. A contrario, une latence de 0 indiquera au périphérique qu&#039;il doit cesser ses transmissions si un autre composant à besoin du bus : ceci se traduira par une perte de bande passante importante.&lt;br /&gt;
La configuration réalisée par défaut sur votre machine doit être correcte mais il peut arriver qu&#039;une carte 3D ou DVB soit configurée avec une latence trop faible, ce qui  aurait pour conséquence d&#039;offrir une image saccadée et peu fluide. Une carte son offrirait également le même type de symptômes avec un son hâché ou excessivement métallique.&lt;br /&gt;
Heureusement, une série d&#039;outils est là pour vous aider à diagnostiquer le problème mais aussi à le résoudre. Le projet pciutils  (http://atrey.karlin.mff.cuni.cz/~mj/linux.shtml#pciutils) contient deux outils indispensables: lspci et setpci. Bien entendu, votre distribution favorite devrait posséder ce logiciel, il vous suffira de l&#039;installer avec  votre gestionnaire de paquet favori (urpmi, apt, smart).&lt;br /&gt;
La commande « lspci » vous permet de lister les périphériques PCI disponibles sur votre ordinateur (cf article paru dans le numéro 68).  Cet exemple se basera sur une carte vidéo  ayant pour adresse sur le bus PCI « 01:00.0 ».&lt;br /&gt;
[root@lagirafe] lspci -v -s 01:00.0&lt;br /&gt;
01:00.0 VGA compatible controller: nVidia Corporation NV34M [GeForce FX Go5200 32M/64M] (rev a1) (prog-if 00 [VGA])&lt;br /&gt;
	Subsystem: Samsung Electronics Co Ltd: Unknown device c00f&lt;br /&gt;
	Flags: bus master, 66Mhz, medium devsel, latency 16, IRQ 11&lt;br /&gt;
	Memory at c8000000 (32-bit, non-prefetchable) [size=16M]&lt;br /&gt;
	Memory at d8000000 (32-bit, prefetchable) [size=128M]&lt;br /&gt;
	Expansion ROM at &amp;lt;unassigned&amp;gt; [disabled] [size=128K]&lt;br /&gt;
	Capabilities: [60] Power Management version 2&lt;br /&gt;
	Capabilities: [44] AGP version 3.0&lt;br /&gt;
[root@lagirafe]&lt;br /&gt;
&lt;br /&gt;
On retiendra dans cette ligne, la valeur &#039;latency 16&#039;. Ceci risque de poser problème lorsque celle-ci aura besoin d&#039;un fort débit pendant un jeu par exemple. Augmenter la latence va donc se révéler nécessaire pour ce périphérique.&lt;br /&gt;
La commande setpci permet de modifier les paramètres PCI d&#039;un périphérique ou d&#039;un bus complet avec tous ses périphériques. &lt;br /&gt;
La commande « setpci -v -d 01:* latency_timer=20 » permet de positionner tous les périphériques  du bus 01 à une valeur de 32 cycles. Il est à noter que la commande setpci utilise des valeurs en hexadécimal mais lspci affichera les valeurs en décimal.&lt;br /&gt;
Pour en revenir à nos moutons, la correction de la latence de cette carte graphique se fera avec la commande «  setpci -v -d 01:00.0 latency_timer=f8 ». Ceci positionne donc la carte sur la plus grande valeur de latence possible, ce qui lui garantira la plus grande bande passante possible. Il est possible d&#039;utiliser la valeur « ff » comme paramètre pour « latency_timer » mais celui-ci sera converti à la volée par la commande setpci en « 0xf8 ».&lt;br /&gt;
Attention, certains composants de votre machine doivent rester en « latency_timer=0 » pour garantir une bon fonctionnement de votre système : il ne faudra donc pas modifier les latences des contrôleurs mémoire et des ponts PCI connectés généralement sur le bus « 0:* ».&lt;br /&gt;
DSDT : le cauchemar continue !&lt;br /&gt;
Cette partie de l&#039;article a pour but d&#039;expliquer le problème que peut représenter la table DSDT pour un certain nombre de machines et surtout les ordinateurs portables. &lt;br /&gt;
La norme ACPI 3.0 de Septembre 2004 disponible gratuitement à l&#039;adresse http://www.acpi.info/DOWNLOADS/ACPIspec30.pdf définit la DSDT comme une table remplie par un OEM permettant au système d&#039;exploitation de découvrir les ressources pour la gestion de l&#039;énergie avancée, de la gestion thermique ainsi que la gestion du Plug&#039;nPlay des ressources définies par l&#039;ACPI.&lt;br /&gt;
Voici une description certes un peu théorique mais nécessaire pour bien comprendre la problématique et ses conséquences. Le constructeur de l&#039;ordinateur doit donc définir dans le BIOS une table contenant une liste de ressources et leurs configuration et ce pour que le système d&#039;exploitation puisse s&#039;en servir. Noble cause n&#039;est il pas ? Tout au long des 618 pages de ce document sont spécifiés les éléments du langage à utiliser ainsi que sa syntaxe. L&#039; « ACPI Source Language » permettra donc aux développeurs d&#039;écrire des DSDT puis de les compiler dans un format nommé « ACPI Machine Language » en utilisant un compilateur adéquat. Le système d&#039;exploitation utilisera la table compilée (AML) pour accéder aux ressources ACPI. &lt;br /&gt;
Sur la plupart des ordinateurs portables, la table DSDT ne respecte pas la norme ACPI dans sa syntaxe. Ceci est très gênant car cela bloque le code de l&#039;interpréteur ACPI du noyau Linux qui essaie de la lire. Le résultat est sans appel, pas d&#039;ACPI, pas de gestion d&#039;énergie avancée, plus de ventilation automatique sur certains modèles d&#039;ordinateurs, plus de touche de gestion de contraste/luminosité sur d&#039;autres etc...&lt;br /&gt;
Ceci est très gênant sur un ordinateur portable. Alors que faire ? Dans un premier temps, prévenir le constructeur que son BIOS est incorrect et ne respecte pas la norme ACPI. La réponse se fait toujours attendre pour tous ceux qui « osent » poser la question au support technique : à savoir, les constructeurs ignorent tout simplement les mails de ce type.&lt;br /&gt;
La seconde étape puisque vous êtes devant le fait accompli d&#039;une machine non conforme, il va falloir corriger cette table. Il suffit de récupérer la table actuelle via la commande &#039;cat /proc/acpi/dsdt &amp;gt; dsdt.aml&#039; si vous avez la chance d&#039;avoir un répertoire /proc/acpi malgré une table DSDT endommagée, sinon utilisez la commande &#039;acpidump -b -t dsdt -o dsdt.aml&#039;. La commande acpidump est  fournit dans le projet pmtools (ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools-20050926.tar.bz2) &lt;br /&gt;
Vous avez donc extrait la table DSDT de votre système. Il ne reste plus qu&#039;à essayer de la recompiler. Pour cela, le compilateur IASL de la société Intel (http://developer.intel.com/technology/iapc/acpi/downloads.htm) offre sous Linux et Windows une plate-forme de compilation pour le langage ASL.&lt;br /&gt;
Suivez les instructions du site pour télécharger et compiler la version unix d&#039;iasl. Ensuite, décompilez la table avec la commande « iasl -d dsdt.aml ». Le fichier dsdt.dsl vient d&#039;être créé par le décompilateur. Il suffit de le recompiler avec la commande « iasl -tc dsdt.dsl » pour constater les dégâts ! La DSDT que vous avez dans votre BIOS est généralement compilée par le compilateur de Microsoft qui semble autoriser une syntaxe plus qu&#039;approximative.&lt;br /&gt;
Si vous avez de la chance, votre DSDT s&#039;est recompilée sans erreurs, vous obtenez donc un fichier dsdt.hex et un fichier dsdt.aml. Il ne reste plus qu&#039;à injecter cette dsdt dans le noyau Linux et le tour sera joué.&lt;br /&gt;
Si vous avez moins de chance, votre DSDT est syntaxiquement incorrecte et génère des erreurs. Les expliquer plus en détails nécessiterait un article complet, il ne sera cité que les plus « habituelles » (sic).&lt;br /&gt;
dsdt.dsl  2626:                     Field (ECR, DWordAcc, Lock, Preserve) &lt;br /&gt;
Error    1048 -                              ^ Host Operation Region requires ByteAcc access &lt;br /&gt;
Cette erreur présente à ligne 2626 du fichier dsdt.asl indique une erreur de type dans la déclaration du champ ECR. Il suffit dans ce cas de changer le mot « DWordAcc » par « ByteAcc ». Celle-ci reste assez simple à corriger, on se demande donc pourquoi les constructeurs ne prennent pas le temps de vérifier et de corriger leur BIOS.&lt;br /&gt;
dsdt.dsl  2672:                     Method (_GLK, 1, NotSerialized) &lt;br /&gt;
Warning  2024 -                                ^ Reserved method has too many arguments ( _GLK requires 0) &lt;br /&gt;
La méthode _GLK n&#039;a besoin que de 0 paramètre tandis que ce code en utilise 2 ! La correction est assez simple : il suffit de remplacer la ligne 2672 par « Method(_GLK) ».&lt;br /&gt;
Pour plus de détails sur la correction des erreurs de compilation de votre table dsdt, je vous recommande les tutoriaux disponibles depuis la page http://acpi.sourceforge.net/dsdt/index.php du projet ACPI.&lt;br /&gt;
Votre DSDT est compilée avec succès, il ne vous reste plus qu&#039;à l&#039;ajouter pour que votre noyau puisse l&#039;utiliser à la place de celle fourni par le BIOS (modifiable uniquement par le constructeur, via une mise à jour).&lt;br /&gt;
Il existe trois possibilités pour inclure une table DSDT : la modification du noyau Linux ( noyau &amp;lt; 2.6.9), l&#039;injection de la DSDT dans la configuration du noyau (noyau &amp;gt;= 2.6.9), l&#039;intégration de la table DSDT dans l&#039;initrd qui nécessite un patch kernel disponible à l&#039;adresse http://gaugusch.at/kernel.shtml.&lt;br /&gt;
Pour les noyaux 2.6.9 et supérieur, copiez votre fichier dsdt.hex sous le nom «/usr/src/linux/include/acpi/dsdt_table.h » puis reconfigurez votre noyau.&lt;br /&gt;
Insérer « dsdt_table.h » dans l&#039;option « Include you custom DSDT » disponible dans le menu « Power Management/ACPI/ ». Recompilez votre noyau et redémarrez avec votre nouveau noyau.&lt;br /&gt;
Pour les noyaux inférieurs à 2.6.9, il est possible de modifier le code source de votre noyau pour intégrer votre DSDT mais il est préférable d&#039;utiliser le patch permettant l&#039;insertion de la table DSDT dans l&#039;initrd. Recompilez votre noyau avec ce patch, puis suivez la procédure décrite ci-dessous.&lt;br /&gt;
Certaines distributions Linux comme « Mandriva Linux » possèdent le patch qui permet de n&#039;avoir qu&#039;à reconstruire l&#039;initrd avec la commande « mkinitrd –dsdt=/boot/dsdt.aml /boot/initrd-`uname -r`.img `uname -r`  » puis de relancer lilo avant de redémarrer votre machine. Lors du démarrage de celle-ci vous devriez voir le message suivant : &lt;br /&gt;
ACPI: Looking for DSDT in initrd... found (at offset 0x4f8d9).&lt;br /&gt;
ACPI-0294: *** Info: Table [DSDT] replaced by host OS&lt;br /&gt;
Vous voilà maintenant avec une table DSDT correcte et un ACPI fonctionnel. La question qui reste ouverte est pourquoi les constructeurs n&#039;utilisent pas un compilateur digne de ce nom pour permettre à leur clients de pouvoir utiliser d&#039;autres systèmes d&#039;exploitation que Windows de Microsoft. &lt;br /&gt;
Pour la petite histoire, si vous cherchez dans votre dsdt vous risquez de tomber ce genre de lignes :&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows NT&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft Windows&amp;quot;), Zero))&lt;br /&gt;
If (LEqual (SCMP (\_OS, &amp;quot;Microsoft WindowsME: Millennium Edition&amp;quot;), Zero))&lt;br /&gt;
 If (LEqual (SizeOf (\_OS), 0x27)) &lt;br /&gt;
Lorsque qu&#039;un système d&#039;exploitation souhaite utiliser les ressources ACPI du BIOS, il utilise son nom de système d&#039;exploitation (acpi_os_name). On retrouve donc dans les bios des parties qui ne seront exécutées que pour certains systèmes d&#039;exploitation de Microsoft. On retrouve même certains tests où c&#039;est la longueur du nom qui compte...... Ceci prouve bien que les constructeurs d&#039;ordinateurs savent corriger des tables DSDT pour les systèmes d&#039;exploitation mais pas forcément pour le notre malheureusement. Depuis le noyau 2.6.9, le noyau Linux utilise « Windows NT » comme « acpi_os_name »  pour assurer une meilleure compatibilité matérielle dixit Len Bron d&#039;Intel dans le changelog de cette version.&lt;br /&gt;
Comment trouver le pilote qui va avec votre matériel ?&lt;br /&gt;
Cette question on se la pose souvent mais uniquement lorsque l&#039;on essaye de brancher un nouveau périphérique sur sa machine. Les distributions récentes permettent de détecter automatiquement votre matériel et de lui associer un pilote avec sa configuration. Ce mécanisme fonctionne plutôt bien mais cela n&#039;évite pas les dysfonctionnements voir l&#039;absence de fonctionnement.&lt;br /&gt;
Pour vérifier si votre noyau Linux est capable de supporter un nouveau périphérique PCI par exemple, il suffit d&#039;en récupérer les identifiants PCI (constructeur et produit) puis de les rechercher dans le fichier « /lib/modules/`uname -r`/modules.pcimap » qui est auto-généré lors de la commande depmod.&lt;br /&gt;
L&#039;utilitaire « lspcidrake -v » vous permet de trouver les identifiants PCI de votre carte, la commande « lspci » vous permet de trouver le nom de votre périphérique puis faites un « lspci -n » pour en trouver la correspondance numérique. On utilisera la position du périphérique sur le bus pour retrouver la correspondance numérique « 02:05.0 » dans cet exemple.&lt;br /&gt;
[root@pumphome] lspci&lt;br /&gt;
[....]&lt;br /&gt;
02:05.0 Ethernet controller: Broadcom Corporation BCM4401 100Base-T (rev 01)&lt;br /&gt;
[root@pumphome] lspci -n&lt;br /&gt;
[...]&lt;br /&gt;
02:05.0 Class 0200: 14e4:4401 (rev 01)&lt;br /&gt;
[root@pumphome]&lt;br /&gt;
Ainsi cette carte réseau possède les identifiants 14e4 (constructeur) et 4401 (produit). Il suffit de rechercher cette valeur dans le modules.pcimap, ce qui nous donnera la correspondance en module (pilote).&lt;br /&gt;
[root@pumphome]  grep &amp;quot;0x000014e4 0x00004401&amp;quot; /lib/modules/2.6.12-12mdk-i686-up-4GB/modules.pcimap &lt;br /&gt;
b44               0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
bcm4400      0x000014e4 0x00004401 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0&lt;br /&gt;
On voit ici que cette carte peut utiliser le driver b44 ou le driver bcm4400. On ne trouve pas toujours les identifiants PCI de produit sous leur forme directe, on peut également trouver « 0Xffffffff » qui indique que tous les cartes du constructeur sont gérées par un module.&lt;br /&gt;
Il ne vous restera plus qu&#039;à effectuer la configuration associée à ce périphérique pour qu&#039;il fonctionne correctement.&lt;br /&gt;
Conclusion&lt;br /&gt;
La fin de cet article conclut une toute petite série de deux articles ayant pour but de vulgariser l&#039;architecture de nos machines, de découvrir les outils disponibles pour mieux comprendre leur configuration et au besoin régler les problèmes de configuration matérielle qui ont souvent le don de nous pourrir la vie.&lt;br /&gt;
Merci à LaurentJ de #Mandrivafr pour ses tests complémentaires sur les problèmes d&#039;IO-APIC. Un énorme merci à Nicolas Planel pour sa relecture pointue et également Anne pour sa patience de girafe à relire et « quaurigé »mes « photes »,  ainsi qu&#039;à tous ceux qui m&#039;ont aidé à découvrir ce que je restitue dans cet article.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=12760</id>
		<title>Proposition d&#039;article</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=12760"/>
		<updated>2006-06-10T21:39:49Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Proposition d&#039;article =&lt;br /&gt;
Indiquer ici les articles qui manquent et que vous vous proposez de créer, puis créez les ! Si vous avez besoin de mettre des images dans votre article, n&#039;hésitez pas à demander à Léa les [[Lea_Linux:Groupe_Editeur|droit d&#039;éditeurs]]. &#039;&#039;&#039;Ne mettez pas&#039;&#039;&#039; des articles que vous désireriez voir écrits par quelqu&#039;un d&#039;autre que vous ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;cadre type=alert&amp;gt;&#039;&#039;&#039;Note :&#039;&#039;&#039; pour proposer un nouveau truc ou une nouvelle astuce, utiliser [[Trucs:Proposition_d&#039;un_truc|cette page]].&amp;lt;/cadre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il suffit d&#039;insérer dans la section qui correspond à votre article, quelque chose du genre : &lt;br /&gt;
* exemple : &amp;lt;nowiki&amp;gt;[[Nom de l&#039;article]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
qui donnera : &lt;br /&gt;
* exemple : [[Nom de l&#039;article]] (SVP ne créez pas l&#039;article &#039;&#039;&#039;Nom de l&#039;article&#039;&#039;&#039;).&lt;br /&gt;
== Rubrique : Installation ==&lt;br /&gt;
* [[UBUNTU et eagle-usb]] [[Utilisateur: mujma|Marc UJMA]]&lt;br /&gt;
* [[Guide d&#039;installation Linux SuSE 10.0 pas à pas]] leibowitz 29 janvier 2006&lt;br /&gt;
* [[Guide d&#039;installation et de configuration de Fluxbox,Conky, Idesk, Fbpager]] pingadaroça 31/01/06&lt;br /&gt;
&lt;br /&gt;
== Rubrique : X Window ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Logiciels ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Matériel ==&lt;br /&gt;
&lt;br /&gt;
* [[Hardware-hard_plus-matos_bis]]&lt;br /&gt;
&lt;br /&gt;
== BarracudaDrive ==&lt;br /&gt;
 une serveur sécurisé par SSL en 1024 bits permettant l&#039;échange de très gros fichiers en toute confidentialité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Le réseau ==&lt;br /&gt;
* [[Streaming mp3 avec Icecast2 et ices]]. --[[Utilisateur:CoKe|CoKe]] 4 avr 2006 à 16:04 (CEST)&lt;br /&gt;
* [[Debian GNU/Linux et IPv6]]. [[Utilisateur: Thomas Carlu|Thomas Carlu]] 25 oct 2005 à 1:15 (CEST)&lt;br /&gt;
* [[Sécurité des réseaux WIFI]]. --[[Utilisateur:Maston28|Maston28]] 13 nov 2005 à 16:30 (CET)&lt;br /&gt;
* [[Configurer le wifi avec une livebox, freebox etc...]] par Samiche, avril 2006&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
* [[Tunnels ethernet avec openssh]]. --[[Utilisateur:Misc|Misc]] 12 fév 2006 à 13:30 (CET)&lt;br /&gt;
* [[Créer un point d&#039;accès sécurisé avec hostAPd]] --[[Utilisateur:Glandos|Glandos]] 26 avr 2006 à 23:16 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Administrer ==&lt;br /&gt;
* [[Arrêter Windows et son routeur Linux]], [[Utilisateur:Vivecom|Vivecom]] 26 nov 2005 à 16:40 (CET)&lt;br /&gt;
* [[S&#039;identifier par une clé USB]], [[Utilisateur:thomas debay]] 28 fév 2006&lt;br /&gt;
&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
* [[Gestion des ACL]] (ou [[ACL]] pour le titre). [[Utilisateur:Vincent Ramos|Vincent Ramos]] 24 oct 2005 à 23:00 (CEST)&lt;br /&gt;
::Fait. Bien qu&#039;améliorable, l&#039;article me semble complet. [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 00:22 (CEST) ;&lt;br /&gt;
* [[Attributs étendus]] (&#039;&#039;chattr&#039;&#039; sur ext2 et ext3, outils efs2progs) [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 17:40 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Noyau et modules ==&lt;br /&gt;
&lt;br /&gt;
* [[RT2500]] : compilation et installation du modules RT2500 Pour les cartes wifi , essai avec la carte &#039;&#039;&#039;PCI PC54G2&#039;&#039;&#039; , Auteur: Laplaine Freddy, Alias mr_pupu[corbeille]&lt;br /&gt;
&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
* [[HOWTO Dkms]] : Utiliser dkms pour gérer ses drivers dynamiquement et facilement&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Développer ==&lt;br /&gt;
&lt;br /&gt;
* [[Ocaml]] : une présentation du langage ocaml&lt;br /&gt;
*[[FreePascal]] : Un langage familier pour nombre de développeurs [[Utilisateur: mujma|Marc UJMA]]&lt;br /&gt;
*[[Trucs:Obtenir le code HTML d&#039;un glyphe]] [[Utilisateur:Nicola|Nicola]] 2 jan 2006 à 19:10 (CET)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Léavancé ==&lt;br /&gt;
&lt;br /&gt;
* [[Virtualisation avec Xen]]&lt;br /&gt;
* [[OpenMosix]] axé Slackware mais applicable à d&#039;autres distributions&lt;br /&gt;
* [[Compilation Distribuée]] ou comment accélérer ses compilations&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Lea_Linux:Les_nouvelles&amp;diff=12759</id>
		<title>Lea Linux:Les nouvelles</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Lea_Linux:Les_nouvelles&amp;diff=12759"/>
		<updated>2006-06-10T21:35:36Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Les nouvelles de Léa */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--Cette page n&#039;est pas destinée à être éditée--&amp;gt;&lt;br /&gt;
=== Les nouvelles de Léa ===&lt;br /&gt;
; [[HOWTO_Dkms|HowTo DKMS]] : Découvrez DKMS et simplifiez-vous la gestion des pilotes sur Linux&lt;br /&gt;
; [[Trucs:Passer à X11R7 (gentoo)]] : passer de la version monolithique à la version modulaire de votre serveur X&lt;br /&gt;
; [[Créer un point d&#039;accès sécurisé avec hostAPd]] : configuration d&#039;une carte Wifi en point d&#039;accès.&lt;br /&gt;
; [[Trucs:Utiliser les boutons de son scanneur|Utiliser les boutons de son scanneur]] : comment utiliser les boutons des scanners actuels&lt;br /&gt;
; [[Tunnels ethernet avec openssh]] : [[Utilisateur:Misc|Misc]] nous explique comment configurer des tunnels ssh avec openssh 4.3&lt;br /&gt;
; [[Hardware-hard_autres-clavier_multimedia#xev_ne_r.C3.A9agit_pas_.C3.A0_vos_touches|Clavier multimedia]] : une mise à jour spécifique aux claviers récalcitrants qui ne veulent rien dire à &amp;lt;code&amp;gt;xev&amp;lt;/code&amp;gt;&lt;br /&gt;
; [[Utiliser la carte wifi Intel PRO Wireless 2200BG]] : accéder à un réseau Wifi avec cette carte Intel.&lt;br /&gt;
; [[Trucs:Correction_orthographique_dans_votre_navigateur|Correction orthographique dans votre navigateur]] : Comment éviter de faire des fautes dans les forums.&lt;br /&gt;
; [[Epson Perfection 3490]] : [[Utilisateur:Martin.riondet|Martin.riondet]] nous explique comment paramétrer ce scanner.&lt;br /&gt;
; [[Utiliser groff]] : Marc Ujma nous fait une petite introduction à cet outil méconnu qu&#039;est groff.&lt;br /&gt;
; [[Lea_Linux:AG 2005]] : L&#039;assemblée générale des adhérents de Léa aura lieu le samedi 3 Décembre 2005.&lt;br /&gt;
; [[Attributs étendus]] : une introduction aux attributs étendus disponibles sur certain système de fichiers par [[Utilisateur:Vincent Ramos|Vincent Ramos]].&lt;br /&gt;
; [[Gestion des ACL]] : une introduction à la gestion des ACL (Access Control List)&lt;br /&gt;
; [[Fiches:Windows-ficheoffice|Lire ses documents Office]] : une nouvelle fiche pratique par AlSim.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Lea_Linux:Les_nouvelles&amp;diff=12758</id>
		<title>Lea Linux:Les nouvelles</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Lea_Linux:Les_nouvelles&amp;diff=12758"/>
		<updated>2006-06-10T21:35:16Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Les nouvelles de Léa */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--Cette page n&#039;est pas destinée à être éditée--&amp;gt;&lt;br /&gt;
=== Les nouvelles de Léa ===&lt;br /&gt;
; [[HOWTO_Dkms HowTo DKMS]] : Découvrez DKMS et simplifiez-vous la gestion des pilotes sur Linux&lt;br /&gt;
; [[Trucs:Passer à X11R7 (gentoo)]] : passer de la version monolithique à la version modulaire de votre serveur X&lt;br /&gt;
; [[Créer un point d&#039;accès sécurisé avec hostAPd]] : configuration d&#039;une carte Wifi en point d&#039;accès.&lt;br /&gt;
; [[Trucs:Utiliser les boutons de son scanneur|Utiliser les boutons de son scanneur]] : comment utiliser les boutons des scanners actuels&lt;br /&gt;
; [[Tunnels ethernet avec openssh]] : [[Utilisateur:Misc|Misc]] nous explique comment configurer des tunnels ssh avec openssh 4.3&lt;br /&gt;
; [[Hardware-hard_autres-clavier_multimedia#xev_ne_r.C3.A9agit_pas_.C3.A0_vos_touches|Clavier multimedia]] : une mise à jour spécifique aux claviers récalcitrants qui ne veulent rien dire à &amp;lt;code&amp;gt;xev&amp;lt;/code&amp;gt;&lt;br /&gt;
; [[Utiliser la carte wifi Intel PRO Wireless 2200BG]] : accéder à un réseau Wifi avec cette carte Intel.&lt;br /&gt;
; [[Trucs:Correction_orthographique_dans_votre_navigateur|Correction orthographique dans votre navigateur]] : Comment éviter de faire des fautes dans les forums.&lt;br /&gt;
; [[Epson Perfection 3490]] : [[Utilisateur:Martin.riondet|Martin.riondet]] nous explique comment paramétrer ce scanner.&lt;br /&gt;
; [[Utiliser groff]] : Marc Ujma nous fait une petite introduction à cet outil méconnu qu&#039;est groff.&lt;br /&gt;
; [[Lea_Linux:AG 2005]] : L&#039;assemblée générale des adhérents de Léa aura lieu le samedi 3 Décembre 2005.&lt;br /&gt;
; [[Attributs étendus]] : une introduction aux attributs étendus disponibles sur certain système de fichiers par [[Utilisateur:Vincent Ramos|Vincent Ramos]].&lt;br /&gt;
; [[Gestion des ACL]] : une introduction à la gestion des ACL (Access Control List)&lt;br /&gt;
; [[Fiches:Windows-ficheoffice|Lire ses documents Office]] : une nouvelle fiche pratique par AlSim.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Lea_Linux:Les_nouvelles&amp;diff=12757</id>
		<title>Lea Linux:Les nouvelles</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Lea_Linux:Les_nouvelles&amp;diff=12757"/>
		<updated>2006-06-10T21:34:30Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Les nouvelles de Léa */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--Cette page n&#039;est pas destinée à être éditée--&amp;gt;&lt;br /&gt;
=== Les nouvelles de Léa ===&lt;br /&gt;
; [[HOWTO_Dkms]] : Découvrez DKMS et simplifiez-vous la gestion des pilotes sur Linux&lt;br /&gt;
; [[Trucs:Passer à X11R7 (gentoo)]] : passer de la version monolithique à la version modulaire de votre serveur X&lt;br /&gt;
; [[Créer un point d&#039;accès sécurisé avec hostAPd]] : configuration d&#039;une carte Wifi en point d&#039;accès.&lt;br /&gt;
; [[Trucs:Utiliser les boutons de son scanneur|Utiliser les boutons de son scanneur]] : comment utiliser les boutons des scanners actuels&lt;br /&gt;
; [[Tunnels ethernet avec openssh]] : [[Utilisateur:Misc|Misc]] nous explique comment configurer des tunnels ssh avec openssh 4.3&lt;br /&gt;
; [[Hardware-hard_autres-clavier_multimedia#xev_ne_r.C3.A9agit_pas_.C3.A0_vos_touches|Clavier multimedia]] : une mise à jour spécifique aux claviers récalcitrants qui ne veulent rien dire à &amp;lt;code&amp;gt;xev&amp;lt;/code&amp;gt;&lt;br /&gt;
; [[Utiliser la carte wifi Intel PRO Wireless 2200BG]] : accéder à un réseau Wifi avec cette carte Intel.&lt;br /&gt;
; [[Trucs:Correction_orthographique_dans_votre_navigateur|Correction orthographique dans votre navigateur]] : Comment éviter de faire des fautes dans les forums.&lt;br /&gt;
; [[Epson Perfection 3490]] : [[Utilisateur:Martin.riondet|Martin.riondet]] nous explique comment paramétrer ce scanner.&lt;br /&gt;
; [[Utiliser groff]] : Marc Ujma nous fait une petite introduction à cet outil méconnu qu&#039;est groff.&lt;br /&gt;
; [[Lea_Linux:AG 2005]] : L&#039;assemblée générale des adhérents de Léa aura lieu le samedi 3 Décembre 2005.&lt;br /&gt;
; [[Attributs étendus]] : une introduction aux attributs étendus disponibles sur certain système de fichiers par [[Utilisateur:Vincent Ramos|Vincent Ramos]].&lt;br /&gt;
; [[Gestion des ACL]] : une introduction à la gestion des ACL (Access Control List)&lt;br /&gt;
; [[Fiches:Windows-ficheoffice|Lire ses documents Office]] : une nouvelle fiche pratique par AlSim.&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=12754</id>
		<title>Proposition d&#039;article</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=12754"/>
		<updated>2006-06-10T10:24:42Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Rubrique : Noyau et modules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Proposition d&#039;article =&lt;br /&gt;
Indiquer ici les articles qui manquent et que vous vous proposez de créer, puis créez les ! Si vous avez besoin de mettre des images dans votre article, n&#039;hésitez pas à demander à Léa les [[Lea_Linux:Groupe_Editeur|droit d&#039;éditeurs]]. &#039;&#039;&#039;Ne mettez pas&#039;&#039;&#039; des articles que vous désireriez voir écrits par quelqu&#039;un d&#039;autre que vous ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;cadre type=alert&amp;gt;&#039;&#039;&#039;Note :&#039;&#039;&#039; pour proposer un nouveau truc ou une nouvelle astuce, utiliser [[Trucs:Proposition_d&#039;un_truc|cette page]].&amp;lt;/cadre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il suffit d&#039;insérer dans la section qui correspond à votre article, quelque chose du genre : &lt;br /&gt;
* exemple : &amp;lt;nowiki&amp;gt;[[Nom de l&#039;article]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
qui donnera : &lt;br /&gt;
* exemple : [[Nom de l&#039;article]] (SVP ne créez pas l&#039;article &#039;&#039;&#039;Nom de l&#039;article&#039;&#039;&#039;).&lt;br /&gt;
== Rubrique : Installation ==&lt;br /&gt;
* [[UBUNTU et eagle-usb]] [[Utilisateur: mujma|Marc UJMA]]&lt;br /&gt;
* [[Guide d&#039;installation Linux SuSE 10.0 pas à pas]] leibowitz 29 janvier 2006&lt;br /&gt;
* [[Guide d&#039;installation et de configuration de Fluxbox,Conky, Idesk, Fbpager]] pingadaroça 31/01/06&lt;br /&gt;
&lt;br /&gt;
== Rubrique : X Window ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Logiciels ==&lt;br /&gt;
&lt;br /&gt;
== BarracudaDrive ==&lt;br /&gt;
 une serveur sécurisé par SSL en 1024 bits permettant l&#039;échange de très gros fichiers en toute confidentialité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Le réseau ==&lt;br /&gt;
* [[Streaming mp3 avec Icecast2 et ices]]. --[[Utilisateur:CoKe|CoKe]] 4 avr 2006 à 16:04 (CEST)&lt;br /&gt;
* [[Debian GNU/Linux et IPv6]]. [[Utilisateur: Thomas Carlu|Thomas Carlu]] 25 oct 2005 à 1:15 (CEST)&lt;br /&gt;
* [[Sécurité des réseaux WIFI]]. --[[Utilisateur:Maston28|Maston28]] 13 nov 2005 à 16:30 (CET)&lt;br /&gt;
* [[Configurer le wifi avec une livebox, freebox etc...]] par Samiche, avril 2006&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
* [[Tunnels ethernet avec openssh]]. --[[Utilisateur:Misc|Misc]] 12 fév 2006 à 13:30 (CET)&lt;br /&gt;
* [[Créer un point d&#039;accès sécurisé avec hostAPd]] --[[Utilisateur:Glandos|Glandos]] 26 avr 2006 à 23:16 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Administrer ==&lt;br /&gt;
* [[Arrêter Windows et son routeur Linux]], [[Utilisateur:Vivecom|Vivecom]] 26 nov 2005 à 16:40 (CET)&lt;br /&gt;
* [[S&#039;identifier par une clé USB]], [[Utilisateur:thomas debay]] 28 fév 2006&lt;br /&gt;
&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
* [[Gestion des ACL]] (ou [[ACL]] pour le titre). [[Utilisateur:Vincent Ramos|Vincent Ramos]] 24 oct 2005 à 23:00 (CEST)&lt;br /&gt;
::Fait. Bien qu&#039;améliorable, l&#039;article me semble complet. [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 00:22 (CEST) ;&lt;br /&gt;
* [[Attributs étendus]] (&#039;&#039;chattr&#039;&#039; sur ext2 et ext3, outils efs2progs) [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 17:40 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Noyau et modules ==&lt;br /&gt;
&lt;br /&gt;
* [[RT2500]] : compilation et installation du modules RT2500 Pour les cartes wifi , essai avec la carte &#039;&#039;&#039;PCI PC54G2&#039;&#039;&#039; , Auteur: Laplaine Freddy, Alias mr_pupu[corbeille]&lt;br /&gt;
&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
* [[HOWTO Dkms]] : Utiliser dkms pour gérer ses drivers dynamiquement et facilement&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Développer ==&lt;br /&gt;
&lt;br /&gt;
* [[Ocaml]] : une présentation du langage ocaml&lt;br /&gt;
*[[FreePascal]] : Un langage familier pour nombre de développeurs [[Utilisateur: mujma|Marc UJMA]]&lt;br /&gt;
*[[Trucs:Obtenir le code HTML d&#039;un glyphe]] [[Utilisateur:Nicola|Nicola]] 2 jan 2006 à 19:10 (CET)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Léavancé ==&lt;br /&gt;
&lt;br /&gt;
* [[Virtualisation avec Xen]]&lt;br /&gt;
* [[OpenMosix]] axé Slackware mais applicable à d&#039;autres distributions&lt;br /&gt;
* [[Compilation Distribuée]] ou comment accélérer ses compilations&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=12753</id>
		<title>Proposition d&#039;article</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=12753"/>
		<updated>2006-06-10T09:54:50Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Rubrique : Noyau et modules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Proposition d&#039;article =&lt;br /&gt;
Indiquer ici les articles qui manquent et que vous vous proposez de créer, puis créez les ! Si vous avez besoin de mettre des images dans votre article, n&#039;hésitez pas à demander à Léa les [[Lea_Linux:Groupe_Editeur|droit d&#039;éditeurs]]. &#039;&#039;&#039;Ne mettez pas&#039;&#039;&#039; des articles que vous désireriez voir écrits par quelqu&#039;un d&#039;autre que vous ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;cadre type=alert&amp;gt;&#039;&#039;&#039;Note :&#039;&#039;&#039; pour proposer un nouveau truc ou une nouvelle astuce, utiliser [[Trucs:Proposition_d&#039;un_truc|cette page]].&amp;lt;/cadre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il suffit d&#039;insérer dans la section qui correspond à votre article, quelque chose du genre : &lt;br /&gt;
* exemple : &amp;lt;nowiki&amp;gt;[[Nom de l&#039;article]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
qui donnera : &lt;br /&gt;
* exemple : [[Nom de l&#039;article]] (SVP ne créez pas l&#039;article &#039;&#039;&#039;Nom de l&#039;article&#039;&#039;&#039;).&lt;br /&gt;
== Rubrique : Installation ==&lt;br /&gt;
* [[UBUNTU et eagle-usb]] [[Utilisateur: mujma|Marc UJMA]]&lt;br /&gt;
* [[Guide d&#039;installation Linux SuSE 10.0 pas à pas]] leibowitz 29 janvier 2006&lt;br /&gt;
* [[Guide d&#039;installation et de configuration de Fluxbox,Conky, Idesk, Fbpager]] pingadaroça 31/01/06&lt;br /&gt;
&lt;br /&gt;
== Rubrique : X Window ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Logiciels ==&lt;br /&gt;
&lt;br /&gt;
== BarracudaDrive ==&lt;br /&gt;
 une serveur sécurisé par SSL en 1024 bits permettant l&#039;échange de très gros fichiers en toute confidentialité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Le réseau ==&lt;br /&gt;
* [[Streaming mp3 avec Icecast2 et ices]]. --[[Utilisateur:CoKe|CoKe]] 4 avr 2006 à 16:04 (CEST)&lt;br /&gt;
* [[Debian GNU/Linux et IPv6]]. [[Utilisateur: Thomas Carlu|Thomas Carlu]] 25 oct 2005 à 1:15 (CEST)&lt;br /&gt;
* [[Sécurité des réseaux WIFI]]. --[[Utilisateur:Maston28|Maston28]] 13 nov 2005 à 16:30 (CET)&lt;br /&gt;
* [[Configurer le wifi avec une livebox, freebox etc...]] par Samiche, avril 2006&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
* [[Tunnels ethernet avec openssh]]. --[[Utilisateur:Misc|Misc]] 12 fév 2006 à 13:30 (CET)&lt;br /&gt;
* [[Créer un point d&#039;accès sécurisé avec hostAPd]] --[[Utilisateur:Glandos|Glandos]] 26 avr 2006 à 23:16 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Administrer ==&lt;br /&gt;
* [[Arrêter Windows et son routeur Linux]], [[Utilisateur:Vivecom|Vivecom]] 26 nov 2005 à 16:40 (CET)&lt;br /&gt;
* [[S&#039;identifier par une clé USB]], [[Utilisateur:thomas debay]] 28 fév 2006&lt;br /&gt;
&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
* [[Gestion des ACL]] (ou [[ACL]] pour le titre). [[Utilisateur:Vincent Ramos|Vincent Ramos]] 24 oct 2005 à 23:00 (CEST)&lt;br /&gt;
::Fait. Bien qu&#039;améliorable, l&#039;article me semble complet. [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 00:22 (CEST) ;&lt;br /&gt;
* [[Attributs étendus]] (&#039;&#039;chattr&#039;&#039; sur ext2 et ext3, outils efs2progs) [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 17:40 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Noyau et modules ==&lt;br /&gt;
&lt;br /&gt;
* [[RT2500]] : compilation et installation du modules RT2500 Pour les cartes wifi , essai avec la carte &#039;&#039;&#039;PCI PC54G2&#039;&#039;&#039; , Auteur: Laplaine Freddy, Alias mr_pupu[corbeille]&lt;br /&gt;
&lt;br /&gt;
=== Publiés ===&lt;br /&gt;
*[[HOWTO Dkms]]&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Développer ==&lt;br /&gt;
&lt;br /&gt;
* [[Ocaml]] : une présentation du langage ocaml&lt;br /&gt;
*[[FreePascal]] : Un langage familier pour nombre de développeurs [[Utilisateur: mujma|Marc UJMA]]&lt;br /&gt;
*[[Trucs:Obtenir le code HTML d&#039;un glyphe]] [[Utilisateur:Nicola|Nicola]] 2 jan 2006 à 19:10 (CET)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Léavancé ==&lt;br /&gt;
&lt;br /&gt;
* [[Virtualisation avec Xen]]&lt;br /&gt;
* [[OpenMosix]] axé Slackware mais applicable à d&#039;autres distributions&lt;br /&gt;
* [[Compilation Distribuée]] ou comment accélérer ses compilations&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12752</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12752"/>
		<updated>2006-06-10T09:54:07Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Références */&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;
Figure 1 : États d&#039;un module dans DKMS&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>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12751</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12751"/>
		<updated>2006-06-10T09:49:32Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &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;
Figure 1 : États d&#039;un module dans DKMS&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;br /&gt;
Contexte&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12750</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12750"/>
		<updated>2006-06-10T09:44:56Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Configurer votre noyau]]&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;
Figure 1 : États d&#039;un module dans DKMS&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;br /&gt;
Contexte&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12749</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12749"/>
		<updated>2006-06-10T09:42:34Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Kernel]]&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;
Figure 1 : États d&#039;un module dans DKMS&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;br /&gt;
Contexte&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12748</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12748"/>
		<updated>2006-06-10T09:40:09Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Structure sur le disque */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Figure 1 : États d&#039;un module dans DKMS&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;br /&gt;
Contexte&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12747</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12747"/>
		<updated>2006-06-10T09:38:38Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Références */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Figure 1 : États d&#039;un module dans DKMS&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 /usr/src&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 /etc/dkms/framework.conf 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;
Contexte&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12746</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12746"/>
		<updated>2006-06-10T09:38:16Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Références */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Figure 1 : États d&#039;un module dans DKMS&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 /usr/src&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 /etc/dkms/framework.conf 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;
Contexte&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12745</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12745"/>
		<updated>2006-06-10T09:37:54Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Références */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Figure 1 : États d&#039;un module dans DKMS&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 /usr/src&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 /etc/dkms/framework.conf 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@mandriva.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;
Contexte&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12744</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12744"/>
		<updated>2006-06-10T09:37:31Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Inconvénients */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Figure 1 : États d&#039;un module dans DKMS&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 /usr/src&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 /etc/dkms/framework.conf 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@mandriva.com&amp;gt;&lt;br /&gt;
Cet article a été initialement publié dans le GNU/Linux Magazine 80 de Février 2006&lt;br /&gt;
Contexte&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12743</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12743"/>
		<updated>2006-06-10T09:37:05Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Avantages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Figure 1 : États d&#039;un module dans DKMS&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 /usr/src&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 /etc/dkms/framework.conf 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@mandriva.com&amp;gt;&lt;br /&gt;
Cet article a été initialement publié dans le GNU/Linux Magazine 80 de Février 2006&lt;br /&gt;
Contexte&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12742</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12742"/>
		<updated>2006-06-10T09:36:31Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Intégration avec rpm */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Figure 1 : États d&#039;un module dans DKMS&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 /usr/src&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 /etc/dkms/framework.conf 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@mandriva.com&amp;gt;&lt;br /&gt;
Cet article a été initialement publié dans le GNU/Linux Magazine 80 de Février 2006&lt;br /&gt;
Contexte&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12741</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12741"/>
		<updated>2006-06-10T09:35:35Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Options que l&amp;#039;on peut définir dans le fichier dkms.conf */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Figure 1 : États d&#039;un module dans DKMS&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 /usr/src&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 /etc/dkms/framework.conf 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;
%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}&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@mandriva.com&amp;gt;&lt;br /&gt;
Cet article a été initialement publié dans le GNU/Linux Magazine 80 de Février 2006&lt;br /&gt;
Contexte&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12740</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12740"/>
		<updated>2006-06-10T09:31:08Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Variables disponibles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Figure 1 : États d&#039;un module dans DKMS&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 /usr/src&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 /etc/dkms/framework.conf 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;
alias eth0 bcm4400&lt;br /&gt;
alias eth1 e1000&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;
BUILT_MODULE_NAME[0]=&amp;quot;b44&amp;quot;&lt;br /&gt;
MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;eth&amp;quot;&lt;br /&gt;
&lt;br /&gt;
      Le nouveau modprobe.conf contiendra donc :&lt;br /&gt;
&lt;br /&gt;
alias eth0 bcm4400&lt;br /&gt;
alias eth1 e1000&lt;br /&gt;
alias eth2 b44&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;
alias eth0 b44&lt;br /&gt;
alias eth1 e1000&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;
%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}&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@mandriva.com&amp;gt;&lt;br /&gt;
Cet article a été initialement publié dans le GNU/Linux Magazine 80 de Février 2006&lt;br /&gt;
Contexte&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12739</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12739"/>
		<updated>2006-06-10T09:28:47Z</updated>

		<summary type="html">&lt;p&gt;Ennael : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Figure 1 : États d&#039;un module dans DKMS&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 /usr/src&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 /etc/dkms/framework.conf 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;
alias eth0 bcm4400&lt;br /&gt;
alias eth1 e1000&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;
BUILT_MODULE_NAME[0]=&amp;quot;b44&amp;quot;&lt;br /&gt;
MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;eth&amp;quot;&lt;br /&gt;
&lt;br /&gt;
      Le nouveau modprobe.conf contiendra donc :&lt;br /&gt;
&lt;br /&gt;
alias eth0 bcm4400&lt;br /&gt;
alias eth1 e1000&lt;br /&gt;
alias eth2 b44&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;
alias eth0 b44&lt;br /&gt;
alias eth1 e1000&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;
%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}&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@mandriva.com&amp;gt;&lt;br /&gt;
Cet article a été initialement publié dans le GNU/Linux Magazine 80 de Février 2006&lt;br /&gt;
Contexte&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12738</id>
		<title>DKMS</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=DKMS&amp;diff=12738"/>
		<updated>2006-06-10T09:26:46Z</updated>

		<summary type="html">&lt;p&gt;Ennael : /* Exemple de dkms.conf pour l&amp;#039;ipw2200 1.0.4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Figure 1 : États d&#039;un module dans DKMS&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 /usr/src&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 /etc/dkms/framework.conf 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;/codeQ&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;
alias eth0 bcm4400&lt;br /&gt;
alias eth1 e1000&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;
BUILT_MODULE_NAME[0]=&amp;quot;b44&amp;quot;&lt;br /&gt;
MODULES_CONF_ALIAS_TYPE[0]=&amp;quot;eth&amp;quot;&lt;br /&gt;
&lt;br /&gt;
      Le nouveau modprobe.conf contiendra donc :&lt;br /&gt;
&lt;br /&gt;
alias eth0 bcm4400&lt;br /&gt;
alias eth1 e1000&lt;br /&gt;
alias eth2 b44&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;
alias eth0 b44&lt;br /&gt;
alias eth1 e1000&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;
%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}&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@mandriva.com&amp;gt;&lt;br /&gt;
Cet article a été initialement publié dans le GNU/Linux Magazine 80 de Février 2006&lt;br /&gt;
Contexte&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ennael</name></author>
	</entry>
</feed>