2012-03-23 83 views
25

我只是好奇,有沒有什麼方法可以確定是否加載/安裝了特定的模塊。如何確定是否在Linux內核中加載了特定的模塊

$ lsmod列出了所有模塊(加載了設備驅動程序)。

是否有任何方法檢查或返回true/false的命令布爾輸出,如果輪詢模塊名稱。例如。如果keyboard.o存在,則返回true,否則返回false。我需要此提示來完成我的驅動程序自動刷新程序。

PS:嘗試過modinfo。我在測試DUT中使用了busybox客戶端,所以你可以給modinfo以外的其他選擇嗎?

+1

你有權訪問grep嗎? – 2012-03-26 16:02:06

+0

這個問題有點模棱兩可。你是否試圖檢查驅動程序是否加載到內存或安裝在系統上? modinfo將有助於後者,但不是前者。 – presto8 2013-07-16 22:31:30

回答

19

不知道是否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

你能建議替代嗎? – 2012-03-26 15:51:19

+3

只需要注意:'modinfo'方法似乎實際上並不適用於_loaded_檢查(如在問題標題中)。無論模塊是否加載,它都會顯示信息。 – BeeOnRope 2016-11-14 18:26:07

17

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 
+0

不適用於我:( – Megharaj 2014-09-23 11:42:50

+0

不工作在centos 6(總是說模塊未加載) – Anake 2015-05-11 08:20:50

+5

'grep -Eq「^ $ {MODULE}」;' – 2016-07-29 20:10:24

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

儘管您的答案看起來不錯,但您應該包括一點解釋。 ..明碼可能不錯,但代碼*和*解釋更好 – Barranka 2014-05-15 21:05:11

3

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

--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

+3

問題:需要root和當你爲$ MODULE輸入廢話時,它聲稱$ MODULE已加載。 – Nobody 2016-11-15 16:05:15

+0

@Nobody它不需要在我的系統上安裝root。 – jpath 2017-12-03 13:13:02

+1

噢,對不起,我只是一半的權利(或者說是四分一半的權利,對你的評論選民感到羞恥)。在Debian中,modprobe不在普通用戶的$ PATH中,所以只複製並粘貼你的命令只能作爲root用戶。但是,當以完整路徑調用modprobe時,它對普通用戶是可執行的,只有實際的插入操作失敗,所以你的解決方案原則上工作。我仍然認爲查詢/ proc/modules更加eleg螞蟻,但這是一個品味問題。如果我低估了你的回答,我會立即撤消投票(但我沒有)。 – Nobody 2017-12-03 13:30:07

4

我寫了這個:

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

它會檢查/proc/modules。如果在那裏提到模塊,則假定它已被加載,否則不會。

其他人似乎對我來說太長了(另一個短的需要根,這不)。當然,它只是寫出了已經提到的「替代品」。

注意:modprobe接受除/proc/modules中列出的主要模塊名稱以外的某些模塊名稱變體。例如加載snd-aloop的作品,但該模塊被命名爲snd_aloop,並在/proc/modules中列出,當使用rmmod時,這也是唯一可以使用的名稱。

+2

您可能希望匹配'「^ $ MODULE \>」',以確保您不僅僅匹配模塊名稱的一部分。 – jpath 2017-12-03 16:23:54

相關問題