2012-03-23 16 views
25

Solo tengo curiosidad por saber si hay algún modo de determinar si un módulo en particular está cargado/instalado.Cómo determinar si un módulo específico está cargado en el núcleo de Linux

$ lsmod enumera todos los módulos (controlador de dispositivo cargado).

¿Hay alguna manera de verificar o un comando que devuelve resultados booleanos verdadero/falso si se sondea un nombre de módulo? por ej. si keyboard.o existe, devuelve true else false. Necesito este consejo para completar el programa de actualización automática de mi controlador.

PD: intenté modinfo. Estoy usando el cliente de busybox en mi DUT de prueba, entonces, ¿pueden darme otras alternativas además de modinfo?

+1

¿Tiene acceso a grep? –

+0

La pregunta es un poco ambigua.¿Estás tratando de verificar si el controlador está cargado en la memoria o instalado en el sistema? modinfo ayudaría con este último pero no con el anterior. – presto8

Respuesta

19

no estoy seguro de si modinfo modname y revisando $? funcionará para usted, solo una sugerencia.

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

Como alternativa, también GrEP /proc/modules

+1

¿me puede sugerir una alternativa? –

+3

Solo una nota: el enfoque 'modinfo' no parece funcionar realmente para la verificación _loaded_ (como en el título de la pregunta). Muestra información independientemente de si el módulo está cargado. – BeeOnRope

17

modinfo module El método no funciona bien para mí. Prefiero este método que es similar al método alternativo propuesto:

#!/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 
+0

no funciona para mí :( – Megharaj

+0

no funciona en centos 6 (siempre dice que el módulo no está cargado) – Anake

+5

'grep -Eq"^$ {MODULE} ";' –

0
!/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

Aunque su respuesta se ve bien, debe incluir una pequeña explicación. .. código simple puede ser bueno, pero el código * y * explicación es mejor – Barranka

3

La mejor idea es crear una función 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 
6

La bandera --first-time provoca modprobe a fallar si el módulo ya está cargado Que en conjunto con el --dry-run (o la forma abreviada -n) bandera hace un buen ensayo:

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

Edición 1: Como @Nobody señaló esto también imprime Loaded si el módulo no existe. Podemos solucionar este problema mediante la combinación con modinfo:

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

Edición 2: En algunos sistemas modprobe vive en /usr/sbin, que no está en el $PATH menos que sea root. En ese caso, debe sustituir modprobe por /usr/sbin/modprobe en el cuadro anterior.

+3

Problema: Necesita root y cuando ingresa mierda para $ MODULO dice que $ MODULO está cargado. – Nobody

+0

@ Nadie No necesita root en mi sistema. – jpath

+1

Oh, lo siento, solo fui medio correcto (o quizás correcto). En Debian, modprobe no está en $ PATH para usuarios normales, así que copiar y pegar tu comando solo funciona como root. Pero cuando se llama a modprobe con su ruta completa, es ejecutable para usuarios normales y solo falla la operación de inserción real, por lo que su solución funciona en principio. Todavía creo que consultar/proc/modules es más elegible hormiga, pero eso es una cuestión de gusto. Si hubiera votado negativamente su respuesta, habría eliminado la votación ahora (pero no lo hice). – Nobody

4

me escribió esto:

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

Se comprueba en /proc/modules. Si el módulo se menciona allí, se supone que está cargado; de lo contrario, no.

Los otros me parecieron demasiado largos (el otro corto requiere root, no es así). Por supuesto, acaba de escribir lo que ya se mencionó como "alternativas".

Precaución: modprobe acepta algunas variantes de nombres de módulos que no sean los principales enumerados en /proc/modules. Por ejemplo, cargando snd-aloop funciona, pero el módulo se llama snd_aloop y aparece como tal en /proc/modules y cuando usa rmmod ese es también el único nombre que funcionará.

+2

En su lugar, puede hacer coincidir con '"^$ MODULE \> "' para asegurarse de que no coincida solo con una parte del nombre del módulo. – jpath

Cuestiones relacionadas