unix - modprobe - Cómo determinar si un módulo específico está cargado en el kernel de Linux
como cargar un modulo en linux (6)
Estoy curioso, hay alguna forma de determinar si un módulo en particular está cargado / instalado.
$ lsmod enumera todos los módulos (controlador de dispositivo cargado).
¿Hay alguna forma de verificar o un comando que devuelva un resultado booleano verdadero / falso si se sondea un nombre de módulo? por ej. si existe keyboard.o, devuelve true si no false. Necesito este consejo para completar mi programa de actualización automática del controlador.
PD: intentado modinfo. Estoy usando el cliente de busybox en mi prueba DUT, ¿puede dar otras alternativas además de modinfo?
El indicador de la primera --first-time
hace que modprobe
falle si el módulo ya está cargado. Esto, junto con la --dry-run
(o la abreviatura -n
) hace una buena prueba:
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 arreglar esto combinándolo 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 $PATH
menos que sea root. En ese caso, debe sustituir modprobe
por /usr/sbin/modprobe
en el /usr/sbin/modprobe
anterior.
El método del modinfo module
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
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
Yo escribí 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, esto no lo hace). Por supuesto, se acaba de escribir lo que ya se mencionó como "alternativas".
Precaución: modprobe
acepta algunas variantes de nombres de módulos distintos de los principales enumerados en /proc/modules
. Por ejemplo, la carga de snd-aloop
funciona, pero el módulo se llama snd_aloop
y aparece como tal en /proc/modules
y cuando se usa rmmod
, también es el único nombre que funcionará.
No estoy seguro si modinfo modname
y chequeando $?
trabajará para usted, sólo una sugerencia.
/tmp$ sudo modinfo e1000
/tmp$ echo $?
0
/tmp$ sudo modinfo keyboard
ERROR: modinfo: could not find module keyboard
/tmp$ echo $?
1
alternativamente también grep /proc/modules
!/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