Как определить, загружен ли конкретный модуль в ядро ​​linux

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

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

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

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


person Dennis Ninj    schedule 23.03.2012    source источник
comment
Вопрос немного двусмысленный. Вы пытаетесь проверить, загружен ли драйвер в память или установлен в системе? modinfo поможет с последним, но не с первым.   -  person presto8    schedule 17.07.2013


Ответы (9)


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

person johnshen64    schedule 23.03.2012
comment
Просто примечание: подход modinfo, похоже, на самом деле не работает для проверки loaded (как в заголовке вопроса). Он показывает информацию независимо от того, загружен ли модуль. - person BeeOnRope; 14.11.2016
comment
Это не лучшее решение. modinfo показывает информацию о модуле ядра, установленном в rootfs, но не проверяет, загружен ли модуль в ядро ​​или нет. Таким образом, это решение не должно использоваться для решения проблемы. - person aicastell; 27.08.2020
comment
Только lsmod и /proc/modules показывают, какие модули загружены. - person CMCDragonkai; 09.09.2020

Метод 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
person basfest    schedule 21.12.2012
comment
grep -wq "^${MODULE}" поймать слово - person ykhrustalev; 02.01.2020

Флаг --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 в приведенном выше примере.

person Julia Path    schedule 18.05.2015
comment
Проблема: требуется root-доступ, и когда вы вводите ерунду для $ MODULE, он утверждает, что $ MODULE загружен. - person Nobody; 15.11.2016
comment
@Nobody Это не требует root в моей системе. - person Julia Path; 03.12.2017
comment
Ой, извините, я был прав только наполовину (или, может быть, прав на четверть. Позор вам, голосующие за комментарии). В Debian modprobe не входит в $ PATH для обычных пользователей, поэтому просто скопируйте и вставьте свою команду только с правами root. Но при вызове modprobe с полным путем он исполняется для обычных пользователей, и только фактическая операция вставки завершается неудачно, поэтому ваше решение в принципе работает. Я по-прежнему считаю, что запросы к / proc / modules более элегантны, но это дело вкуса. Если бы я проголосовал против вашего ответа, я бы снял голос сейчас (но я этого не сделал). - person Nobody; 03.12.2017

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

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

person Nobody    schedule 15.11.2016
comment
Вы можете захотеть сопоставить "^$MODULE\>" вместо этого, чтобы убедиться, что вы не соответствуете только части имени модуля. - person Julia Path; 03.12.2017

Лучше создать функцию bash:

#!/bin/sh
function moduleExist(){
  MODULE="$1"
  if lsmod | grep "$MODULE" &> /dev/null ; then
    return 0
  else
    return 1
  fi
}


if moduleExist "module name"; then
  #do somthing
fi
person Mostafa    schedule 27.09.2014
comment
Какая разница от ответа @basfest? - person Jonathan Lam; 05.01.2020
comment
Уважаемый @JonathanLam, я пытаюсь преобразовать код в простую функцию и повторно использовать его в моем сценарии продажи. Как видите, выражение условия доступно для чтения. - person Mostafa; 05.01.2020

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

cat /proc/modules | grep -c nfnetlink

который выводит

2

Это 2 (ДВА) означает, что модуль ЗАГРУЖЕН. Фактический вывод без -c показывает все загруженные модули с MODULENAME - -c подсчитывает строки, содержащие MODULENAME. Итак, если у вас есть 0 (ZERO) строк в качестве вывода, то модуль не загружен.

person 1000Gbps    schedule 05.10.2020
comment
Вы можете использовать его с if. if cat /proc/modules | grep -c nfnetlink; then echo "module loaded" fi - person Abc Xyz; 10.10.2020

module list 

Возврат:

Currently Loaded Modulefiles:
  1) /coverm/0.3.0        2) /parallel/20180222
person MeggyClay    schedule 22.10.2019
comment
Откуда вы взяли module ...? - person usretc; 21.12.2020

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

возвращает истину (например, может использоваться в if) независимо от того, запрашиваете ли вы keyboard или keyboard.o

person usretc    schedule 21.12.2020

person    schedule
comment
Хотя ваш ответ выглядит хорошо, вы должны включить небольшое объяснение ... простой код может быть хорошим, но объяснение кода и лучше - person Barranka; 16.05.2014