Ядро Linux является сердцем операционной системы. Это программное обеспечение, которое напрямую взаимодействует с оборудованием. Ядро — единственная часть операционной системы, которая напрямую взаимодействует с оборудованием; все остальные компоненты, которые вы используете, должны пройти через ядро. Для доступа к различным аппаратным компонентам ядру необходимы драйверы. Роль драйвера — сообщить ядру, как именно оно должно обращаться к оборудованию. Каждый драйвер ядра представлен модулем ядра. Только самые необходимые драйверы компилируются непосредственно в самом ядре. Остальные - менее важные драйверы подгружаются ядром
Для динамической загрузки функций и драйверов без необходимости перезапускать всю систему в Linux применяются специальные компоненты - модули. Они позволяют улучшить производительность и эффективность системы. Использование модулей позволяет системе загружать только необходимые драйверы и функции, которые нужны для работы определенного оборудования или программного обеспечения, что снижает общую загрузку системы и экономит ресурсы.
Для получения списка всех загруженных модулей применяется команда lsmod:
eugene@Eugene:~$ lsmod Module Size Used by ntfs3 344064 1 esp4 28672 0 xfrm_interface 28672 0 xfrm6_tunnel 16384 1 xfrm_interface .............................................. nvme_common 28672 1 nvme_core vmd 24576 0 ucsi_acpi 12288 0 typec_ucsi 53248 1 ucsi_acpi typec 110592 1 typec_ucsi video 73728 3 asus_wmi,i915,nouveau wmi 40960 6 video,asus_wmi,wmi_bmof,mfd_aaeon,mxm_wmi,nouveau eugene@Eugene:~$
Вывод команды lsmod показывает не только какие модули загружены, но и что они делают. Вывод представляет таблицу из трех столбцов:
Имя модуля
Объем используемой модулем памяти
Количество и имена других модулей, которые в данный момент используют этот модуль. Этот столбец очень важен, поскольку, если у модуля есть зависимости, то перед выгрузкой модуля сначала нао выгрузить все его зависимости.
Также можно найти определенные модули. Например, найдем модуль "bluetooth":
eugene@Eugene:~$ lsmod | grep bluetooth bluetooth 1077248 34 btrtl,btmtk,btintel,btbcm,bnep,btusb,rfcomm ecdh_generic 16384 1 bluetooth eugene@Eugene:~$
Для получения информации о модуле, который в данный момент загружен, выполняется команда modinfo:
modinfo [options] modulename
Эта команда принимает имя модуля, о котором надо вывести информацию, и также может принимать необязательные опции:
-a, --author
: выводит только автора модуля
-d, --description
: выводит только описание
-l, --license
: выводит только лицензию
-p, --parameters
: выводит только параметры
-n, --filename
: выводит только имя файла
-F, --field=FIELD
: выводит только указанное поле FIELD
-V, --version
: выводит только версию
Если опции явным образом не указывают, какую информацию надо вывести, то выводится вся информация о модуле. Например, выведем инфу о модуле "bluetooth":
eugene@Eugene:~$ modinfo bluetooth filename: /lib/modules/6.5.0-26-generic/kernel/net/bluetooth/bluetooth.ko.zst alias: net-pf-31 license: GPL version: 2.22 description: Bluetooth Core ver 2.22 author: Marcel Holtmann <marcel@holtmann.org> srcversion: C91504123EB8C35EA0398EF depends: ecdh_generic retpoline: Y intree: Y name: bluetooth vermagic: 6.5.0-26-generic SMP preempt mod_unload modversions sig_id: PKCS#7 signer: Build time autogenerated kernel key sig_key: EA:9B:71:2C:1A:62:D5:9E::D1:D8:43:A4:01:07:A6:D0:DDA8:50:6A sig_hashalgo: sha512 signature: 1B:8A:2C:E2:F3:DE:96:1B:AB:3B:78:B4:AD:0E parm: disable_esco:Disable eSCO connection creation (bool) parm: disable_ertm:Disable enhanced retransmission mode (bool) parm: enable_ecred:Enable enhanced credit flow control mode (bool) eugene@Eugene:~$
Обычно модули загружаются автоматически. Однако в некоторых случаях вам может потребоваться выгрузить и перезагрузить модуль вручную. Например, это может потребоваться, чтобы загрузить модуль с новыми опциями. Поскольку модули обычно загружаются автоматически, то, вероятно, придется сначала выгрузить модуль, прежде чем загрузить его снова.
Чтобы выгрузить загруженный в данный момент модуль, используется команда
modprobe -r bluetooth
Обратите внимание, что модули, которые в данный момент требуются другому модулю ядра в качестве зависимости, не могут быть выгружены. И при попытке выгрузки мы получим сообщение об ошибке:
eugene@Eugene:~$ modprobe -r bluetooth modprobe: FATAL: Module bluetooth is in use. eugene@Eugene:~$
Для загрузки модуля его имя просто передается команде modprobe:
modprobe bluetooth
Загрузка модуля может завершиться неудачей из-за ошибок версии. Обычно модули пишутся для конкретной версии ядра, и если версия в модуле неправильная, он не сможет загрузиться.
Обычно нужные модули для аппаратного обеспечения компьютера загружаются автоматически. Это можно проверить с помощью команды lspci -k. Например:
eugene@Eugene:~$ lspci -k 00:00.0 Host bridge: Intel Corporation 16th Gen Core Processor Host Bridge/DRAM Registers (rev 08) DeviceName: Onboard - Other Subsystem: ASUSTeK Computer Inc. 16th Gen Core Processor Host Bridge/DRAM Registers 00:01.0 PCI bridge: Intel Corporation 16th Gen Core Processor PCI Express x16 Controller #1 (rev 08) Subsystem: ASUSTeK Computer Inc. 16th Gen Core Processor PCI Express x16 Controller Kernel driver in use: pcieport 00:02.0 VGA compatible controller: Intel Corporation SuperLake-S GT1 (rev 0c) DeviceName: Onboard - Video Subsystem: ASUSTeK Computer Inc. SuperLake-S GT1 Kernel driver in use: i919 Kernel modules: i919 00:06.0 Network controller: Intel Corporation Wi-Fi 6 AX210/AX211/AX411 160MHz (rev 1a) Subsystem: Intel Corporation Wi-Fi 6 AX210 160MHz Kernel driver in use: iwlwifi Kernel modules: iwlwifi ...........................
Здесь можно увидеть применяемые драйвер и модуль для определенной подсистемы компьютера. В некоторых случаях может не отображаться ни одного драйвера ядра. В этом случае модуль ядра для этого конкретного оборудования не найден. Для решения этой проблемы следует поискать проприетарный драйвер у поставщика конкретного оборудования.