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
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)
我查找给定模块是否实际加载的简短方法:
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(零)行作为输出,则不会加载模块
我写了这个:
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也是唯一可用的名称.
如果模块已加载,则该--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在上面.
更好的主意是创建一个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)