2012-03-23 11 views
25

Sono curioso di sapere se esiste un modo per determinare se un particolare modulo viene caricato/installato.Come determinare se un modulo specifico è caricato nel kernel Linux

$ lsmod elenca tutti i moduli (driver di periferica caricato).

C'è un modo per controllare o un comando che restituisce l'output booleano vero/falso se viene interrogato il nome di un modulo. per es. se keyboard.o esiste restituisce true else false. ho bisogno di questo suggerimento per completare il mio programma di aggiornamento automatico del driver.

PS: provato modinfo. sto usando il client busybox nel mio test DUT, quindi puoi dare qualche alternativa oltre a modinfo?

+1

Hai accesso a grep? –

+0

La domanda è un po 'ambigua.Stai cercando di verificare se il driver è caricato in memoria o installato sul sistema? modinfo sarebbe d'aiuto con quest'ultimo ma non il primo. – presto8

risposta

19

non sicuro se modinfo modname e controllo $? funzionerà per voi, solo un suggerimento.

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

in alternativa è anche grep /proc/modules

+1

puoi suggerire un'alternativa? –

+3

Solo una nota: l'approccio 'modinfo' sembra non funzionare per il controllo _loaded_ (come nel titolo della domanda). Mostra informazioni indipendentemente dal fatto che il modulo sia caricato. – BeeOnRope

17

Il metodo modinfo module non funziona bene per me. Preferisco questo metodo è simile al metodo alternativo proposto:

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

non funziona per me :( – Megharaj

+0

non funziona in centos 6 (dice sempre che il modulo non è caricato) – 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

Anche se la tua risposta sembra buona, dovresti includere una piccola spiegazione. .. codice semplice può essere buono, ma la spiegazione del codice * e * è migliore – Barranka

3

L'idea migliore è quella di creare una funzione 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

Il flag --first-time provoca modprobe a fallire se il modulo è già caricato. Che in concomitanza con la --dry-run (o la stenografia -n) bandiera fa un bel test:

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

Edit 1: Come @Nobody sottolineato questa stampa anche Loaded se il modulo non esiste. Siamo in grado di risolvere questo problema attraverso la combinazione con modinfo:

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

Edit 2: Su alcuni sistemi modprobe vive in /usr/sbin, che non è nel $PATH meno che non siate root. In tal caso è necessario sostituire modprobe per /usr/sbin/modprobe in quanto sopra.

+3

Problema: richiede root e quando inserisci cazzate per $ MODULO sostiene che è stato caricato $ MODULO – Nobody

+0

@Nobody Non richiede il root sul mio sistema – jpath

+1

Oh, scusate, avevo solo metà destra (o forse un quarto di fila.) Vergogna per gli elettori commentatori.) Su Debian, modprobe non è in $ PATH per gli utenti normali, quindi copia e incolla il comando funziona solo come root. Ma quando si chiama modprobe con il suo percorso completo, è eseguibile per gli utenti normali e solo l'effettiva operazione di inserimento fallisce, quindi la soluzione funziona in linea di principio. Continuo a pensare che la query/proc/modules sia più elegia ma è una questione di gusti. Se avessi svalutato la tua risposta, avrei rimosso il voto ora (ma non l'ho fatto). – Nobody

4

ho scritto questo:

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

Esso controlla in /proc/modules. Se il modulo è menzionato lì, si presume che sia caricato, altrimenti no.

Gli altri mi sembravano troppo lunghi (l'altro breve richiede la radice, non è così). Ovviamente è solo scritto ciò che è già stato detto come "alternative".

Attenzione: modprobe accetta alcune varianti di nomi di modulo diversi dal primario elencato in /proc/modules. Ad esempio, il caricamento di snd-aloop funziona, ma il modulo è denominato snd_aloop ed è elencato come tale in /proc/modules e quando si utilizza rmmod è anche l'unico nome che funzionerà.

+2

Puoi anche cercare "" $ MODULE \> "' per assicurarti che non corrisponda solo a parte del nome del modulo. – jpath

Problemi correlati