Kernel module (Русский)

Модули ядра — это отдельные кусочки кода, которые могут быть загружены и выгружены из ядра по мере необходимости. Они расширяют функциональность ядра без необходимости перезагрузки системы.

Состояние перевода: На этой странице представлен перевод статьи Kernel module. Дата последней синхронизации: 29 декабря 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Чтобы создать модуль ядра, вы можете прочитать The Linux Kernel Module Programming Guide. Модуль можно сконфигурировать как вкомпилированный, а можно как загружаемый. Чтобы иметь возможность динамически загружать или выгружать модуль, его необходимо сконфигурировать как загружаемый модуль в настройке ядра (в этом случае строка, относящаяся к модулю должна быть отмечена буквой M).

Получение информации

Модули хранятся в /usr/lib/modules/kernel_release. Чтобы узнать текущую версию вашего ядра, используйте команду uname -r.

Примечание: Часто в названии модулей используются подчёркивания (_) или дефисы (-); однако, эти символы взаимозаменяемы как при использовании команды modprobe, так и в конфигурационных файлах в /etc/modprobe.d/.

Чтобы узнать, какие модули ядра загружены в настоящий момент:

$ lsmod

Чтобы показать информацию о модуле:

$ modinfo module_name

Чтобы вывести список опций, с которыми загружен модуль:

$ systool -v -m module_name

Чтобы отобразить настройки для всех модулей:

$ modprobe -c | less

Чтобы отобразить настройки для отдельного модуля:

$ modprobe -c | grep module_name

Чтобы узнать зависимости модуля (или его псевдонима), включая сам модуль:

$ modprobe --show-depends module_name

Автоматическая загрузка модулей с помощью systemd

Сегодня все необходимые загрузки модулей делаются автоматически с помощью udev, поэтому если вам не нужно загружать какие-либо модули, не входящие в стандартное ядро, вам не придётся прописывать модули, требующиеся для загрузки в каком-либо конфигурационном файле. Однако, бывают случаи, когда вам необходимо загружать свой модуль в процессе загрузки или наоборот не загружать какой-то стандартный модуль, чтобы ваш компьютер правильно функционировал.

Чтобы дополнительные модули ядра загружались автоматически в процессе загрузки, создаются статические списки в конфигурационных файлах в директории . Каждый конфигурационный файл называется по схеме . Эти файлы просто содержат список названий модулей ядра, которые необходимо грузить, разделённых переносом строки. Пустые строки и строки, в которых первым непробельным символом является или , игнорируются.

/etc/modules-load.d/virtio-net.conf
# Load virtio_net.ko at boot
virtio_net

Смотрите modules-load.d(5) для дополнительной информации.

Управление модулями вручную

Управление модулями ядра производится с помощью утилит, предоставляемых пакетом . Вы можете использовать эти утилиты вручную.

Загрузка модуля:

# modprobe имя_модуля

Загрузка модуля из другого места (для тех модулей, которых нет в ):

# insmod имя_файла [параметры]

Выгрузка модуля:

# modprobe -r имя_модуля

Альтернативный вариант выгрузки модуля:

# rmmod имя_модуля

Настройка параметров модуля

Чтобы передать параметр модулю ядра, вы можете прописать их вручную для команды modprobe, создать файл конфигурации modbrobe, который будет гарантировать, что параметры будут применяться всегда, или использовать командную строку ядра.

Вручную при загрузке с помощью modprobe

Основной способ передать параметры модулю — использовать команду modprobe. Параметры указываются с помощью простых присваиваний :

# modprobe имя_модуля имя_параметра=значение_параметра

С помощью файлов в /etc/modprobe.d/

Файлы в директории можно использовать для передачи настроек модуля в udev, который через управляет загрузкой модулей во время загрузки системы. Конфигурационные файлы в этой директории могут иметь любое имя, оканчивающееся расширением . Синтаксис следующий:

Например:

С помощью командной строки ядра

Если модуль вкомпилирован в ядро, вы также можете передать параметры модулю с помощью командной строки ядра. Для всех стандартных загрузчиков, подойдёт следующий синтаксис:

имя_модуля.имя_параметра=значение_параметра

Например:

thinkpad_acpi.fan_control=1

Просто добавьте это в загрузчике в строку с ядром, как описано в статье Параметры ядра.

Создание псевдонимов

Псевдонимы (алиасы) - это альтернативные названия для модуля. Например: alias my-mod really_long_modulename означает, что вы можете использовать вместо . Вы также можете использовать звёздочки в стиле shell, то есть alias my-mod* really_long_modulename будет иметь тот же эффект, что и . Создайте алиас:

У некоторых модулей есть алиасы, которые используются для их автоматической загрузки, когда они потребуются определённой программе. Отключение этих алиасов может предотвратить их автоматическую загрузку, при этом остаётся возможность из загрузки вручную.

Запрет загрузки

В терминах модулей ядра blacklisting означает механизм, предотвращающий загрузку какого-то модуля. Это может понадобиться, например если вам не нужна работа какого-то оборудования или если загрузка данного модуля вызывает проблемы: например, могут быть два модуля ядра, которые пытаются управлять одним и тем же оборудованием, и их совместная загрузка приводит к конфликту.

Некоторые модули загружаются как часть initramfs. Команда напечатает все автоматически обнаруженные модули: для предотвращения initramfs от загрузки каких-то из этих модулей, занесите их в чёрный список в файле .conf в каталоге , и хук добавит этот файл в образ initramfs при его генерации. Команда отобразит все модули, которые необходимы некоторым хукам (например, filesystems хук, хук и т.д.). Если вы не используете хук , то не забудьте добавить нужный вам файл в секцию в . После того, как вы запретили загрузку модулей, пересоберите initramfs, а затем перезагрузитесь.

С помощью файлов в /etc/modprobe.d/

Создайте .conf файл в и добавьте строку для каждого модуля, который вы хотите запретить, используя ключевое слово . Например, если вы хотите запретить загружать модуль :

С помощью командной строки ядра

Совет: Это может очень помочь, если неправильный модуль не даёт загрузиться вашей системе.

Вы также можете запрещать модули из загрузчика.

Просто добавьте в вашем загрузчике в строку ядра, как описано в статье Параметры ядра.

Решение проблем

Модули не загружаются

В случае, если конкретный модуль не загружается и журнал загрузки (доступный с помощью journalctl -b) говорит, что модуль в чёрном списке, но в директории нет соответствующей записи, проверьте другую папку-источник modprobe в на записи в чёрном списке.

Модуль не будет загружен, если строка «vermagic», содержащаяся в модуле ядра, не соответствует значению текущего запущенного ядра. Если достоверно известно, что модуль совместим с текущим запущенным ядром, проверку «vermagic» можно отключить с помощью .

Смотрите также

gollark: ææææææææææ why is ctypes so hard
gollark: >yes
gollark: The poll is `(void*)NULL`.
gollark: That's what you would say if you wanted to avoid COMPARTMENTAL SLATS 2.0.
gollark: ```python>>> ctypes.cast(ctypes.c_int64(1103), ctypes.c_char_p)Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.8/ctypes/__init__.py", line 507, in cast return _cast(obj, obj, typ)ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type```It should have let me do this.
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.