如何确定Linux内核中是否加载了特定模块

时间:2012-03-23 20:08:21

标签: unix linux-kernel insmod

我很好奇有没有办法确定是否加载/安装了特定模块。

$ lsmod列出所有模块(加载了设备驱动程序)。

如果轮询模块名称,有没有办法检查或返回true / false布尔输出的命令。例如。如果keyboard.o存在则返回true,否则返回false。我需要这个提示来完成我的驱动程序自动刷新程序。

PS:试过modinfo。我在我的测试DUT中使用busybox客户端,那么除了modinfo之外你能给出一些替代方案吗?

9 个答案:

答案 0 :(得分:20)

不确定modinfo modname和检查$?是否适合您,只是一个建议。

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

或者你也grep /proc/modules

答案 1 :(得分:20)

modinfo module方法对我来说效果不佳。我更喜欢这种类似于提出的替代方法的方法:

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

答案 2 :(得分:6)

如果已加载模块,则--first-time标志会导致modprobe失败。与--dry-run(或简写-n)标志结合使用可以很好地进行测试:

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

编辑1:由于@Nobody指出如果模块不存在,这也会打印Loaded。我们可以通过将其与modinfo

组合来解决此问题
modinfo $MODULE >/dev/null 2>/dev/null &&
! modprobe -n --first-time $MODULE 2>/dev/null &&
echo "Loaded" || echo "Not loaded"

编辑2 :某些系统modprobe位于/usr/sbin,除非您是root用户,否则该$PATH不在modprobe。在这种情况下,您必须在上面用/usr/sbin/modprobe代替dataFilter

答案 3 :(得分:6)

我写了这个:

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

检入/proc/modules。如果在那里提到模块,则假定它被加载,否则不加载。

其他人对我来说似乎太长了(另一个短的需要root,这不是)。当然,它只是写出了已经提到的“替代品”。

警告:modprobe接受除/proc/modules中列出的主要模块名称以外的某些模块名称变体。例如,加载snd-aloop有效,但该模块名为snd_aloop,并在/proc/modules中列出,并且在使用rmmod时也是唯一可行的名称。

答案 4 :(得分:4)

更好的想法是创建一个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

答案 5 :(得分:3)

查找给定模块是否实际加载的简短方法:

cat /proc/modules | grep -c nfnetlink

输出

2

2(两个)表示模块已加载。不带-c的实际输出显示所有已加载的具有MODULENAME的模块--c对包含MODULENAME的行进行计数。因此,如果您有0(零)行作为输出,则模块不会加载

答案 6 :(得分: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

答案 7 :(得分:0)

module list 

返回:

Currently Loaded Modulefiles:
  1) /coverm/0.3.0        2) /parallel/20180222

答案 8 :(得分:0)

grep -wEq "^${module%.o}" /proc/modules

无论您要求 keyboard 还是 keyboard.o

都返回 true(例如可以在 if 中使用)