web-dev-qa-db-fra.com

Comment déterminer si un module spécifique est chargé dans le noyau Linux

Je suis juste curieux de savoir s'il existe un moyen de déterminer si un module particulier est chargé/installé. 

$ lsmod liste tous les modules (pilote de périphérique chargé).

Existe-t-il un moyen de vérifier ou une commande qui renvoie une sortie true/false booléenne si un nom de module est interrogé. pour par exemple. si keyboard.o existe, retourne vrai sinon faux. J'ai besoin de cette astuce pour compléter mon programme d'actualisation automatique du pilote.

PS: essayé modinfo. J'utilise le client busybox dans mon DUT de test, alors pouvez-vous donner d'autres alternatives que modinfo?

29
Dennis Ninj

je ne sais pas si modinfo modname et vérifier $? fonctionneront pour vous, juste une suggestion.

/tmp$ Sudo modinfo e1000
/tmp$ echo $?
0
/tmp$ Sudo modinfo keyboard
ERROR: modinfo: could not find module keyboard
/tmp$ echo $?
1

sinon vous aussi grep /proc/modules

20
johnshen64

La méthode modinfo module ne fonctionne pas bien pour moi. Je préfère cette méthode qui est similaire à la méthode alternative proposée:

#!/bin/sh

MODULE="$1"

if lsmod | grep "$MODULE" &> /dev/null ; then
  echo "$MODULE is loaded!"
  exit 0
else
  echo "$MODULE is not loaded!"
  exit 1
fi
20
basfest

L'indicateur --first-time entraîne l'échec de modprobe si le module est déjà chargé. Cela, en conjonction avec le drapeau --dry-run (ou le raccourci -n), fait un test de Nice:

modprobe -n --first-time $MODULE && echo "Not loaded" || echo "Loaded"

Edit 1: Comme @Nobody l’a fait remarquer, ceci affiche également Loaded si le module n’existe pas. Nous pouvons résoudre ce problème en le combinant avec modinfo:

modinfo $MODULE >/dev/null 2>/dev/null &&
! modprobe -n --first-time $MODULE 2>/dev/null &&
echo "Loaded" || echo "Not loaded"

Edit 2: Sur certains systèmes, modprobe habite /usr/sbin, qui ne figure pas dans $PATH sauf si vous êtes root. Dans ce cas, vous devez remplacer modprobe par /usr/sbin/modprobe ci-dessus.

6
jpath

J'ai écrit ceci:

MODULE=snd_aloop # for example
test -n "$(grep -e "^$MODULE " /proc/modules)" && echo "Loaded" || echo "Not loaded"

Il vérifie /proc/modules. Si le module est mentionné ici, il est supposé être chargé, sinon pas.

Les autres m'ont semblé trop longs (l'autre court a besoin de racine, ce n'est pas le cas). Bien sûr, il est juste écrit ce qui a déjà été mentionné comme "alternatives".

Attention: modprobe accepte certaines variantes de noms de modules autres que le principal répertorié dans /proc/modules. Par exemple, charger snd-aloop fonctionne, mais le module s'appelle snd_aloop et est répertorié comme tel dans /proc/modules. Lorsque vous utilisez rmmod, c'est également le seul nom qui fonctionne. 

5
Nobody

La meilleure idée est de créer une fonction bash:

#!/bin/sh
function checkModule(){
  MODULE="$1"
  if lsmod | grep "$MODULE" &> /dev/null ; then
    echo "$MODULE is loaded!"
    return 0
  else
    echo "$MODULE is not loaded!"
    return 1
  fi
}

checkModule
if $?; then
  #do somthing
fi
4
مصطفی
 !/bin/sh
 # Module
 MODULE="scsi_dh_rdac"

 #Variables check if module loaded or not
 MODEXIST=/sbin/lsmod | grep "$MODULE"

 if [ -z "$MODEXIST" ]; then
       /sbin/modprobe "$MODULE" >/dev/null 2>&1
 fi
0
ronald