Железо, устройства и модули ядра [101.1]

Рейтинг: 79.6% · 15 голосов
Полный курс LPIC-1 (экзамены 101-500 и 102-500): архитектура, загрузка, пакеты, команды и текст, ФС и права, шелл-скрипты, пользователи, сервисы, сеть, безопасность. Debian и RHEL.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Железо, устройства и модули ядра [101.1]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-1 и как устроен путь администратора
  2. Железо, устройства и модули ядра [101.1] (вы здесь)
  3. Загрузка системы: от BIOS до systemd [101.2]
  4. systemd, цели и уровни выполнения [101.3]
  5. План разметки диска и swap [102.1]
  6. Загрузчик GRUB 2 [102.2]
  7. Разделяемые библиотеки [102.3]
  8. Управление пакетами в Debian: dpkg и apt [102.4]
  9. Управление пакетами RPM, DNF и Zypper [102.5]
  10. Linux как гость виртуализации [102.6]
  11. Командная строка Bash [103.1]
  12. Обработка текста фильтрами [103.2]
  13. Базовое управление файлами [103.3]
  14. Потоки, конвейеры и перенаправление [103.4]
  15. Процессы: создание, мониторинг, сигналы [103.5]
  16. Приоритеты выполнения процессов [103.6]
  17. Регулярные выражения [103.7]
  18. Редактор vi и vim [103.8]
  19. Разделы и создание файловых систем [104.1]
  20. Целостность и обслуживание ФС [104.2]
  21. Монтирование файловых систем [104.3]
  22. Урок 21. Права доступа и владение: rwx, chmod, umask и специальные биты
  23. Жёсткие и символические ссылки
  24. FHS и поиск файлов в системе [104.7]
  25. Окружение и кастомизация оболочки [105.1]
  26. Урок 25. Написание простых bash-скриптов [105.2]
  27. Графика, рабочие столы и доступность
  28. Учётные записи пользователей и групп
  29. Автоматизация задач: cron, at, таймеры [107.2]
  30. Локализация и интернационализация [107.3]
  31. Системное время и синхронизация [108.1]
  32. Системное логирование [108.2]
  33. Основы почтового агента (MTA) [108.3]
  34. Печать и CUPS [108.4]
  35. Основы интернет-протоколов [109.1]
  36. Постоянная конфигурация сети [109.2]
  37. Диагностика сети [109.3]
  38. DNS на стороне клиента [109.4]
  39. Задачи администрирования безопасности [110.1]
  40. Настройка безопасности хоста [110.2]
  41. Шифрование данных: SSH и GnuPG [110.3]
Урок 1. Железо, устройства и модули ядра [101.1]

Администратору постоянно нужно отвечать на вопрос "что у меня внутри и почему оно не работает". Села сетевая карта, не определился новый SSD, не подхватился USB-токен - все это упирается в три вещи: как ядро видит железо, как оно подгружает драйверы-модули и как создаются файлы устройств в /dev. В этом уроке разберем цепочку от шины PCI/USB до файла устройства, научимся смотреть оборудование через lspci, lsusb, /proc и /sys, и управлять модулями ядра через modprobe и его конфиги.

Изображение

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

Ядро Linux обнаруживает железо через шины. PCI Express и USB - это шины перечисления: при старте (и при горячем подключении) ядро опрашивает шину, получает у каждого устройства его vendor ID и device ID. По этой паре идентификаторов ядро понимает, какой драйвер нужен.

Драйверы в современном Linux - это в основном модули ядра, отдельные бинарники .ko, которые подгружаются по требованию. Когда на шине появляется устройство, ядро через механизм uevent сообщает об этом в пространство пользователя. Это событие ловит systemd-udevd (демон udev). Udev по правилам сопоставляет идентификаторы устройства с нужным модулем, дергает modprobe для его загрузки и создает соответствующий файл в /dev. Поэтому устройства появляются автоматически, без ручного mknod.

Ключевое разделение. /proc - это интерфейс к состоянию ядра и процессов (исторический, текстовый). /sys (sysfs) - современное дерево, где каждое устройство, шина и драйвер представлены как каталог с атрибутами-файлами. Именно sysfs udev использует как источник правды. /dev - это файлы устройств, через которые программы реально читают и пишут данные (символьные и блочные).

Модуль ядра несет в себе таблицу alias - какие vendor/device он обслуживает. modprobe, в отличие от старого insmod, умеет разрешать зависимости между модулями и читать конфиги. Это и делает его рабочим инструментом.

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

Просмотр оборудования. lspci и lsusb входят в пакеты pciutils и usbutils.

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

lspci            # список PCI-устройств
lspci -nnk       # с числовыми ID [vendor:device] и драйвером в ядре
lspci -v         # подробно: ресурсы, прерывания
lsusb            # список USB-устройств
lsusb -t         # дерево шины USB
lscpu            # сводка по CPU
lsblk            # блочные устройства (диски, разделы)
В выводе lspci -nnk строки Kernel driver in use и Kernel modules показывают, какой модуль обслуживает устройство - это первое, что смотрят при проблемах с драйвером.

Установка утилит, если их нет:

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

# Debian 13 / Ubuntu 24.04
apt install pciutils usbutils

# RHEL 10 / Fedora 41+
dnf install pciutils usbutils
Псевдофайловые системы. Тут команды одинаковы во всех дистрибутивах:

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

cat /proc/cpuinfo        # ядра, флаги CPU
cat /proc/interrupts     # счетчики прерываний (IRQ) по устройствам
cat /proc/iomem          # карта адресов памяти устройств
ls /sys/class/net/       # сетевые интерфейсы как объекты sysfs
udevadm info /dev/sda    # все атрибуты устройства, как их видит udev
udevadm monitor          # смотреть события udev в реальном времени
Модули ядра:

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

lsmod                    # загруженные модули и кто их использует
modinfo e1000e           # инфо о модуле: параметры, зависимости, alias
modprobe vfat            # загрузить модуль (с зависимостями)
modprobe -r vfat         # выгрузить (умнее, чем rmmod)
rmmod vfat               # выгрузить ровно один модуль, без зависимостей
modprobe -c | less       # итоговая конфигурация modprobe
Колонка Used by в lsmod - это счетчик ссылок. Если он не ноль, модуль занят и просто так не выгрузится.

Конфигурация. Современный путь - каталоги, а не один файл:

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

# Загружать модуль автоматически при старте:
echo nf_conntrack > /etc/modules-load.d/conntrack.conf

# Запретить (заблокировать) модуль:
echo "blacklist nouveau" > /etc/modprobe.d/blacklist-nouveau.conf

# Передать параметр модулю:
echo "options snd_hda_intel power_save=1" > /etc/modprobe.d/audio.conf
Файлы в /etc/modprobe.d управляют поведением modprobe (параметры, blacklist, alias, install/override). Файлы в /etc/modules-load.d просто перечисляют модули, которые systemd-modules-load.service грузит на старте. Не путайте эти два каталога - у них разные задачи.

Частые грабли
  • Blacklist в modprobe.d не мешает udev подгрузить модуль по зависимости или явному modprobe. Чтобы реально не дать модулю загрузиться, используйте install имя_модуля /bin/false.
  • После правки modules-load.d или modprobe.d для дисков и initrd-устройств нужно пересобрать initramfs: update-initramfs -u (Debian/Ubuntu) или dracut -f (RHEL/Fedora). Иначе изменения не подхватятся на раннем этапе загрузки.
  • rmmod падает с "Module is in use", если Used by не ноль. Сначала остановите то, что держит модуль, или используйте modprobe -r, который разрулит цепочку.
  • Имя модуля и имя устройства - разные вещи. Драйвер может называться e1000e, а интерфейс - enp3s0. Сопоставление ищите через lspci -nnk.
  • Параметры модуля из modprobe.d применяются только при следующей загрузке модуля. Для уже загруженного либо modprobe -r и заново, либо пишите в /sys/module/имя/parameters/, если параметр доступен на запись.
  • /etc/modules (без .d) - устаревший единый файл, кое-где еще читается ради совместимости. В 2026 правильно использовать modules-load.d.
Мини-лаба
  • Выполните lspci -nnk и найдите свою сетевую и видеокарту. Запишите их [vendor:device] и драйвер в работе.
  • Через modinfo посмотрите параметры драйвера сетевой карты и его зависимости.
  • Запустите udevadm monitor в одном терминале, во втором вставьте USB-флешку. Поймайте события add и проследите, какой файл появился в /dev.
  • Выгрузите какой-нибудь некритичный модуль (например, модуль звука или USB-устройства) через modprobe -r и убедитесь по lsmod, что он ушел. Загрузите обратно.
  • Создайте файл в /etc/modprobe.d с параметром для любого модуля, выгрузите и загрузите его, проверьте применение через cat /sys/module/имя/parameters/.
  • Сравните, что показывают про один и тот же диск lsblk, ls /sys/block/ и udevadm info.
Контрольные вопросы
  • Чем отличается роль /proc от /sys, и какую из этих ФС использует udev как источник информации об устройствах?
  • Какая программа создает файлы в /dev при подключении устройства и по какому сигналу ядра она это делает?
  • В чем разница между modprobe -r и rmmod?
  • Чем каталог /etc/modules-load.d отличается по назначению от /etc/modprobe.d?
  • Почему строки blacklist может быть недостаточно, чтобы модуль точно не загрузился, и как это сделать надежно?
  • Какой ключ lspci покажет числовые идентификаторы устройства и используемый модуль ядра?
👍3 ❤️2 🔥2 😄 🤔
Аватара пользователя
rastake8
Сообщения: 1
Зарегистрирован: 18 май 2026, 14:04

Re: Железо, устройства и модули ядра [101.1]

Сообщение rastake8 »

А зачем тогда modules-load.d, если udev сам грузит модули по железу? Получается это только для тех модулей, которые по шине не определяются автоматом, типа nf_conntrack?
👍1 ❤️1 🔥2 😄 🤔
Аватара пользователя
lazyheap
Сообщения: 1
Зарегистрирован: 19 май 2026, 18:15

Re: Железо, устройства и модули ядра [101.1]

Сообщение lazyheap »

Поймал на практике: blacklist nouveau не помог, ноутбук все равно тянул модуль из initrd. Помогло только install nouveau /bin/false плюс dracut -f. Спасибо, что про initramfs предупредили.
👍1 ❤️1 🔥1 😄 🤔1
Ответить
← Предыдущая глава
Введение в LPIC-1 и как устроен путь администратора
Следующая глава →
Загрузка системы: от BIOS до systemd [101.2]

Все главы курса «LPIC-1: администратор Linux (101 + 102)»

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

Вернуться в «LPIC-1: администратор Linux»

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

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