- Модули ядра Linux
- Модули ядра Linux
- Все модули
- Что загружено?
- Запуск модулей ядра
- Удаление модулей ядра
- Блокирование загрузки модулей
- Автозагрузка модулей
- Установка модулей ядра Linux
- Выводы
- How to load and unload kernel modules in Linux
- How to load and unload kernel modules in Linux
- How to load kernel modules in Linux
- Load Kernel Modules using INSMOD command
- Load Kernel Modules using MODPROBE command
- List Loaded Kernel Modules
- How to unload kernel modules in Linux
- Unload kernel modules using rmmod command
- Unload kernel modules using modprobe command
Модули ядра Linux
Как вы знаете из статьи что такое ядро Linux, ядро является монолитным. Это значит, что весь исполняемый код сосредоточен в одном файле. Такая архитектура имеет некоторые недостатки, например, невозможность установки новых драйверов без пересборки ядра. Но разработчики нашли решение и этой проблеме, добавив систему модулей.
Ядро Linux позволяет драйверам оборудования, файловых систем, и некоторым другим компонентам быть скомпилированными отдельно — как модули, а не как часть самого ядра. Таким образом, вы можете обновлять драйвера не пересобирая ядро, а также динамически расширять его функциональность. А еще это значит, что вы можете включить в ядре только самое необходимое, а все остальное подключать с помощью модулей. Это очень просто.
Модули ядра Linux
В этой статье мы рассмотрим модули ядра Linux, основы работы с ними, просмотр уже загруженных модулей, загрузку, установку и отключение модулей. А также полное отключение, добавление в черный список и добавление новых модулей ядра.
Модули ядра Linux собираются только под определенную версию ядра, есть способ запуска модуля независимо от версии ядра, если они совместимы с помощью dkms, но об этом мы поговорим позже.
Находятся все модули в папке /lib/modules/. Учитывая, что модули рассчитаны только для определенной версии ядра, то в этой папке создается отдельная подпапка, для каждой установленной в системе версии ядра. В этой папке находятся сами модули и дополнительные конфигурационные файлы, модули отсортированы по категориям, в зависимости от назначения например:
Перед тем как переходить к практике, давайте коротко рассмотрим основные команды для управления модулями.
- lsmod — посмотреть загруженные модули
- modinfo — информация о модуле
- insmod — загрузить модуль
- rmmod — удалить модуль
Работа с модулями ядра Linux выполняется, в основном, с помощью этих команд, но могут использовать и другие.
Все модули
Такая задача возникает нечасто, но если вы хотите посмотреть все установленные модули ядра Linux в системе, делается очень просто. Все модули расположены в папке /lib/modules, а поэтому очень просто вычислить их все одной командой, или даже просто зайти в папку файловым менеджером и посмотреть.
В Ubuntu команда будет выглядеть вот так:
dpkg -S *.ko | grep /lib/modules
Можно смастерить такую конструкцию с помощью find:
Можем искать только для текущего ядра:
find /lib/modules/$(uname -r) -name *.ko
Также, все модули записаны в конфигурационном файле /lib/modules/modules.aliases, поэтому мы можем просто посмотреть его содержимое:
Если хотим проверить установлен ли определенный модуль ядра Linux, отфильтруем вывод любой из команд с помощью grep:
find /lib/modules -name *.ko | grep vbox
Что загружено?
Все информация о загруженных модулях хранится в файле /proc/modules, мы можем ее вывести командой:
Но для этого дела есть более цивилизованные методы. Это утилита lsmod и modinfo. Чтобы посмотреть загруженные модули ядра linux выполните:
Удобно проверять загружен ли модуль с помощью grep:
А более подробную информацию о каждом модуле можно получить с помощью утилиты modinfo:
Здесь вы можете увидеть файл модуля, его лицензию, автора и зависимости. Зависимости — это те модули, которые должны быть загружены для его нормальной работы. К сожалению, не для всех модулей доступно нормальное описание, но вы можете попробовать посмотреть описание зависимостей модуля.
Запуск модулей ядра
Загрузить модуль ядра Linux можно с помощью команд modprobe или insmod. Например, загрузим модуль vboxdrv
Чтобы загрузить модуль ядра linux с помощью insmod необходимо передать адрес файла модуля:
sudo insmod /lib/modules/4.1.20-11-default/weak-updates/misc/vboxdrv.ko
Напоминаю, что его можно узнать с помощью команды modinfo. Запуск модуля ядра Linux предпочтительно выполнять с помощью modprobe, поскольку эта команда не только находит файл модуля в файловой системе, но и загружает все его зависимости.
Удаление модулей ядра
Здесь аналогично две команды — modprobe, позволяет удалить модуль если ей передать опцию -r, а также есть команда rmmod. Начнем с modprobe:
Другая команда в этом случае выглядит немного проще:
Если вы получили ошибку во время выгрузки модуля, например: rmmod: ERROR: Module vboxdrv is in use by: vboxnetadp vboxnetflt, значит он еще используется другими модулями, и сначала нужно выгрузить их. В данном случае это vboxnetadp и vboxnetflt. Правильно отработавшая команда не должна ничего возвращать.
rmmod vboxnetadp vboxnetflt
Блокирование загрузки модулей
Иногда, во время загрузки системы для используемых нами устройств, загружаются не те модули ядра Linux, они либо не поддерживают нужную функциональность либо конфликтуют с другими модулями. Ярким примером можно назвать загрузку драйвера b43 вместо brcmsmac для беспроводных адаптеров Broadcom. Чтобы решить эту проблему вы можете добавлять модули в черный список. Для этого достаточно добавить одну строчку в файл /etc/modprobe.d/blacklist.conf:
sudo vi /etc/modprobe.d/blacklist.conf
Этот код добавит в черный список модуль b43.
Автозагрузка модулей
Кроме чёрного списка существует отдельный каталог, в котором можно настроить автоматическую загрузку модулей при старте системы. Это /etc/modules.load.d/. Этот каталог тоже содержит конфигурационные файлы с расширением *.conf, в которых перечислены все модули, которые надо загружать при старте системы. Для добавления своего модуля можно воспользоваться файлом /etc/modules.load.d/modules.conf. Например, добавим brcmsmac:
sudo vi /etc/modules.load.d/modules.conf
Установка модулей ядра Linux
Собранные для этой версии ядра модули вы можете просто скопировать в нужную папку, собственно, мы так и поступаем, когда собираем ядро из исходников. Но с проприетарными драйверами и другими внешними драйверами, не поставляемыми в комплекте с ядром дело обстоит иначе. Эти модули поддерживают несколько версий ядра, но для их установки используется специальная технология — DKMS (Dynamic Kernel Module Support). Причем модуль, установленный таким образом один раз, будет пересобираться для каждой новой версии ядра автоматически. Обычно такие модули поставляются в виде пакетов, которые устанавливаются как и все другие приложения пакетным менеджером. Ручная установка модулей с помощью dkms выходит за рамки данной статьи.
Выводы
Скорее всего, вам редко придется возиться с этими модулями. Но работа с модулями ядра будет необходима, если ваш дистрибутив не поддерживает аппаратное обеспечение вашего устройства из коробки, а также когда вы работаете со сторонним программным обеспечением, таким как VirtualBox, Vmware и т д. Но очень полезно знать как обращаться с модулями, когда вам нужно добавить или удалить их. Даже если у вас нет необходимости в этом сейчас, вы можете протестировать, как все работает, чтобы быть вооруженным потом.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
How to load and unload kernel modules in Linux
In this tutorial, you will learn how to load and unload kernel modules in Linux. When you install a Linux-like operating system, the kernel automatically installs the majority of device driver modules. It also allows you to install additional device drivers as modules using the commands modprobe and insmod once the installation is complete.
How to load and unload kernel modules in Linux
Normally, kernel modules are loaded automatically, but you may need to manually install new modules on occasion.
From time to time, you may want to unload/uninstall some modules are well.
While the two commands are used to achieve the same thing, most users will want to use modprobe instead, which is more clever and can handle module dependencies.
Modprobe can also be used to unload/remove loaded kernel modules.
How to load kernel modules in Linux
Load Kernel Modules using INSMOD command
The insmod (insert module) command can be used to load a kernel module. The whole path of the module must be specified here.
Kernel module files usually have .ko extensions, for example you can use the command bellow to insert bluetooth.ko module.
insmod /lib/modules/4.4.0-21-generic/kernel/drivers/cpufreq/bluetooth.ko
Load Kernel Modules using MODPROBE command
Using the modprobe command and the module name, you can add the module to the Linux kernel.
List Loaded Kernel Modules
Using the lsmod command, you can see what kernel modules are currently loaded.
sudo lsmod | grep bluetooth
Except for the additional configuration file in /etc/modprobe.d/ , Linux maintains a kernel module directory and configuration files under /lib/modules/’uname -r’ /kernel/drivers/ .
To list kernel drivers run the following command
ls /lib/modules/'uname -r'/kernel/drivers/
For my case when I run uname -r I get the following sample output;
Now I can run the full command with value of the command uname -r used;
ls /lib/modules/5.11.0-38-generic/kernel/drivers/
accessibility crypto hwmon md parport scsi vdpa acpi dax hwtracing media pci siox vfio android dca i2c memstick pcmcia slimbus vhost ata dma i3c message phy soc video atm edac iio mfd pinctrl soundwire virt auxdisplay extcon infiniband misc platform spi virtio base firewire input mmc power spmi visorbus bcma firmware iommu most powercap ssb vme block fpga ipack mtd pps staging w1 bluetooth gnss irqchip mux ptp target watchdog bus gpio isdn net pwm tee xen char gpu leds nfc rapidio thermal clk greybus lightnvm ntb regulator thunderbolt counter hid macintosh nvdimm reset tty cpufreq hsi mailbox nvme rpmsg uio cpuidle hv mcb nvmem rtc usb
You may encounter problems loading modules at times, or modules that are not loaded properly.
You can aggressively install or load modules to avoid these issues by using the ‘–force’ option (-f) in the modprobe command.
If you continue to have issues or difficulties while loading the modules, you will need to debug this time.
You can determine the exact error or issue before or after installing the modules by activating debugging. To put it another way, debugging is the same as a dry-run of loading modules.
This form of debugging is enabled by the ‘-n’ option in the modprobe command. This option forces the modprobe command to complete all module loading steps except the last.
The ‘ —show-depends ‘ option in the modprobe command can also be used to display the module’s dependencies.
An example is shown below.
modprobe --show-depends e1000
insmod /lib/modules/5.11.0-38-generic/kernel/drivers/net/ethernet/intel/e1000/e1000.ko
How to unload kernel modules in Linux
Just like insmod does not a module with its dependencies, rmmod does not remove a module with its dependencies. You may want to use modprobe with -r option instead.
Unload kernel modules using rmmod command
The rmmod (remove module) command is used to unload a kernel module. The bluetooth.ko module will be unloaded or removed using the following example.
rmmod /lib/modules/4.4.0-21-generic/kernel/drivers/cpufreq/bluetooth.ko
Unload kernel modules using modprobe command
Use the modprobe command with the -r option and the module name to remove a module. e.g.
sudo modprobe -r bluetooth
To remove a kernel module, use the -r option in the modprobe command. Assume we wish to get rid of the floppy module.
After removing the floppy module from the kernel, type
You should not be able to see anything. If you want to re-insert this module, refer to loading kernel module section above.
That concludes our guide on how to load and unload kernel modules in Linux.