Работа с модулями ядра
Современные ядра Linux построены в соответствии с модульной архитекту- рой. Ядра Linux поддерживают включение модулей ядра без необходимости пересборки ядра и перезагрузки системы. Это позволяет изменять функцио- нальность ядра в работающей системе, а также включать в ядро и удалять драйверы устройств "на лету".
Модули ядра представляют собой объектные файлы с кодом, который можно подключать к работающему ядру Linux. Модуля ядра компилируются при сборке ядра. Процедура сборки ядра будет рассмотрена далее в этой главе. Модули располагаются в каталоге /lib/modules/<имя ядра>. Имена подката- логов /lib/modules всегда точно соответствуют именам ядер, имеющихся в системе. Имя работающего сейчас ядра можно узнать, выполнив команду uname –r (пример 19.1).
Пример 19.1. Каталог /lib/modules |
$ ls /lib/modules
2.6.31.8-0.1-desktop 2.6.31.8-0.1-xen
$ uname -r
2.6.31.8-0.1-desktop
$ ls /lib/modules/`uname -r`
build misc modules.alias.bin modules.builtin.bin modules.dep.bin modules.symbols source vdso kernel modules.alias modules.builtin modules.dep modules.order modules.symbols.bin systemtap weak-updates
Обратите внимание, что в каталоге /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).
Пример 19.3. Вывод информации о модуле ядра |
# modinfo vboxdrv
filename: /lib/modules/2.6.31.8-0.1-desktop/misc/vboxdrv.ko version: 3.1.2 (0x00100001)
license: GPL
description: VirtualBox Support Driver author: Sun Microsystems, Inc. srcversion: F03437979AB40995D202F18
depends:
vermagic: 2.6.31.8-0.1-desktop preempt mod_unload modversions 686 parm: force_async_tsc:force the asynchronous TSC mode (int)
Информация о модулях включается в сами модули, хотя она при необходи- мости может быть скрыта.
Новые модули могут быть загружены в работающее ядро Linux с помощью команды/sbin/insmod (пример 19.4). Установить модуль в ядро может толь- ко суперпользователь. В качестве аргумента для команды insmod указывают имя файла модуля.
Пример 19.4. Установка модуля командой insmod |
# insmod \
> /lib/modules/2.6.31.8-0.1-desktop/kernel/drivers/scsi/scsi_debug.ko
# lsmod | grep scsi
scsi_debug 62688 0
В примере 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 для автоматического учета зави- симостей модулей, что позволяет загружать модули ядра, не задумываясь об их зависимостях. Они будут учтены, и требуемые модули будут загружены.
Пример 19.6. Установка модуля командой modprobe |
# modinfo ext4
filename: /lib/modules/2.6.31.8-0.1-desktop/kernel/fs/ext4/ext4.ko
...
depends: jbd2,crc16
...
# modprobe -v ext4
insmod /lib/modules/2.6.31.8-0.1-desktop/kernel/lib/crc16.ko insmod /lib/modules/2.6.31.8-0.1-desktop/kernel/fs/jbd2/jbd2.ko insmod /lib/modules/2.6.31.8-0.1-desktop/kernel/fs/ext4/ext4.ko
Обратите внимание на то, что команда modprobe -v, выполненная в приме- ре 19.6, загрузила сразу три модуля в силу того, что модуль для файловой системы ext4 зависит от crc16.ko и jbd2.ko. Опция -v была использована для вывода информации о загрузке модулей. Вывод команды modinfo в при- мере был сокращен.
По умолчанию команда modprobe устанавливает модуль в ядро, при вызове с опцией -r она способна удалять модули (пример 19.7).
Пример 19.7. Удаление модулей командой modprobe |
# modprobe -v -r ext4
rmmod /lib/modules/2.6.31.8-0.1-desktop/kernel/fs/ext4/ext4.ko rmmod /lib/modules/2.6.31.8-0.1-desktop/kernel/fs/jbd2/jbd2.ko rmmod /lib/modules/2.6.31.8-0.1-desktop/kernel/lib/crc16.ko
При необходимости выгрузить все модули ядра, не использующиеся в на- стоящий момент, можно использовать команду modprobe -r без аргументов.
Одно из полезных свойств команды modprobe — способность находить фай- лы модулей, имена которых соответствуют заданному шаблону (при- мер 19.8). Для этого следует использовать опцию -l. В именах модулей в та- ком случае допускается использовать шаблоны, аналогичные шаблонам для имен файлов в оболочке.
Пример 19.8. Поиск модулей по шаблону командой modprobe |
# modprobe -l 'e100*' kernel/drivers/net/e1000/e1000.ko kernel/drivers/net/e1000e/e1000e.ko kernel/drivers/net/e100.ko
Использование опции -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.
Дата добавления: 2015-06-12; просмотров: 1088;