Как перечислить все загружаемые модули ядра?

Вопрос или проблема

Я ищу несколько модулей ядра для загрузки 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.aliasmodules.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, убедитесь, что они доступны в системе и соответствуют версии ядра.

Оцените материал
Добавить комментарий

Капча загружается...