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

Den*_*inj 32 unix insmod linux-kernel

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

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

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

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

joh*_*n64 24

不确定是否modinfo modname和检查$?对你有用,只是一个建议.

/tmp$ sudo modinfo e1000
/tmp$ echo $?
0
/tmp$ sudo modinfo keyboard
ERROR: modinfo: could not find module keyboard
/tmp$ echo $?
1
Run Code Online (Sandbox Code Playgroud)

或者你也grep /proc/modules

  • 请注意:`modinfo`方法似乎并不适用于_loaded_检查(如问题标题中所示).无论模块是否已加载,它都会显示信息. (5认同)
  • 你能建议另类吗? (2认同)
  • 这不是一个好的解决方案。modinfo 显示 rootfs 上安装的内核模块的信息,但它不检查该模块是否加载到内核中。所以这个解决方案不应该用来解决这个问题。 (2认同)
  • 只有 `lsmod` 和 `/proc/modules` 显示哪些模块被**加载**。 (2认同)

bas*_*est 22

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
Run Code Online (Sandbox Code Playgroud)

  • `grep -Eq"^ $ {MODULE}";` (5认同)
  • `grep -wq "^${MODULE}"` 来捕获单词 (3认同)

100*_*bps 9

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

cat /proc/modules | grep -c nfnetlink
Run Code Online (Sandbox Code Playgroud)

哪个输出

2
Run Code Online (Sandbox Code Playgroud)

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


Nob*_*ody 8

我写了这个:

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

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

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

注意:modprobe接受一些模块名称的变体,而不是主要的模块名称/proc/modules.例如,加载snd-aloop工作,但模块已命名并在使用时snd_aloop列出,/proc/modules并且在使用时rmmod也是唯一可用的名称.

  • 您可能希望匹配""^ $ MODULE \>"`以确保您不匹配模块名称的一部分. (3认同)

jpa*_*ath 7

如果模块已加载,则该--first-time标志将导致modprobe失败.这与--dry-run(或简写-n)标志一起做了一个很好的测试:

modprobe -n --first-time $MODULE && echo "Not loaded" || echo "Loaded"
Run Code Online (Sandbox Code Playgroud)

编辑1:正如@Nobody指出的那样,Loaded如果模块不存在,也会打印.我们可以通过将其与modinfo以下内容相结合

modinfo $MODULE >/dev/null 2>/dev/null &&
! modprobe -n --first-time $MODULE 2>/dev/null &&
echo "Loaded" || echo "Not loaded"
Run Code Online (Sandbox Code Playgroud)

编辑2:在某些系统中modprobe存在/usr/sbin,$PATH除非你是root用户,否则不在其中.在这种情况下,你需要替换modprobe/usr/sbin/modprobe在上面.

  • 问题:需要root,当你为$ MODULE输入废话时,它声称加载了$ MODULE. (3认同)
  • 哦,对不起,我只对了一半(或者可能是四分之一。对你们评论投票者感到羞耻)。在 Debian 上,对于普通用户,modprobe 不在 $PATH 中,因此只需复制并粘贴您的命令,就只能以 root 身份运行。但是当使用完整路径调用 modprobe 时,它​​对普通用户是可执行的,只有实际插入操作失败,因此您的解决方案原则上有效。我仍然认为查询 /proc/modules 更优雅,但这是一个品味问题。如果我对你的回答投反对票,我现在就会取消投票(但我没有)。 (2认同)

Mos*_*afa 5

更好的主意是创建一个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
Run Code Online (Sandbox Code Playgroud)