Вопрос или проблема
Я ищу несколько модулей ядра для загрузки i2c-dev
и i2c-bcm2708
. Но команда modprobe
возвращает:
sudo modprobe i2c-dev
modprobe: модуль i2c-dev не найден в modules.dep
Как мне перечислить все доступные модули в системе? В какой директории они расположены?
-
По умолчанию
modprobe
загружает модули из подкаталогов ядра, расположенных в директории/lib/modules/$(uname -r)
. Обычно все файлы имеют расширение.ko
, так что вы можете перечислить их с помощьюfind /lib/modules/$(uname -r) -type f -name '*.ko'
или, учитывая сжатые файлы:
find /lib/modules/$(uname -r) -type f -name '*.ko*'
-
Каждый модуль также можно загрузить, ссылаясь на его псевдонимы, хранящиеся в
/lib/modules/$(uname -r)/modules.alias
(иmodules.alias.bin
). -
Однако, чтобы загрузить модуль успешно,
modprobe
требуется, чтобы их зависимости были перечислены в файле/lib/modules/$(uname -r)/modules.dep
(и соответствующей бинарной версииmodules.dep.bin
). Если какой-то модуль присутствует в системе, но отсутствует в списке, вам следует выполнить командуdepmod
, которая сгенерирует такие зависимости и автоматически включит ваш модуль вmodules.dep
иmodules.dep.bin
. -
Кроме того, если модуль успешно загружен, он будет перечислен в файле
/proc/modules
(также доступно через командуlsmod
).
Введите modprobe
и нажмите таб, список автозаполнения должен содержать все загружаемые модули
Существует команда lsmod
из пакета kmod
в Arch Linux, которая перечисляет и показывает статус модулей ядра Linux, содержит и другие полезные команды, такие как modinfo
, rmmod
, modprobe
.
Чтобы перечислить все бинарные файлы, предоставляемые пакетом, вы можете ввести:
pacman -Ql kmod | grep /bin/ --color=always
, и вы также можете проверить, к какому владельцу принадлежит бинарный файл с помощью pacman -Qo lsmod
.
Q
переключатель используется для запроса локально установленных пакетов (в отличие от S
для синхронизации, то есть для проверки удаленно).
Я предпочитаю использовать depmod
. С помощью команды: depmod -av|grep MOD_NAME
, ваша система сгенерирует файлы modules.dep/map и отфильтрует их.
Параметр -v
важен для подробного вывода, а -a
для того, чтобы убедиться, что все возможные модули из /lib/modules/
используются для файла modules.dep.
Таким образом, можно убедиться, что запрашиваемый модуль ядра сопоставлен с ядром как загружаемый. Когда запрашиваемый модуль ядра не перечислен в выводе, вы знаете, что ядро его не найдет.
Вы можете проверить, как происходит автозаполнение:
$ complete -p modprobe
complete -F _modprobe modprobe
declare -f _modprobe
_modprobe ()
{
...
В этой функции есть внутренний _installed_modules
$ declare -f _installed_modules
_installed_modules ()
{
COMPREPLY=($(compgen -W "$(PATH="$PATH:/sbin" lsmod |
awk '{if (NR != 1) print $1}')" -- "$1"))
}
Так что lsmod | awk '{if (NR != 1) print $1}'
должен показать вам список модулей
Ниже приведено, вдохновленное /usr/share/initramfs-tools/hook-functions в ubuntu
MODULESDIR="/lib/modules/$(uname -r)"
echo $({cat "${MODULESDIR}/modules.builtin"
if [ -d "${MODULESDIR}/kernel" ]; then
find "${MODULESDIR}/kernel" -name '*.ko*'
fi
} |
while read -r module; do
module="${module##*/}"
module="${module%%.*}"
echo $module
done
)
Ответ или решение
Чтобы получить список всех загружаемых модулей ядра в операционной системе Linux, требуется использовать несколько команд и понять, где они расположены. Давайте рассмотрим процесс более подробно.
1. Расположение модулей
Модули ядра загружаются из подкаталогов, находящихся по пути:
/lib/modules/$(uname -r)
где $(uname -r)
— это текущая версия ядра. Все файлы модулей имеют расширение .ko
, что указывает на их формат (Kernel Object). Чтобы отобразить все модули, используйте следующую команду:
find /lib/modules/$(uname -r) -type f -name '*.ko'
Для отображения всех сжимаемых файлов модулей можно использовать:
find /lib/modules/$(uname -r) -type f -name '*.ko*'
2. Список доступных модулей
Для получения списка всех загружаемых модулей также можно воспользоваться следующими методами:
- Конструкция командной строке с использованием автозаполнения. Просто введите:
modprobe <TAB>
Нажав клавишу Tab, вы получите список всех доступных модулей.
- Среди утилит, предоставляемых пакетом
kmod
, естьlsmod
, которая отображает список загруженных модулей и их статус:
lsmod
Это команда выводит текущее состояние загруженных модулей. Не забудьте также о возможности получения информации о конкретном модуле с помощью modinfo
:
modinfo <имя_модуля>
3. Проверка зависимостей
Для загружаемости модуля modprobe
необходимы зависимости, которые указаны в следующих файлах:
/lib/modules/$(uname -r)/modules.dep
/lib/modules/$(uname -r)/modules.dep.bin
Если модуль присутствует в системе, но отсутствует в этом списке, необходимо сгенерировать его:
sudo depmod
Команда depmod
обновит файлы зависимостей и убедится, что ваш модуль будет включён в файлы modules.dep
и modules.dep.bin
.
4. Альтернативные методы
Можно использовать функцию автозаполнения для modprobe
для сбора информации о модулях:
complete -p modprobe
Или использовать комбинированное решение, чтобы вывести все доступные модули:
MODULESDIR="/lib/modules/$(uname -r)"
echo $({cat "${MODULESDIR}/modules.builtin";
if [ -d "${MODULESDIR}/kernel" ]; then
find "${MODULESDIR}/kernel" -name '*.ko*';
fi;} |
while read -r module; do
module="${module##*/}";
module="${module%%.*}";
echo $module;
done)
Заключение
Существует множество способов для получения всеобъемлющей информации о загружаемых модулях ядра в Linux. В данном ответе представлены ключевые инструменты, команды и методы, которые помогут вам не только отследить доступные модули, но также убедиться в их корректной загрузке и установке. Если вы все еще не можете загрузить модули i2c-dev
и i2c-bcm2708
, убедитесь, что они доступны в системе и соответствуют версии ядра.