# [HowTo] Charger des modules différents selon le kernel

## yaubi

Bonjour à tous,

La question de Gnafron (https://forums.gentoo.org/viewtopic.php?t=149726) m'a rappelé qu'il y a quelques mois je jonglais avec une bonne dixaine de noyaux, de différentes versions, différentes branches, différentes configurations. J'avais besoin de tester un module kernel en béta dans de multiples environnements. 

Le problème qui frappe instantanément est celui du chargement des modules au démarrage. Certes, on peut les charger à la main, mais c'est fastidieux, et puis surtout il y a un service pour faire ça automatiquement, j'ai nommé : /etc/init.d/modules.

Pour ceux qui ne sont pas sûr de la manière dont il fonctionne, c'est très simple : il regarde quelle est la version du kernel en cours de fonctionnement et charge les modules indiqués dans le fichier /etc/modules.autoload.d/kernel-VERSION.

La limitation de ce script vient du fait qu'il ne fait pas une distinction très détaillée entre les noyaux : tout au plus, il va différencier un 2.4 d'un 2.6. Ca serait quand même bien pratique qu'il puisse faire la différence entre :

 - un 2.4.22 et un 2.4.24

 - un 2.4.22-gentoo et un 2.4.22-ck

 - un 2.4.22-gentoo-r6 et un 2.4.22-gentoo-r7

 - un 2.4.22-gentoo-r6 #1 et un 2.4.22-gentoo-r6 #3

Dans le dernier exemple, le premier noyau correspond à la première compilation (#1) tandis que le deuxième correspond à la troisième (#3). On peut connaître le numéro de compilation en faisant : uname -rv

J'ai donc modifié un peu le script /etc/init.d/modules pour qu'il prenne en compte ces différences, à chaque niveau. Voir le patch en fin de post.

Ainsi, le fichier /etc/modules.autoload.d/kernel-2.4.22-gentoo-r6#3 listera les modules à charger pour le noyau du même nom. Pour simplifier la tâche,  j'ai prévu qu'on ne soit pas forcément obliger de nommer ce fichier de manière aussi précise. On peut se limiter à /etc/modules.autoload.d/kernel-2.4.22, auquel cas la liste des modules qu'il contient sera chargée pour tous les noyau 2.4.22 qui n'ont pas leur propre fichier. En fait, on peut choisir le niveau de détection : depuis 2.4 jusqu'à 2.4.22-gentoo-r7#1 (voir les exemples plus haut).

Voilà, c'était mon défi du jour  :Smile: 

J'espère que ça servira à quelqu'un.

Sur ce, bonnes vacances ! (enfin pour moi, c'est les vacances, en France je ne sais pas)

Yoann

PJ: Voici mon patch :

```
--- ./modules   2004-03-16 16:31:54.000000000 +0000

+++ /etc/init.d/modules 2004-03-16 17:11:55.000000000 +0000

@@ -94,22 +94,35 @@

                # Loop over every line in /etc/modules.autoload.

                load_modules /etc/modules.autoload

        else

-               local KV="$(uname -r)"

-               local KV_MAJOR="`KV_major "${KV}"`"

-               local KV_MINOR="`KV_minor "${KV}"`"

-

+               local KV_build=$(uname -rv | cut -d' ' -f1,2 | sed 's/ //')

+               local KV_release=$(echo ${KV_build} | cut -d'#' -f1)

+               local KV_branch=$(echo ${KV_release} | cut -d'-' -f1,2)

+               local KV_micro=$(echo ${KV_branch} | cut -d'-' -f1)

+               local KV_minor=$(echo ${KV_micro} | cut -d'.' -f1,2)

+

                # New support for /etc/modules.autoload/kernel-$KV

-               if [ "$(get_KV)" -ge "$(KV_to_int '2.5.48')" ] && \

-                  [ -f /etc/modules.autoload.d/kernel-"${KV_MAJOR}.${KV_MINOR}" ]

+                if [ -e /etc/modules.autoload.d/kernel-${KV_build} ]

                then

-                       load_modules /etc/modules.autoload.d/kernel-"${KV_MAJOR}.${KV_MINOR}"

-

-               elif [ ! -f /etc/modules.autoload.d/kernel-"${KV_MAJOR}.${KV_MINOR}" ]

+                  load_modules /etc/modules.autoload.d/kernel-${KV_build}

+

+               elif [ -e /etc/modules.autoload.d/kernel-${KV_release} ]

                then

-                       ewarn "Missing /etc/modules.autoload.d/kernel-${KV_MAJOR}.${KV_MINOR}"

-                       load_modules /etc/modules.autoload.d/kernel-2.4

-               else

-                       load_modules /etc/modules.autoload.d/kernel-2.4

+                  load_modules /etc/modules.autoload.d/kernel-${KV_release}

+

+               elif [ -e /etc/modules.autoload.d/kernel-${KV_branch} ]

+               then

+                  load_modules /etc/modules.autoload.d/kernel-${KV_branch}

+

+               elif [ -e /etc/modules.autoload.d/kernel-${KV_micro} ]

+               then

+                  load_modules /etc/modules.autoload.d/kernel-${KV_micro}

+

+               elif [ -e /etc/modules.autoload.d/kernel-${KV_minor} ]

+               then

+                  load_modules /etc/modules.autoload.d/kernel-${KV_minor}

+

+                else

+                  ewarn "Missing /etc/modules.autoload.d/kernel-${KV_build}"

                fi

        fi

  

```

----------

## anigel

Excellente idée !

Tu as pensé à soumettre ton travail pour l'incorporer dans la distrib ? J'avais moi aussi bricolé un truc similaire il y a quelques mois, mais je n'avais jamais pensé à le diffuser.

M'est d'avis qu'on doit pas être juste 2 tordus à avoir l'usage d'un tel patch ?

----------

## Duncan117

Merci beaucoup Yoann !   :Cool: 

Effectivement anigel, vous ne devez pas être que 2 tordus   :Laughing:  à utiliser un tel patch. En fait, si je n'utilisais pas beaucoup ce mécanisme, c'est parce qu'il n'était pas aussi souple que vous venez de le rendre.

Merci encore. Trés pratique maintenant et je n'aurais aucune excuse de ne pas l'utiliser.  :Wink: 

----------

## DomiX

Bonjour 

Ce patch m'intéresse mais comment l'appliquer ?   :Embarassed:   :Rolling Eyes: 

A+

----------

## yaubi

 *anigel wrote:*   

> Excellente idée !

 

Merci, merci, tu es trop bon ...  :Smile: 

 *anigel wrote:*   

> Tu as pensé à soumettre ton travail pour l'incorporer dans la distrib ?

 

Non, je n'ai pas soumis mon travail pour l'incorporer dans la distrib'. Ca n'est pas encore suffisament testé pour en prétendre quelque chose, à mon avis. Et puis je ne pense pas que ce soit une solution robuste, c'est juste une bidouille faite à la va-vite. D'ailleurs, je viens de me rendre compte aujourd'hui que mon patch ne gère pas le cas des Release Candidate (par ex: 2.4.26-rc3-gentoo). Et comme j'ai la flemme de le modifier ...

Mais bon, rien n'empèche l'un de vous de le reprendre, éventuellement le modifier, et soumettre un rapport de bug à l'équipe de développement  :Smile: 

Yoann

----------

## yaubi

 *DomiX wrote:*   

> Bonjour 
> 
> Ce patch m'intéresse mais comment l'appliquer ?   
> 
> A+

 

Bonjour Domix.

Pour appliquer ce patch, rien de plus simple :

 - copie/colle le patch dans un fichier qu'on appellera modules.patch, par exemple

 - exécute la commande patch -p0 < modules.patch en tant que root

et voila ! 

Tu n'as plus qu'à créer, dans /etc/modules.autoload.d/, un fichier au nom de ton noyau (voir mon premier post), contenant les modules que tu veux charger au démarrage de ce noyau.

Have Fun !

Yoann

----------

## TGL

Je trouve aussi l'idée excellente, merci yaubi. Je te conseille de bugziller la chose rapidement, même si tu ne la trouves pas parfaite, parceque de toute façon c'est le genre de truc qui prennent toujours du temps à être acceptés. Ça permettra aux devs de commencer à réfléchir sur le principe, c'est toujours ça de gagné, voir de corriger aux même les imperfections que tu auras listées.

----------

## yaubi

 *TGL wrote:*   

> Je te conseille de bugziller la chose rapidement

 

Oui, Ôh grand modérateur, oui !  :Smile: 

Bon, c'est chose faite. Et comme je suis un perfectioniste pointilleux (tout ça d'un seul coup), j'ai tout refait et de manière totalement différente. Du coup, maintenant, c'est du robuste et un plus c'est du joli  :Smile: 

Pour les curieux : https://bugs.gentoo.org/show_bug.cgi?id=35872

Le code commenté :

```
                # New support for /etc/modules.autoload/kernel-$KV

 

                # The kernel version is stored in a question-mark field

                # separator format, like "2?4?26?rc3?gentoo?r2?1", where the

                # final 1 is the build number.

                #

                local KV=kernel-$(uname -rv | awk '{gsub("[.\\-#]","?"); print $1$2}')

 

                # This weird format acts here as a wilcard pattern. The

                # purpose is to find a file whose name is at least part of

                # our kernel version.

                #

                while [ ! $(ls /etc/modules.autoload.d/${KV} 2>/dev/null) ]

                do

                        # Let's drop the last field in the version number

                        # to check if the corresponding file exists

                        #

                        KV_reduced=$(echo ${KV} | awk '{sub("\\?[^\\?]*$",""); print}')

 

                        # If we tried all the possibilities unsucessfully,

                        # then fallback with the ligther name (hopefully the

                        # most general, like kernel-2.4) and print a warning.

                        #

                        if [ ${KV_reduced} == ${KV} ]

                        then

                                KV=$(ls -1 /etc/modules.autoload.d/ | awk '{if(!drop)print;drop++}')

                                ewarn "Missing /etc/modules.autoload.d/kernel-VERSION"

                                break

                        fi

 

                        KV=${KV_reduced}

                done

                # Now we have found the file with the closest name, we just

                # need to load the modules it lists. Note that if

                # /etc/modules.autoload.d/ is empty, KV is an empty string.

                #

                [ ${KV} ] && load_modules $(ls /etc/modules.autoload.d/${KV})

```

Le patch :

```
--- ./modules   2004-03-18 23:31:29.000000000 +0000

+++ /etc/init.d/modules 2004-03-18 23:48:50.000000000 +0000

@@ -92,25 +92,28 @@

        if [ -f /etc/modules.autoload -a ! -L /etc/modules.autoload ]

        then

                # Loop over every line in /etc/modules.autoload.

+               #

                load_modules /etc/modules.autoload

        else

-               local KV="$(uname -r)"

-               local KV_MAJOR="`KV_major "${KV}"`"

-               local KV_MINOR="`KV_minor "${KV}"`"

-

                # New support for /etc/modules.autoload/kernel-$KV

-               if [ "$(get_KV)" -ge "$(KV_to_int '2.5.48')" ] && \

-                  [ -f /etc/modules.autoload.d/kernel-"${KV_MAJOR}.${KV_MINOR}" ]

-               then

-                       load_modules /etc/modules.autoload.d/kernel-"${KV_MAJOR}.${KV_MINOR}"

+

+               local KV=kernel-$(uname -rv | awk '{gsub("[.\\-#]","?"); print $1$2}')

+

+                while [ ! $(ls /etc/modules.autoload.d/${KV} 2>/dev/null) ]

+               do

+                       KV_reduced=$(echo ${KV} | awk '{sub("\\?[^\\?]*$",""); print}')

+

+                       if [ ${KV_reduced} == ${KV} ]

+                       then

+                               KV=$(ls -1 /etc/modules.autoload.d/ | awk '{if(!drop)print;drop++}')

+                               ewarn "Missing /etc/modules.autoload.d/kernel-VERSION"

+                                break

+                       fi

  

-               elif [ ! -f /etc/modules.autoload.d/kernel-"${KV_MAJOR}.${KV_MINOR}" ]

-               then

-                       ewarn "Missing /etc/modules.autoload.d/kernel-${KV_MAJOR}.${KV_MINOR}"

-                       load_modules /etc/modules.autoload.d/kernel-2.4

-               else

-                       load_modules /etc/modules.autoload.d/kernel-2.4

-               fi

+                       KV=${KV_reduced}

+               done

+

+                [ ${KV} ] && load_modules $(ls /etc/modules.autoload.d/${KV})

        fi

  

        #

```

Pour ceux qui ont déja appliqué le premier patch, il faut le retirer avant d'appliquer celui-ci. 

Il est maintenant temps pour moi d'aller me coucher, j'ai de la route à faire demain, je rentre en France. Vive les vacances !!  :Smile: 

Yoann

----------

## TGL

 *yaubi wrote:*   

> Oui, Ôh grand modérateur, oui ! 

  Mais heu, j'peux plus rien dire sans qu'on me traite de modéro, c'est lourd...  :Very Happy: 

 *yaubi wrote:*   

> https://bugs.gentoo.org/show_bug.cgi?id=35872

  Je testerai en détail ce WE avant d'agrémenter ton bug d'un "chez moi ça marche et c'est utile".  :Wink: 

 *yaubi wrote:*   

> Il est maintenant temps pour moi d'aller me coucher, j'ai de la route à faire demain, je rentre en France. Vive les vacances !! 

  Bon retour vers la vrai bouffe.

----------

## yuk159

 *TGL wrote:*   

>  *yaubi wrote:*   Oui, Ôh grand modérateur, oui !   Mais heu, j'peux plus rien dire sans qu'on me traite de modéro, c'est lourd... 

 

C'est la rancon de la gloire ca   :Laughing: 

@Yaubi : je testerai aussi ton patch ce week-end, ca tombe bien parce qu'il faut que je teste les differents noyaux PPC, merci   :Very Happy: 

----------

## yuk159

J'ai malheureusement eu un onduleur qui a crame sur un des petits serveurs dont je m'occupe  :Sad:  , donc je remets mes projets perso au week-end prochain  :Wink: 

----------

## dioxmat

 *TGL wrote:*   

>  *yaubi wrote:*   Oui, Ôh grand modérateur, oui ! :)  Mais heu, j'peux plus rien dire sans qu'on me traite de modéro, c'est lourd... :D
> 
> 

 

Niark ya pas de raison pour que je sois le seul a subir ca :)

----------

## TGL

 *dioxmat wrote:*   

> Niark ya pas de raison pour que je sois le seul a subir ca :)

 

Alors là, un message aussi futile, je trouve ça vraiment déplacé de la part d'un modéro... :Þ

----------

## dioxmat

 *TGL wrote:*   

>  *dioxmat wrote:*   Niark ya pas de raison pour que je sois le seul a subir ca :) 
> 
> Alors là, un message aussi futile, je trouve ça vraiment déplacé de la part d'un modéro... :Þ

 

Entierement d'accord :)

<inserez ici un message pour rester dans le sujet du thread>

----------

## yuk159

Mort de rire   :Laughing:   :Laughing:   :Laughing:  les moderos qui troll entre eux maintenant   :Laughing: 

----------

## **ironman**

Bonjour, 

J'aimerais me servir du patch de Yaubi, le problème est quand je l'exécute j'obtiens l'erreur suivante :

```
 # patch -p0 < modules.patch 

patching file /etc/init.d/modules

Hunk #1 FAILED at 92.

1 out of 1 hunk FAILED -- saving rejects to file /etc/init.d/modules.rej

```

Faut-il placer le patch dans un répertoire spécifique ?

Faut-il l'exécuter depuis un répertoire spécifique ?

Merci pour votre aide.

----------

## billiob

Ce patch n'est pas déja inclus dans portage ??

Ceci ressemble étrangement : (pris de /etc/init.d/modules)

```
 for x in "${KV}" ${KV_MAJOR}.${KV_MINOR}.${KV_MICRO} ${KV_MAJOR}.${KV_MINOR} ; do

                        if [[ -f /etc/modules.autoload.d/kernel-"${x}" ]] ; then

                                autoload="/etc/modules.autoload.d/kernel-${x}"

                                break

                        fi

                done

```

----------

