Управление модулями ядра в рантайме [201.3]

Рейтинг: 61% · 6 голосов
Курс LPIC-2 (201-450 и 202-450): емкостное планирование, ядро, хранилище и RAID/LVM, продвинутая сеть, DNS/BIND, Apache/Nginx, Samba/NFS, DHCP/LDAP, почта, безопасность и VPN.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Управление модулями ядра в рантайме [201.3]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-2 и уровень инженера
  2. Измерение и устранение проблем с ресурсами [200.1]
  3. Прогнозирование потребности в ресурсах
  4. Компоненты ядра Linux [201.1]
  5. Сборка ядра из исходников [201.2]
  6. Управление модулями ядра в рантайме [201.3] (вы здесь)
  7. Кастомизация запуска системы [202.1]
  8. Восстановление системы [202.2]
  9. Альтернативные загрузчики [202.3]
  10. Работа с файловой системой Linux [203.1]
  11. Обслуживание файловых систем [203.2]
  12. Создание и настройка опций ФС [203.3]
  13. Программный RAID [204.1]
  14. Тюнинг доступа к устройствам хранения [204.2]
  15. Менеджер логических томов LVM [204.3]
  16. Базовая конфигурация сети [205.1]
  17. Продвинутая конфигурация сети [205.2]
  18. Диагностика сетевых проблем [205.3]
  19. Сборка и установка программ из исходников [206.1]
  20. Резервное копирование [206.2]
  21. Оповещение пользователей о событиях
  22. DNS-сервер BIND: базовая настройка [207.1]
  23. Зоны DNS: создание и сопровождение [207.2]
  24. Безопасность DNS-сервера [207.3]
  25. Веб-сервер Apache: базовая настройка [208.1]
  26. Apache и HTTPS [208.2]
  27. Кэширующий прокси Squid [208.3]
  28. Веб-сервер и обратный прокси Nginx [208.4]
  29. Файловый сервер Samba [209.1]
  30. Файловый сервер NFS [209.2]
  31. DHCP-сервер [210.1]
  32. Аутентификация PAM и SSSD [210.2]
  33. Использование LDAP-клиента
  34. Сервер OpenLDAP [210.4]
  35. Почтовый сервер Postfix [211.1]
  36. Управление доставкой почты и Sieve [211.2]
  37. Доступ к почтовым ящикам: Dovecot [211.3]
  38. Linux как маршрутизатор и фильтр [212.1]
  39. FTP-серверы [212.2]
  40. SSH углублённо [212.3]
  41. Безопасность, IDS и VPN [212.4 + 212.5]
Урок 5. Управление модулями ядра в рантайме [201.3]

Ядро Linux монолитное, но не статичное: драйверы, файловые системы и сетевые протоколы подгружаются как модули по требованию. Задача администратора - понимать, что сейчас в ядре, уметь загрузить нужный модуль с правильными параметрами, запретить вредный автозагруз, и при этом не дёргать ядро вручную там, где это сделает udev и systemd. В этом уроке разберём весь конвейер: от modules.dep до правил udev и тюнинга через sysctl. Это типовая работа при поднятии нового железа, отладке драйвера и хардненинге сервера.

Изображение

Как это работает

Модуль ядра - это файл .ko (kernel object) в дереве /lib/modules/$(uname -r)/. В 2026 на свежих системах (Debian 13, Ubuntu 24.04, RHEL 10, Fedora 41+) они сжаты zstd и лежат как .ko.zst; kmod распаковывает их на лету, так что для вас это прозрачно.

Все привычные команды - lsmod, modprobe, insmod, rmmod, modinfo, depmod - это один бинарь kmod, доступный под разными именами через симлинки. Поэтому поведение у них согласованное.

Ключевой момент - зависимости. Драйвер часто опирается на другие модули (например, сетевая карта тянет общий слой). Карту этих связей строит depmod: он сканирует символы во всех .ko и пишет файл /lib/modules/$(uname -r)/modules.dep плюс хэши и алиасы рядом. Именно поэтому modprobe умный, а insmod - нет: modprobe читает modules.dep и грузит всю цепочку зависимостей в правильном порядке, а insmod пихает один файл по точному пути и падает, если зависимости не загружены. На практике insmod/rmmod почти не нужны - это инструмент для отладки одиночного .ko.

Автоматику обеспечивает udev. Когда железо появляется, ядро шлёт uevent; udev по таблице модальясов (modules.alias, тоже от depmod) находит подходящий драйвер и вызывает modprobe. Поэтому большинство модулей вы вообще не грузите руками - они приезжают сами.

Конфигурация раздельная по смыслу. Каталог /etc/modprobe.d управляет КАК грузить: задаёт options (параметры модуля), blacklist (не грузить по этому имени-алиасу), install/alias (подменить действие). Каталог /etc/modules-load.d говорит ЧТО грузить принудительно при старте - его читает systemd-modules-load.service, даже если железа как бы и нет (нужно для nf_conntrack, br_netfilter и т.п.).

Параметры самого ядра (не модулей) - это sysctl: интерфейс к /proc/sys. На лету меняете через sysctl, постоянно - файлами в /etc/sysctl.d. Это сеть, виртуальная память, лимиты - то, что не требует перезагрузки.

Команды и примеры

Посмотреть загруженное и узнать про модуль:

Код: Выделить всё

lsmod                      # имя, размер, счётчик использований, кто зависит
modinfo nf_conntrack       # путь, лицензия, зависимости, параметры (parm:)
modinfo -p i915            # только параметры с описанием
Загрузка с зависимостями и параметром:

Код: Выделить всё

modprobe nf_conntrack
modprobe i915 enable_psr=0           # параметр на эту загрузку
modprobe -r nf_conntrack             # выгрузить (с зависимостями, если не заняты)
modprobe -n -v r8169                 # сухой прогон: что бы сделалось
Низкоуровнево (отладка одиночного .ko):

Код: Выделить всё

insmod /lib/modules/$(uname -r)/kernel/drivers/net/dummy.ko.zst
rmmod dummy
Пересборка карты зависимостей после ручной установки .ko:

Код: Выделить всё

depmod -a                  # для текущего ядра
depmod 6.12.0-amd64        # для конкретной версии
Постоянные параметры модуля и blacklist (одинаково в обоих семействах):

Код: Выделить всё

echo 'options i915 enable_psr=0' > /etc/modprobe.d/i915.conf
echo 'blacklist nouveau'        > /etc/modprobe.d/nvidia.conf
echo 'install nouveau /bin/false' >> /etc/modprobe.d/nvidia.conf
Принудительная загрузка при старте:

Код: Выделить всё

echo 'br_netfilter' > /etc/modules-load.d/k8s.conf
systemctl restart systemd-modules-load.service
systemctl status  systemd-modules-load.service
В Debian/Ubuntu по традиции работает ещё и файл /etc/modules; в RHEL/Fedora его нет - там только modules-load.d.

Правило udev (например, фиксированное имя для USB-устройства):

Код: Выделить всё

# /etc/udev/rules.d/70-mydev.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", SYMLINK+="ttyMODBUS"
udevadm control --reload
udevadm trigger
udevadm info -a /dev/ttyUSB0      # какие атрибуты можно матчить
Параметры ядра через sysctl:

Код: Выделить всё

sysctl net.ipv4.ip_forward                 # прочитать
sysctl -w net.ipv4.ip_forward=1            # на лету (до перезагрузки)
echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-router.conf
sysctl --system                            # применить все .d
Пакеты различаются: Debian/Ubuntu - apt install kmod, RHEL/Fedora - dnf install kmod; везде это уже стоит. На RHEL 10 yum - лишь алиас на dnf.

Частые грабли
  • Поставили .ko вручную и сделали modprobe - ловите FATAL Module not found. Забыли depmod -a: карта зависимостей не знает о новом модуле.
  • blacklist не мешает прямой загрузке. blacklist отключает только автозагруз по алиасу; modprobe nouveau руками всё равно сработает. Чтобы наглухо - строка install <модуль> /bin/false.
  • Поместили blacklist в /etc/modules-load.d - там это бессмысленно: файл задаёт ЧТО грузить, а синтаксис options/blacklist понимает только modprobe.d.
  • Драйвер вшит в initramfs (графика, диск). Правка modprobe.d не подействует, пока не пересоберёте образ: update-initramfs -u (Debian/Ubuntu) или dracut -f (RHEL/Fedora).
  • sysctl -w забывается после ребута. Постоянное значение - только файлом в /etc/sysctl.d, иначе откатится.
  • Меняли .rules и удивляетесь тишине - udev не перечитывает их сам. Нужны udevadm control --reload и trigger.
  • rmmod ругается Module is in use - модуль занят (Used by в lsmod не ноль). Сначала освободите потребителей.
Мини-лаба
  • Выполните lsmod и modinfo на любой загруженный модуль, найдите строки depends и parm.
  • Загрузите учебный модуль dummy через modprobe, проверьте его в lsmod, затем выгрузите через modprobe -r.
  • Создайте /etc/modprobe.d/lab.conf с blacklist для dummy и проверьте сухим прогоном modprobe -n -v dummy, что загрузка заблокирована по алиасу.
  • Включите net.ipv4.ip_forward через sysctl -w, убедитесь чтением, потом закрепите файлом в /etc/sysctl.d и примените sysctl --system.
  • Напишите простое udev-правило на любое USB-устройство (по idVendor из udevadm info), перечитайте правила и проверьте появление симлинка в /dev.
  • Сломайте и почините: удалите запись модуля из modules.dep, повторите modprobe (получите ошибку), восстановите через depmod -a.
Контрольные вопросы
  • Чем принципиально отличается modprobe от insmod и почему insmod не умеет работать с зависимостями?
  • Какой файл и какая команда отвечают за карту зависимостей модулей, и когда её нужно пересобирать вручную?
  • Чем blacklist отличается от строки install <модуль> /bin/false и в каком случае blacklist не сработает?
  • В чём смысловая разница между /etc/modprobe.d и /etc/modules-load.d, и какой сервис читает второй?
  • Как сделать параметр ядра net.ipv4.ip_forward постоянным после перезагрузки и какой командой применить все файлы конфигурации сразу?
  • Почему после правки .rules устройство не переименовалось и какие две команды udevadm это исправляют?
👍4 ❤️3 🔥1 😄 🤔3
Аватара пользователя
remotepenguin
Сообщения: 1
Зарегистрирован: 14 май 2026, 16:29

Re: Управление модулями ядра в рантайме [201.3]

Сообщение remotepenguin »

А если модуль в initramfs зашит - правка в modprobe.d вообще игнорится? Я полдня ловил, почему nouveau не блеклистится, пока не сделал update-initramfs -u
👍1 ❤️ 🔥1 😄 🤔1
Аватара пользователя
Mbw2207
Сообщения: 1
Зарегистрирован: 16 май 2026, 08:39

Re: Управление модулями ядра в рантайме [201.3]

Сообщение Mbw2207 »

Подскажите, depmod -a после каждого обновления ядра самому гонять или пакетный менеджер это делает? У меня на Debian вроде само пересобирается при apt upgrade
👍 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Сборка ядра из исходников [201.2]
Следующая глава →
Кастомизация запуска системы [202.1]

Все главы курса «LPIC-2: инженер Linux (201 + 202)»

Поделиться темой: ✈ Telegram VK
  • Похожие темы

Вернуться в «LPIC-2: инженер Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость