Модули ядра — это фрагменты кода, которые подключаются к работающему ядру без пересборки и перезагрузки. Драйверы сетевых карт, файловые системы, модули шифрования, фильтры пакетов и десятки других подсистем в типичном дистрибутиве Linux поставляются именно так. Понимание того, как модуль загружается, какие параметры он принимает и почему иногда не хочет подключаться, экономит часы диагностики. Ниже — практическая работа с modprobe, каталогом /etc/modprobe.d, blacklist, параметрами и проверкой результата на живом ядре.

Как устроена подсистема модулей

Файлы модулей лежат в /lib/modules/$(uname -r)/kernel и обычно сжаты: .ko.xz или .ko.zst. Команда lsmod показывает уже загруженные модули, их размер, счётчик использования и зависимости. modinfo читает метаданные конкретного файла: описание, автора, лицензию, alias-ы и список параметров. Этих трёх команд достаточно, чтобы понять, что происходит на машине.

uname -r
lsmod | head -20
modinfo e1000e | head -30
modinfo -p e1000e

Поле Used в выводе lsmod показывает, сколько объектов удерживают модуль. Если оно больше нуля, выгрузить модуль через rmmod не получится, пока не освобождены зависимости. Каталог /sys/module/имя — живое представление загруженного модуля: там видны параметры, счётчики и служебные атрибуты.

Загрузка и выгрузка вручную

modprobe — основной инструмент: он учитывает зависимости, ищет модуль по alias и подхватывает настройки из /etc/modprobe.d. insmod загружает ровно указанный файл и не разрешает зависимости, поэтому в повседневной работе нужен редко. rmmod выгружает модуль, modprobe -r делает то же с учётом зависимостей. Ключ -v печатает каждое действие, что полезно при разборе.

sudo modprobe -v dummy
sudo modprobe -r dummy
lsmod | grep dummy
sudo rmmod dummy

После обновления ядра старые модули остаются в каталоге прежней версии. Если модуль «пропал», сначала проверьте, что установлен пакет с модулями именно для текущего ядра, и выполните depmod -a. Эта команда строит файлы modules.dep и modules.alias — без них modprobe не найдёт зависимости.

Параметры: options и sysfs

Параметры задаются в файле /etc/modprobe.d/*.conf строкой options. Имя файла произвольное, важно расширение .conf. Изменения применяются при следующей загрузке модуля, поэтому для уже работающего модуля нужно выгрузить и загрузить его либо перезагрузиться. Посмотреть текущие значения можно через sysfs.

cat /sys/module/e1000e/parameters/debug
echo 'options e1000e debug=0' | sudo tee /etc/modprobe.d/e1000e.conf
sudo modprobe -r e1000e && sudo modprobe e1000e
dmesg | tail -20

Не все параметры доступны на лету. Часть из них помечена как изменяемая только при загрузке, и запись в sysfs вернёт ошибку. Проверяйте права на файл: если он доступен только для чтения, параметр меняется лишь при подключении модуля. Для сетевых драйверов после смены параметров интерфейс обычно пересоздаётся, поэтому удалённый доступ может оборваться.

Blacklist и запрет автозагрузки

Blacklist не запрещает загрузку навсегда: он лишь снижает приоритет alias, чтобы udev не поднимал модуль автоматически. Если модуль уже загружен как зависимость другого, blacklist не поможет. Надёжнее связка install с командой /bin/false, которая отменяет загрузку, и явная выгрузка уже работающего модуля. Такой приём часто применяют к конфликтующим драйверам и к модулям, которые захватывают устройство раньше нужного.

echo 'blacklist nouveau' | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
echo 'install nouveau /bin/false' | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf
sudo update-initramfs -u
lsmod | grep nouveau

В Debian и Ubuntu используется update-initramfs -u, в Fedora и RHEL — dracut -f. Если драйвер попал в initramfs, без обновления образа он загрузится на раннем этапе, и blacklist в основной системе уже не сработает. Это самая частая причина ситуации «я всё запретил, а модуль всё равно есть».

Порядок загрузки и softdep

Иногда нужно, чтобы до основного модуля загрузился вспомогательный, или наоборот — отложить часть инициализации. Директива softdep задаёт мягкие зависимости: pre подгружает модули до, post — после. Жёсткая зависимость описывается через depends, но она меняет логику загрузки и при ошибке ломает весь стек.

echo 'softdep nf_conntrack pre: nf_defrag_ipv4' | sudo tee /etc/modprobe.d/conntrack.conf
sudo modprobe -v nf_conntrack
journalctl -k -b | grep -i conntrack
cat /proc/modules | wc -l

Не создавайте циклических зависимостей: modprobe завершится ошибкой circular dependency. Проверяйте конфигурацию командой modprobe —show-depends имя — она печатает план загрузки без реальных действий. Это безопасный способ убедиться, что правила из modprobe.d читаются так, как вы ожидаете.

Диагностика проблем

Типичный сценарий: устройство не работает, модуль не загружается, в dmesg пусто. Порядок проверки — от общего к частному. Сначала убедитесь, что ядро видит оборудование, затем что для него есть модуль, затем что модуль не блокируется, и только потом смотрите параметры.

lspci -k | grep -A3 -i network
modprobe --show-depends e1000e
journalctl -k --since '10 min ago' | grep -iE 'e1000e|firmware'
sudo modprobe -v e1000e; echo "exit=$?"

Сообщение module not found чаще всего означает несовпадение версии ядра и каталога модулей, отсутствие пакета linux-modules-extra или сжатие, которое ядро не понимает. Operation not permitted при rmmod — модуль используется или защищён флагом. Invalid argument при загрузке — почти всегда неверный параметр.

Отдельная категория ошибок — подпись модулей. При включённом Secure Boot ядро с проверкой подписи откажется загружать модуль без действительной подписи, и в dmesg появится сообщение о module verification failed. Режим проверяется через mokutil —sb-state, а зарегистрированные ключи — через keyctl или /proc/keys. Собственные модули подписывают ключом, который заранее добавлен в прошивку; для диагностики полезно сравнить вывод modinfo -F sig_id с этим списком.

Чек-лист перед изменением

  • Запишите текущее состояние: lsmod, параметры из sysfs, версию ядра.
  • Меняйте один модуль за раз и проверяйте результат до следующего шага.
  • Держите открытым локальный терминал, если правите драйвер сети.
  • После правки modprobe.d обновите initramfs и проверьте modprobe —show-depends.
  • Убедитесь, что после перезагрузки конфигурация всё ещё применяется.

Итог

modprobe, modinfo и /etc/modprobe.d закрывают почти все задачи по управлению модулями: подключение драйвера, передача параметров, блокировка конфликтующего кода и разбор ошибок. Главное — помнить о двух уровнях: конфигурация в modprobe.d действует при загрузке модуля, а initramfs может загрузить его раньше, чем прочитается ваш файл. Проверка через modprobe —show-depends, dmesg и sysfs даёт полную картину без догадок.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте