Администратору постоянно нужно отвечать на вопрос "что у меня внутри и почему оно не работает". Села сетевая карта, не определился новый 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 # блочные устройства (диски, разделы)
Установка утилит, если их нет:
Код: Выделить всё
# 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
Конфигурация. Современный путь - каталоги, а не один файл:
Код: Выделить всё
# Загружать модуль автоматически при старте:
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
Частые грабли
- 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 покажет числовые идентификаторы устройства и используемый модуль ядра?