Загружаемые модули ядра Linux
Ядро — это часть Linux, отвечающая за выполнение таких функций, как управление памятью, доступ к жестким дискам, сетевым картам и так далее. При этом ядро организовано по модульному принципу: сначала, то есть при запуске компьютера, загружается основное ядро, содержащее только те функции, которые требуются для старта системы.
Если в ходе работы понадобятся дополнительные функции (например, для работы с конкретным оборудованием), то необходимый код подключится к ядру как модуль. Если в течение некоторого времени эти дополнительные функции будут не нужны, модуль может быть выгружен из ядра.
Общие сведения и модулях ядра
Следующая команда выдает номер версии используемого ядра:
$ uname -r 5.3.0-40-generic
Все модули ядра расположены в директории /lib/modules/версия
:
$ ls /lib/modules/ 5.0.0-23-generic 5.0.0-37-generic 5.3.0-28-generic 5.0.0-35-generic 5.3.0-26-generic 5.3.0-40-generic
$ ls -l /lib/modules/5.3.0-40-generic/ итого 5688 lrwxrwxrwx 1 root root 39 фев 3 15:07 build -> /usr/src/linux-headers-5.3.0-40-generic drwxr-xr-x 2 root root 4096 фев 3 15:07 initrd drwxr-xr-x 17 root root 4096 фев 23 09:43 kernel -rw-r--r-- 1 root root 1372092 фев 26 09:33 modules.alias -rw-r--r-- 1 root root 1347534 фев 26 09:33 modules.alias.bin -rw-r--r-- 1 root root 7846 фев 3 15:07 modules.builtin -rw-r--r-- 1 root root 9943 фев 26 09:33 modules.builtin.bin -rw-r--r-- 1 root root 614737 фев 26 09:33 modules.dep -rw-r--r-- 1 root root 856441 фев 26 09:33 modules.dep.bin -rw-r--r-- 1 root root 353 фев 26 09:33 modules.devname -rw-r--r-- 1 root root 218677 фев 3 15:07 modules.order -rw-r--r-- 1 root root 830 фев 26 09:33 modules.softdep -rw-r--r-- 1 root root 613152 фев 26 09:33 modules.symbols -rw-r--r-- 1 root root 746094 фев 26 09:33 modules.symbols.bin drwxr-xr-x 3 root root 4096 фев 23 09:43 vdso
Модули ядра имеют зависимости друг от друга, которые прописаны в файле /lib/modules/версия/modules.dep
. Данный файл формируется командой depmod
, которая при выполнении просматривает структуру каталогов /lib/modules/версия/
и формирует информацию о зависимостях.
Команды управления модулями
Есть четыре команды для работы с модулями ядра
lsmod
— список всех загруженных модулейmodinfo
— полная информацию о модулеmodprobe
(илиinsmod
) — загрузить модульrmmod
— выгрузить модуль
Просмотреть список загруженных в данный момент модулей
$ lsmod Module Size Used by btrfs 1236992 0 xor 24576 1 btrfs zstd_compress 163840 1 btrfs raid6_pq 114688 1 btrfs ufs 81920 0 qnx4 16384 0 ..................................... pata_acpi 16384 0 video 49152 0
Если счетчик Used By
равен нулю, то модуль ядра никем не используется — его можно выгрузить.
$ sudo rmmod video
Если выгруженный модуль потребовался в процессе работы, его можно снова загрузить.
$ sudo insmod /lib/modules/5.3.0-40-generic/kernel/drivers/acpi/video.ko
Следующая команда выдает информацию об одном модуле
$ modinfo vboxguest filename: /lib/modules/5.3.0-40-generic/kernel/virtualbox-guest/vboxguest.ko version: 6.0.14_Ubuntu r132055 license: GPL description: Oracle VM VirtualBox Guest Additions for Linux Module author: Oracle Corporation srcversion: DAB7B6D4437DA673E236BB3 alias: pci:v000080EEd0000CAFEsv00000000sd00000000bc*sc*i* depends: retpoline: Y name: vboxguest vermagic: 5.3.0-40-generic SMP mod_unload signat: PKCS#7 signer: sig_key: sig_hashalgo: md4
Как правило, для загрузки модулей ядра применяется не insmod
, a modprobe
. Эта команда имеет два преимущества: сама ищет файл модуля (следует указать только название модуля), а при необходимости также загружает все модули, требуемые для работы.
$ sudo modprobe video
Кроме того, эта команда позволяет выгрузить модуль из ядра
$ sudo modprobe -r video
Автоматическая загрузка модулей
Для того, чтобы определенные модули загружались во время старта системы, их можно прописать в файл /etc/modules
. Каждый модуль должен быть записан в отдельной строке. Строки, начинающиеся со слова blacklist
, запрещают загрузку модуля.
Кроме /etc/modules
существует еще директория /etc/modprobe.d
. В ней лежат отдельные конфигурационные файлы, аналогичные по сути /etc/modules
. Кроме того, там есть файл blacklist.conf
, в котором можно запретить загрузку модуля (вместо того, чтобы запрещать в /etc/modules
).
Директива blacklist
запретит автоматическую загрузку модуля, но этот модуль всё равно может загрузиться, если от него зависит какой-то не запрещённый модуль или если он загружен вручную.
Можно изменить такое поведение. Команда install
заставляет
install имя_модуля /bin/true
Это запретит указанный модуль и все модули, зависящие от него.
Поиск: CLI • Linux • Команда • Конфигурация • Модуль • Настройка • Ядро • modprode • lsmod