Как уже говорилось, модули ядра – это его компоненты, которые можно запускать (или загружать) и выгружать при необходимости. Модули ядра могут загружаться при подключении устройств и выгружаться при их отключении. Это позволяет экономить системную память и повышает гибкость системы.
Само ядро по умолчанию хранится в виде файла /boot/kernel/kernel, модули ядра также хранятся в виде файлов в каталоге /boot/kernel. Заглянув в этот каталог, можно увидеть сотни файлов модулей ядра. Имена файлов всех модулей ядра имеют расширение .ko. Обычно файлы модулей ядра получают имена, соответствующие их функциональности. Например, в файле /boot/kernel/joy.ko находится драйвер джойстика (от английского «joy»), описание которого находится в странице руководства joy(4). Этот драйвер делает джойстик видимым для системы в виде устройства joyO.
Просмотр списка загруженных модулей
В главе 3 было показано, как получить список загруженных модулей перед загрузкой, но этот метод не годится, после того как система загрузится. Получить список загруженных в настоящий момент модулей ядра можно с помощью команды kldstat(8).
# kldstat
Id Refs Address Size Name
О 1 15 0xc0400000 6a978c kernel
©2 1 OxcOaaaOOO 6228 snd_via8233.ko
©3 2 OxcOaMOOO 23898 sound, ko
На этом ноутбуке загружено три модуля ядра. Первый – это ядро О, далее идут драйвер звуковой карты © и звуковая подсистема ©. (Это совершенно неудивительно, так как речь идет о ноутбуке.) Каждый модуль содержит один или более подмодулей, которые можно увидеть с помощью команды kldstat -v, но само ядро содержит несколько сотен подмодулей, поэтому будьте готовы получить очень длинный список.
Загрузка и выгрузка модулей
Загрузка и выгрузка модулей ядра производится с помощью команд kldload(8) и kldunload(8). Например, обычно мой ноутбук подключается к сети посредством проводного соединения Ethernet. При беспроводном подключении мне необходимо загрузить модуль ядра wlan_wep.ko, который использует WEP-шифрование. Для этого я пользуюсь командой kldload, которой передаю имя файла модуля ядра с требуемой функциональностью:
# kldload /boot/kernel/wlan_wep.ko
Как только беспроводное подключение станет ненужным, я выгружаю модуль.1 Для этого требуется указывать не имя файла, а имя модуля, в том виде, как его отображает команда kldstat:
# kldunload wlan_wep.ko
Если бы все возможные функции компилировались непосредственно в ядро, оно имело бы очень большой размер. Модульная архитектура
На самом деле я едва ли буду беспокоиться об этом, потому что я выключу ноутбук, но сама идея, я думаю, вам понятна.
позволяет уменьшить ядро, сделать его более эффективным, а редко используемые функции загружать только в случае необходимости.
Команды kldload(8) и kldunload(8) не требуют указания полного пути к модулю ядра, точно так же они не требуют указания расширения файла ко. Если вы помните точное имя файла модуля ядра, можно использовать примерно такие команды:
# kldload wlan_wep
# kldunload wlan_wep
Лично я, со своим слабеньким мозгом, полагаюсь на функцию автоматического дополнения, присутствующую в командной оболочке, которая напоминает мне полные и правильные имена модулей.
Автоматическая загрузка модулей ядра
Для автоматической загрузки модуля надо добавить его в файл /boot/ loader.conf. Файл по умолчанию loader.conf содержит множество примеров загрузки модулей ядра, в которых используется один и тот же синтаксис. Нужно взять имя модуля ядра, убрать расширение файла ко и добавить к нему строку load=»YES». Например, чтобы автоматически загрузить модуль /boot/kernel/procfs.ko, в файл loader.conf нужно добавить такую строку:
procfs_load=»YES»
Самое сложное во всем этом – узнать точное имя модуля, который требуется загрузить. Пользоваться драйверами устройств проще простого – если ядро не поддерживает новую сетевую карту или устройство SCSI, тогда вместо перенастройки ядра можно просто загрузить модуль драйвера. В этом случае нужно выяснить, какой драйвер поддерживает подключенное устройство, и здесь вам помогут страницы руководства и поисковая система Google. Везде в этой книге я буду упоминать модули ядра, которые помогут решать те или иные проблемы.
Впрочем, подождите минутку – зачем FreeBSD вынуждать загружать драйверы устройств, если она сама определяет их во время загрузки? Отличный вопрос! Дело в том, что вы можете собрать свое собственное ядро и удалить поддержку неиспользуемого устройства. Вы до сих пор не знаете, как собрать свое собственное ядро? Сейчас мы исправим этот недостаток.
system-repair.net