Как определить, загружен ли конкретный модуль в ядре Linux - PullRequest
30 голосов
/ 24 марта 2012

Мне просто любопытно, есть ли способ определить, загружен / установлен ли конкретный модуль.

$ lsmod выводит список всех модулей (загружен драйвер устройства).

Есть ли способ проверить или команду, которая возвращает булево значение true / false, если имя модуля опрошено. например если клавиатура существует, вернуть true, иначе false. Мне нужен этот совет, чтобы завершить программу автоматического обновления драйвера.

PS: попробовал modinfo. я использую клиент busybox в моем тестовом DUT, так что вы можете дать некоторые альтернативы, кроме modinfo?

Ответы [ 6 ]

21 голосов
/ 21 декабря 2012

Метод 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
21 голосов
/ 24 марта 2012

не уверен, что 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

6 голосов
/ 15 ноября 2016

Я написал это:

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 это также единственное имя, которое будет работать.

6 голосов
/ 18 мая 2015

Флаг --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, чего нет в $PATH, если вы не являетесь пользователем root. В этом случае вы должны заменить modprobe на /usr/sbin/modprobe в приведенном выше.

4 голосов
/ 27 сентября 2014

Лучшая идея - создать функцию 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
0 голосов
/ 16 мая 2014
 !/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
...