Рубрики
kernel \ source \ пакеты \ исходники

kernel \ modules \ модули ядра

Информация uname

Команда uname дает множество интересной информации о вашей системе. 
Вот пример вывода на моей рабочей машине, после того, как я набрал uname -a, 
что говорит команде uname напечатать всю имеющуюся информацию:

$ uname -a
Linux inventor 2.4.20-gaming-r1 #1 Fri Apr 11 18:33:35 MDT 2003 i686 AMD Athlon(tm) XP 2100+ AuthenticAMD GNU/Linux

Подробнее о uname
Теперь, давайте посмотрим, какую же информацию о системе может дать uname
тип информации             аргумент   пример
имя ядра                   -s         "Linux"
имя хоста                  -n         "inventor"
релиз ядра                 -r         "2.4.20-gaming-r1"
версия ядра                -v         "#1 Fri Apr 11 18:33:35 MDT 2003"
архитектура                -m         "i686"
процессор                  -p         "AMD Athlon(tm) XP 2100+"
платформа                  -i         "AuthenticAMD"
операционная система       -o         "GNU/Linux"
Интригующе! А что напечатает uname -a у вас?

Релиз ядра uname -r

А теперь небольшой трюк. 
Для начала выполните uname -r чтобы программа напечатала релиз ядра, которое работает в данный момент.
Теперь посмотрите в директорию /lib/modules и — опа! — Я уверен, что вы обнаружили каталог с точно таким же именем! 
OK, никакой магии, теперь самое время поговорить о значении каталогов в /lib/modules, а также объяснить, что такое модули ядра.

Ядро

Ядро Linux это сердце того, что обычно называют «Linux» — это кусок кода, который напрямую 
взаимодействует с вашим железом и абстрагирует от него обычные программы. 
Благодаря ядру, вашему текстовому редактору не нужно беспокоиться на какой диск, SCSI или IDE, а может даже в RAM, он производит запись. 
Редактор просто записывает в файловую систему, а ядро заботится обо всем остальном.

Введение в модули ядра

Итак, что такое модули ядра? 
Они представляют собой часть ядра, которая сохраняется на диске в специальном формате. 
По вашей команде, они подгружаются в работающее ядро и добавляют в него новую функциональность.

Поскольку модули ядра загружаются по требованию, вы можете иметь ядро поддерживающее 
дополнительную функциональность, которая в обычном состоянии будет выключена и недоступна.
Но «раз в сто лет», эти модули окажутся очень полезными и смогут быть загружены: 
— часто автоматически;
— для поддержки диковинной файловой системы или устройства, которое вы редко используете.

Модули ядра вкратце lsmod

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

lsmod
Для просмотра загруженных модулей на вашей 
системе используйте команду lsmod:
# lsmod
Module                  Size  Used by    Tainted: PF
vmnet                  20520   5
vmmon                  22484  11
nvidia               1547648  10
mousedev                3860   2
hid                    16772   0  (unused)
usbmouse                1848   0  (unused)
input                   3136   0  [mousedev hid usbmouse]
usb-ohci               15976   0  (unused)
ehci-hcd               13288   0  (unused)
emu10k1                64264   2
ac97_codec              9000   0  [emu10k1]
sound                  51508   0  [emu10k1]
usbcore                55168   1  [hid usbmouse usb-ohci ehci-hcd]

Список модулей

Как видите, на моей системе загружено достаточно немного модулей. vmnet и vmmon модули, 
обеспечиваю необходимую функциональность для VMWare Workstation, 
которая позволяет мне запускать виртуальные машины в окне рабочего стола. 
Модуль nvidia выпущен NVIDIA corporation и позволяет использовать 3D-ускорение в Linux.

Дальше у меня есть набор модулей, которые используются для поддержки USB устройств ввода — mousedev, hid, usbmouse, input, usb-ohci, ehci-hcd и usbcore. 
Имеет смысл сконфигурировать ваше ядро для поддержки USB модулей. 
Почему? Потому что USB девайсы это «plug and play» (подключай и работай) девайсы и если у вас есть поддержка USB в модулях, 
вы можете спокойно пойти и купить новое USB устройство, подключить его, и ваша система автоматически загрузит соответствующие модули для этого устройства. 
Это удобный способ сделать что-то.

Сторонние модули

Завершают этот список модули: emu10k1, ac97_codec и sound, которые вместе обеспечиваю поддержку моей звуковой карты Audigy.
Следует отметить, некоторые из моих модулей доступны прямо в исходниках ядра. 
Например, все USB-модули были скомпилированы из стандартных исходных текстов ядра Linux. 
Однако, nvidia, emu10k1 и VMWare-модули были получены из других источников. 
Это подчеркивает другую важную особенность модулей ядра — возможность сторонних производителей добавлять необходимую 
функциональность в ядро и включать ее прямо в запущенное ядро. 
Без перезагрузки.

depmod и компания

В моей папке /lib/modules/2.4.20-gaming-r1/, есть несколько файлов которые начинаются со строки «modules.»:
$ ls /lib/modules/2.4.20-gaming-r1/modules.*
/lib/modules/2.4.20-gaming-r1/modules.dep
/lib/modules/2.4.20-gaming-r1/modules.generic_string
/lib/modules/2.4.20-gaming-r1/modules.ieee1394map
/lib/modules/2.4.20-gaming-r1/modules.isapnpmap
/lib/modules/2.4.20-gaming-r1/modules.parportmap
/lib/modules/2.4.20-gaming-r1/modules.pcimap
/lib/modules/2.4.20-gaming-r1/modules.pnpbiosmap
/lib/modules/2.4.20-gaming-r1/modules.usbmap

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

Как получить модули

Некоторые модули ядра разработаны для работы со специальными устройствами, как например emu10k1 — модуль для поддержки моей звуковой карты. 
Для этого типа модулей, приведенные выше файлы включают также информацию о PCI IDs и прочие идентификационные метки оборудования, которое они поддерживают. 
Эта информация может быть  использована различными скриптами, например «hotplug» (который мы рассмотрим в следующих руководствах)
для автоматического определения оборудования и загрузки соответствующих модулей.

Использование depmod

Информация о зависимостях может становиться не актуальной, особенно в случае установки новых модулей. 
Чтобы ее обновить, просто введите depmod -a. 
Программа depmod просканирует модули из вашей папки /lib/modulesи обновит информацию о зависимостях. 
Она делает это сканируя модули в /lib/modules и проверяя так называемые «symbols» внутри модулей.

Расположение модулей ядра

Итак, как выглядят модули ядра? Для ядра 2.4, все файлы модулей обычно находятся в /lib/modules и имеют имя оканчивающееся на ".o" (для 2.6 ".ko" — прим. ред.). 
Чтобы увидеть все модули из /lib/modules, введите следующее:
# find /lib/modules -name '*.o'
/lib/modules/2.4.20-gaming-r1/misc/vmmon.o
/lib/modules/2.4.20-gaming-r1/misc/vmnet.o
/lib/modules/2.4.20-gaming-r1/video/nvidia.o
/lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o
/lib/modules/2.4.20-gaming-r1/kernel/fs/vfat/vfat.o
/lib/modules/2.4.20-gaming-r1/kernel/fs/minix/minix.o
[список обрезан для краткости]

insmod vs. modprobe

Итак, как же подгрузить модуль в работающее ядро? 
Один из вариантов, использовать команду
insmod и указать ей полный путь к модулю, 
который вы хотите загрузить:
# insmod /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o
# lsmod | grep fat
fat                    29272   0  (unused)

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

rmmod и modprobe в действии

Давайте выгрузим наш модуль fat.o и загрузим его обратно используя modprobe:
# rmmod fat
# lsmod | grep fat
# modprobe fat
# lsmod | grep fat
fat                    29272   0  (unused)

Как видите, работа команды rmmod очень похожа на работу modprobe, 
но имеет противоположный эффект — она выгружает указанный модуль.

Ваши помощники modinfo и modules.conf

Можете воспользоваться командой modinfo, 
чтобы узнать пару интересных вещей о своих любимых модулях:
# modinfo fat
filename:    /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o
description: 
author:      
license:     "GPL"

Также обратите внимание на файл /etc/modules.conf. 
Он содержит настройки для modprobeи позволяет изменять поведение modprobe. 
Например, указывать какие модули загруть до/после загрузки остальных, запускать скрипты до и после загрузки модуля, и многое другое.

Структура modules.conf

Синтаксис и функциональность modules.conf достаточно сложны, и мы не будем в них сейчас 
углубляться (наберите man modules.conf чтобы узнать все подробности), но есть несколько вещей,
которые вы должны знать об этом файле.

Во-первых, многие дистрибутивы генерируют этот файл автоматически из набора файлов в других директориях, таких как /etc/modules.d/. 
Например, в Gentoo Linux есть такая папка, и запуск команды update-modules прочитает все файлы из /etc/modules.d/ и объединит их в новый /etc/modules.conf. 
Поэтому, сделав свои изменения в файлах из /etc/modules.d/ запустите update-modules, если вы используете Gentoo. 
В Debian, процедура очень похожа, за исключением того, что папка называется /etc/modutils/.

Для ядер версии 2.6 аналогичные по функциональности файл и папка из каталога etc называются modprobe.conf и modprobe.d соответственно. 
Синтаксис там упрощен, смотрите man modprobe.conf