Современные ядра Linux построены в соответствии с модульной архитекту- рой. Ядра Linux поддерживают включение модулей ядра без необходимости пересборки ядра и перезагрузки системы. Это позволяет изменять функцио- нальность ядра в работающей системе, а также включать в ядро и удалять драйверы устройств "на лету".
Модули ядра представляют собой объектные файлы с кодом, который можно подключать к работающему ядру Linux. Модуля ядра компилируются при сборке ядра. Процедура сборки ядра будет рассмотрена далее в этой главе. Модули располагаются в каталоге /lib/modules/<имя ядра>. Имена подката- логов /lib/modules всегда точно соответствуют именам ядер, имеющихся в системе. Имя работающего сейчас ядра можно узнать, выполнив команду uname –r (пример 19.1).
Обратите внимание, что в каталоге /lib/modules имеется подкаталог (или под- каталоги) с именем ядра. Основная часть модулей ядра содержится в подка- талоге kernel/.
В ядрах серии 2.6 в kernel/ обычно имеются следующие подкаталоги:
r arch — модули ядра, зависящие от архитектуры;
r crypto — криптографические модули ядра;
r drivers — драйверы для различных устройств;
r fs — модули поддержки файловых систем;
r kernel — служебный модуль;
r lib — библиотеки, используемые ядром;
r net — поддержка сетевой инфраструктуры;
r sound — поддержка звуковой инфраструктуры.
Для получения списка модулей, установленных в настоящее время в ядро, следует выполнить команду /sbin/lsmod, которая выводит в форматирован- ном виде информацию из файла /proc/modules (пример 19.2).
Пример 19.2. Фрагмент списка загруженных модулей ядра
# lsmod
Module
Size
Used by
vboxnetadp
vboxnetflt
vboxdrv
2 vboxnetadp,vboxnetflt
nls_iso8859_1
nls_cp437
vfat
fat
1 vfat
nfs
lockd
Информацию о модуле выводит команда /sbin/modinfo (пример 19.3).
Информация о модулях включается в сами модули, хотя она при необходи- мости может быть скрыта.
Новые модули могут быть загружены в работающее ядро Linux с помощью команды/sbin/insmod (пример 19.4). Установить модуль в ядро может толь- ко суперпользователь. В качестве аргумента для команды insmod указывают имя файла модуля.
В примере 19.4 был установлен модуль scsi_debug.ko. Команда lsmod отобра- зила в списке модулей установленный модуль.
Удалить модуль из ядра можно с помощью команды /sbin/rmmod (пример 19.5).
Пример 19.5. Удаление модуля командой rmmod
# rmmod scsi_debug
# lsmod | grep scsi
Команда rmmod в примере 19.5 удалила модуль scsi_debug.ko.
Часто модули ядра для работоспособности требуют наличия других модулей ядра. В каталоге, содержащем модули ядра (/lib/modules/`uname -r`), на- ходится текстовый файл modules.dep с зависимостями модулей друг от друга. Файл modules.dep генерируется с помощью утилиты /sbin/depmod.
Вместо команд insmod и rmmod предпочтительнее вызывать команду modprobe, обеспечивающую более интеллектуальное поведение (пример 19.6). Эта команда использует файл modules.dep для автоматического учета зави- симостей модулей, что позволяет загружать модули ядра, не задумываясь об их зависимостях. Они будут учтены, и требуемые модули будут загружены.
Обратите внимание на то, что команда modprobe -v, выполненная в приме- ре 19.6, загрузила сразу три модуля в силу того, что модуль для файловой системы ext4 зависит от crc16.ko и jbd2.ko. Опция -v была использована для вывода информации о загрузке модулей. Вывод команды modinfo в при- мере был сокращен.
По умолчанию команда modprobe устанавливает модуль в ядро, при вызове с опцией -r она способна удалять модули (пример 19.7).
При необходимости выгрузить все модули ядра, не использующиеся в на- стоящий момент, можно использовать команду modprobe -r без аргументов.
Одно из полезных свойств команды modprobe — способность находить фай- лы модулей, имена которых соответствуют заданному шаблону (при- мер 19.8). Для этого следует использовать опцию -l. В именах модулей в та- ком случае допускается использовать шаблоны, аналогичные шаблонам для имен файлов в оболочке.
Пример 19.8. Поиск модулей по шаблону командой modprobe
Использование опции -a команды modprobe позволяет установить сразу несколько модулей, имена которых соответствуют заданному в качестве ар- гумента шаблону.
Если модуль требует передачи ядру некоторой информации, то ее можно ука- зывать в качестве аргументов команды modprobe (пример 19.9).
Пример 19.9. Передача параметров модулю
# modprobe e1000 speed=100
Команда modprobe имеет конфигурационный файл /etc/modprobe.conf. Этот файл позволяет указывать параметры, передаваемые модулям. Помимо этого в данном файле можно задавать команды, которые надо выполнить до или после загрузки или удаления модулей. Также в этом файле могут задаваться псевдонимы для модулей, делающие работу с ними более удобной. Фрагмент файла /etc/modprobe.conf приведен в примере 19.10.
Пример 19.10. Файл /etc/modprobe.conf
alias eth0 e1000 options e1000 Speed=100
В файле /etc/modprobe.conf, приведенном в примере 19.10, указано, что драй- вером для Ethernet-адаптера eth0 является e1000. Это модуль драйвера Intel Gigabit Ethernet, настроенный на скорость 100 Мбит/с, что установлено ди- рективой options.