Контактная информация

По всем интересующим вас вопросам связывайтесь при помощи контактной информации приведенной на этой странице!

skype: metsof
email: accusser@gmail.com

В социальных сетях...

Форма обратной связи

Авторизация

Статьи об операционной системе Linux

Сайдбар

Модули ядра и команды управления ядром и модулями Linux

13 марта 2014

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

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

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

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

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

Производители аппаратного обеспечения могут предоставлять модули для поддержки своего оборудования в виде двоичных файлов, не раскрывая при этом код. Пока такой метод применяется лишь иногда и, конечно же, он не лишен недостатков. (Модуль должен точно подходить к ядру, то есть для каждой новой версии ядра он должен компилироваться повторно. Если обнаружится ошибка, ее может исправить только производитель, но не пользователь — ведь исходный код недоступен.)

Автоматическая загрузка модулей



За то, чтобы модули ядра действительно загружались автоматически по мере надобности, отвечает компонент kmod, интегрированный в ядро. Этот компонент управляется файлом /etc/modprobe.conf, о котором подробно рассказано в подразделе «Конфигурация модуля» далее.

Ядро и модули должны подходить друг к другу. До версии ядра 2.6.15 ядро и его модули должны были точно подходить друг к другу: невозможно было загрузить модуль, скомпилированный для другой версии ядра (пусть и очень близкой). Для каждой версии ядра создавался отдельный каталог модулей /lib/modules/ версия_ядра. При применении как раз таких модулей, которые не поставляются вместе с дистрибутивом (таковы, в частности, модули для графических драйверов ATI или NVIDIA), становится очень сложно точно подобрать модули к ядру.

Возможность использования модулей другой версии ядра. В версии ядра 2.6.16 и выше появляется функция module versioning, позволяющая применять модули и из других версий ядра, и ситуация значительно упрощается: вместе с модулем сохраняется дополнительная информация, сообщающая, возможно ли совместно использовать конкретный модуль и конкретное ядро, несмотря на то что они относятся к разным версиям. Часто можно применить и такой модуль, версия (номер) которого не соответствует версии ядра. Чтобы этот механизм работал, необходимо активизировать функцию module versioning уже при компилировании, кроме того, не должно быть никаких изменений в интерфейсах, расположенных между модулем и ядром.

Если вы хотите написать для SUSE собственные модули ядра, поддерживающие module versioning, сначала установите пакет kernel-syms. Функция module versioning также может называться kernel symbol versions или modversions. Подробно этот механизм описан на следующем сайте: www.oreilly.de/german/ freebooks/linuxdrive2ger/kerver.html.

Команды для управления модулями



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

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

Определение версии ядра.


Команда uname -r выдает номер версии используемого ядра:

user$ uname -r 2.6.28-13-generic


Загрузка файла модуля.

Команда insmod интегрирует указанный модуль в ядро. При этом необходимо передать полное имя файла. Дополнительно можно передать модулю параметры. Если вы хотите указать шестнадцатеричные значения, перед ними нужно ставить Ох, то есть option=0xff.

root# insmod /lib/modules/2.6.28-13-generic/kernel/fs/fuse/fuse.ko


Команда insmod -f пытается загрузить модуль даже тогда, когда он не подходит к действующей версии ядра. Если между ядром и модулем нет никакой несовместимости, такая попытка будет успешной.

Как правило, для загрузки модулей ядра применяется не insmod, a modprobe. Эта команда имеет два преимущества: сама ищет файл модуля (вам следует указать только название модуля), а при необходимости также загружает все модули, требуемые для работы. Кроме того, учитываются все параметры модуля, указанные в /etc/modprobe.conf. Для работы команды modprobe необходимо, чтобы модуль имел правильную конфигурацию (modprobe.conf и modules.dep).

root# modprobe fuse


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

<code>root# lsmod | sort


Удаление модулей.

Команда rmmod вновь удаляет указанный модуль из ядра и предоставляет память, которую занимал данный модуль. Эта команда может быть выполнена лишь в том случае, если удаляемый модуль сейчас не используется. Команда rmmod -a удаляет из памяти все модули, не используемые в данный момент.

root# rmmod fuse


Информация о модулях.

Команда modinfo выдает подробную информацию о модуле. Он не должен находиться в ядре. В следующем примере приведены данные по модулю elOOO. Это драйвер для сетевого адаптера Intel.
<code>
root# modinfo e1000

filename:

version:

license:

description: author:

depends: vermagic: parm: parm:

/lib/modules/2.6.28-13-generic/kernel/drivers/net/el000/el000.ko

7.3.21-k3-NAPI

GPL

Intel® PRO/IOOO Network Driver

Intel Corporation, <linux.nics@intel.com>

2.6.28-13-generic SMP mod_unload modversions Speed:Speed setting (array of int) Duplex:Duplex setting (array of int)</code>


Конфигурация модуля



Управление модулями происходит как по волшебству. Если вы подключаете к файловой системе новый раздел и в нем используется такой формат файловой системы, который ранее не применялся, то автоматически загружается модуль для работы с этой файловой системой. Если раздел находится на диске SCSI, то активизируются и модули SCSI (если они еще не были загружены); в ходе инициализации сетевых функций автоматически загружается драйвер, необходимый для работы вашей сетевой карты и т. д.

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

Модули, необходимые для запуска компьютера. Некоторые модули ядра нужны уже при запуске компьютера, в частности модули для доступа к файловой системе. Пусть они и не являются неотъемлемой частью ядра, но должны передаваться ядру загрузчиком GRUB в файле initrd при запуске компьютера.

hidp,rfcomm,12cap

Модули основных функций.

Модули для базового управления компонентами оборудования (например, для системы USB) загружаются различными сценариями процесса Init-V, которые реагируют прямо на команды modprobe. Команда grep modprobe /etc/init.d/* быстро дает обзор модулей, загружаемых таким образом.

Модули для интерфейсов.

Несколько других модулей загружается в тот момент, когда впервые используется отдельный интерфейс. Здесь возникает особая проблема — для работы с некоторыми интерфейсами конкретные аппаратные компоненты используют различные модули. Итак, если вы запрашиваете интерфейс ethO для первой сетевой карты в компьютере, нужно загрузить в ядро модуль, подходящий для этой карты.

Вы должны сообщить ядру, какой модуль нужно использовать. Такая информация находится в /etc/modprobe.conf, а также в файлах каталога /etc/modprobe.d. Там же находятся установочные и характерные для дистрибутивов параметры и команды, указывающие, какие модули не должны загружаться автоматически (файл blacklist).

Система udev, автоматически управляющая устройствами, также при необходимости загружает нужные модули. Соответствующие правила содержатся в файле /etc/udev/rules.d. О Модули для работы с устройствами USB и FireWire. Такое оборудование играет особую роль. Несколько файлов *.*map в каталоге /lib/modules/kernelversion/ на основании идентификационных кодов компонентов оборудования определяют, какой модуль требуется загрузить. О Взаимосвязи между модулями. Многие модули зависят друг от друга. Например, модуль nfs для файловой системы NFS функционирует лишь в том случае, если в систему также загружены модули lockd, nfs_acl и sunrpc. Все такие зависимости между модулями перечислены в файле / lib/modules/n/modules.dep.

Загрузка модулей при запуске компьютера



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

В Debian и Ubuntu все просто. В этих дистрибутивах специальный сценарий Init-V /etc/init.d/module-init-tools отвечает за то, чтобы загрузить все модули, перечисленные в /etc/modules, строка за строкой. Иначе говоря, вам всего лишь нужно добавить новый модуль как новую строку в /etc/modules.

В большинстве других дистрибутивов необходимо добавить команду modprobe имя_модуля в сценарий Init-V, предназначенный для локальных настроек. Однако не забывайте, что в определенных дистрибутивах модули в таком случае будут загружаться лишь в финале процесса Init-V (при выполнении некоторых задач это достаточно поздно):

Red Hat, Fedora — /etc/rc.d/rc.local; SUSE-/etc/init.d/boot.local.

Модули, не соответствующие лицензии GPL (Ubuntu)


В большинстве дистрибутивов при поставке содержатся только такие модули ядра, исходный код которых соответствует требованиям лицензии GPL. Ubuntu в этом отношении является исключением, так как содержит некоторые модули с различными драйверами оборудования, в которых используется двоичный код производителей оборудования (например, ATI, AVM и NVIDIA).

В Ubuntu 9.04 эти модули входят в состав пакета linux-restricted-modules-arch. Такие модули устанавливаются в каталоге /lib/linux-restricted-modules. Сценарий Init-V под названием linuxrestricted-modules-common при запуске компьютера вызывает сценарий lrm-manager, подключающий к дереву каталогов в точке /lib/ modules/kernelversion/generic временную файловую систему, копирующий туда все модули, не соответствующие лицензии GPL и, наконец, выполняющий для этого каталога команду depmod (см. в следующем разделе). Эти этапы гарантируют, что в дальнейшем можно будет без проблем использовать модули. Если вы не хотите использовать отдельные модули из restricted-modules, укажите их названия в переменной DISABLED_MODULES в файле /etc/default/linux-restricted-modules-common.

В Ubuntu 9.10 и выше модули, не являющиеся свободным ПО, будут передаваться в форме пакетов DKMS. Это механизм, обеспечивающий автоматическое обновление модулей после обновления ядра.

Синтаксис modprobe



alias

Эти команды указывают, какие модули ядра с какими устройствами используются. Пример: с устройством /dev/ethO должен использоваться модуль 8139too.

alias ethO 8139too


Доступ ко многим аппаратным компонентам осуществляется через блочные и символьные файлы-устройства (/dev/xxx). С точки зрения ядра эти файлы-устройства называются не именами, а старшим и младшим номером устройства, где описана команда mknod). Многочисленные команды alias обеспечивают взаимосвязь между номерами устройств и модулями. Схожим образом определяются и сетевые протоколы: для использования определенного протокола ядро ищет семейство протоколов под названием net-pf-n. В следующем примере для семейства протоколов 5 загружается модуль AppleTalk.

alias net-pf-5 appletalk


Если вам не нужен этот протокол и тем более если соответствующий модуль не установлен, то следующая команда избавит вас от назойливых сообщений об ошибках:

alias net-pf-5 off


options

Команды options указывают, с какими параметрами должен загружаться тот или иной модуль. Благодаря следующей команде модуль пе (совместимые с NE-2000 Ethernet-карты) загружается с параметром io=0x300.

options ne io=0x300

include

Команды include загружают указанные конфигурационные файлы, install. С помощью install даются команды, выполняемые дополнительно к простой загрузке модуля. Здесь я также приведу пример, который ради экономии места разделен на две строки. Если вам потребуется модуль AESA snd, нужно выполнить следующие команды:

install snd modprobe --ignore-install snd $CMDLINE_OPTS && \ { modprobe -Qb snd-ioct!32 ;:;}

remove.
С помощью remove указываются команды, которые должны выполняться при удалении модуля.

blacklist

При использовании команды blacklist внутренние alias-определения модулей не учитываются. Как правило, команды blacklist находятся в файле /etc/ modprobe.d/blacklist. Здесь расположены те модули, которые не должны загружаться — из-за проблем с совместимостью или потому, что для них есть лучшая альтернатива. Например, следующая строка не дает запуститься модулю usbmouse. Вместо него обычно используется более мощный модуль hid. blacklist usbmouse

Компилирование дополнительного модуля



Если вы применяете Linux вместе с VirtualBox, желаете использовать двоичные графические драйверы ATI или NVIDIA или вам нужен иной специфичный аппаратный модуль, которого нет в ядре вашего дистрибутива, вам потребуется скомпилировать модуль, подходящий к применяемой версии ядра.

Инструменты разработки


Для компилирования модулей требуются не только компиляторы С gcc и make, но и другие основные инструменты разработки. В большинстве дистрибутивов задача упрощается, так как в них имеются готовые выборки пакетов или метапакеты, указывающие на все важные пакеты:

Debian,Ubuntu — apt-get install build-essential;

Fedora —yum groupinstall development-tools;

SUSE —zypper install -t pattern devel_basis.

Включаемые файлы ядра



Кроме того, вам потребуются включаемые (заголовочные) файлы для действующего ядра. Эти файлы входят в состав кода ядра. Во многих дистрибутивах (но не в SUSE) включаемые файлы находятся в одном пакете, а оставшийся код — в другом. Преимущество такой организации заключается в том, что вам требуется загружать не весь код ядра (он достаточно велик), а лишь сравнительно небольшие включаемые файлы. В следующем списке указано, в каких пакетах располагаются включаемые файлы в наиболее распространенных дистрибутивах и куда эти файлы устанавливаются. Здесь п.п — это подстановочный символ для установленной версии ядра, платформа выполняет ту же функцию для действующего варианта процессора (например, amd64). Вся эта информация выводится командой uname -a.

Debian — linux-headers-n.n-платформа (/usr/include/linux);

Fedora, Red Hat — kernel-[PAE-]devel-n.n (/lib/modules/n.n/build/include);

SUSE — kernel-source (/usr/src/linux-n.n/include);

Ubuntu — linux-headers-generic (/usr/include/linux).


РАЕ



При работе с современными версиями Fedora будьте внимательны: в этом дистрибутиве есть два варианта ядра — с поддержкой РАЕ и без нее. Чтобы узнать, какая версия применяется у вас, выполните команду uname -r. Если в полученной последовательности символов содержится запись pae, то ядро поддерживает РАЕ. В таком случае вам потребуется установить не пакет kernel-devel, a kernel-PAE-devel! Лишь тогда вы сможете скомпилировать модуль, совместимый с вашим ядром.

Аббревиатура РАЕ означает «расширение физических адресов» (Physical Address Extension). Это механизм, позволяющий использовать на 32-битных процессорах более 4 Гбайт оперативной памяти. Однако при активизации РАЕ кроме количества бит в процессоре и объема доступной оперативной памяти вы получаете возможность пользоваться защитной системой No Execute (NX). Она позволяет запретить выполнение кода из области данных определенной программы при переполнении буфера.

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



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

Если, напротив, вы скачали исходный код для аппаратных компонентов, которые пока официально не поддерживаются, то вам потребуется произвести компилирование самостоятельно. Для этого, как правило, нужно выполнить следующие команды. Только для запуска последней команды make требуются права администратора.

user$ cd source code directory user$ make clean user$ make root# make install


Команда module-assistant



В Debian и Ubuntu есть команда module-assistant, или m-a, которая помогает составить список заданных, часто используемых модулей ядра. После установки пакета module-assistant команда m-a prepare инсталлирует все необходимые инструменты pa3pa6oTKH;m-a update обновляет источники для module-assistant; m-a list возвращает список модулей, которые можно скомпилировать с помощью m-a.

root# apt-get install module-assistant root# m-a prepare root# m-a update


Когда эти подготовительные работы будут завершены, самой важной станет команда m-a auto-install, или коротко m-a a-i: она устанавливает пакет Debian в форме имя-source, компилирует для актуальной версии ядра модуль, содержащийся в исходном коде, и устанавливает этот модуль. Если команда «жалуется», что указанный модуль не находит пакета с исходным кодом, то, как правило, нужно дополнить файл /etc/apt/sources.list. В Debian необходимо убедиться, что в дистрибутиве имеются пакеты contrib и non-free; в Ubuntu обычно нужны пакеты restricted, universe и multiverse.

root# m-a auto-install nvidia


После обновления ядра команду m-a a-i нужно выполнить еще раз, чтобы скомпилировать модуль и для новой версии ядра!

Многие модули, доступные через пакет module-assistant, предоставляются в Ubuntu по умолчанию, поэтому совсем не обязательно (а при отсутствии пакетов с исходным кодом даже невозможно) создавать соответствующие модули с помощью m-a. Таим образом, в Debian m-a приходится применять гораздо чаще.

Команда m-a может запускаться и без параметров — тогда она выводит вас в интерфейс, состоящий из текстовых диалогов, где вы можете выбрать или скомпилировать нужный модуль.

DKMS



Это динамическая поддержка модулей ядра (Dynamic Kernel Module Support). Такая функция помогает автоматически обновить самостоятельно скомпилированные модули после обновления ядра. DKMS состоит из нескольких shell-сценариев и разработана фирмой Dell. Официальные пакеты dkms предоставляются лишь в немногих дистрибутивах, в том числе в Fedora и в Ubuntu. Если в Ubuntu устанавливается драйвер NVIDIA, то при обновлении ядра он также автоматически обновляется сценарием Init-V /etc/init.d/dkms_autoinstaller. Кроме того, DKMS обновляет модули, созданные командой module-assistant.

Чтобы можно было пользоваться DKMS, исходный код модуля должен быть установлен в каталоге в форме /usr/src/name-version. В каталоге должен находиться файл dkms.conf, разъясняющий DKMS, как нужно поступить с кодом. Следующие строки взяты из кода для драйвера NVIDIA в Ubuntu 9.04, причем форматирование листинга немного изменено, чтобы код было проще читать.

<code># Файл /usr/src/nvidia-180.44/dkrns.conf PACKAGEJIAME = "nvidia"

PACKAGE VERSION = "180.44"

CLEAN

BUILT_MODULE_NAME[Cl] MAKE[0]

DEST_MODULE_LOCATION[Cl] PATCH[0] PATCH_MATCH[0] AUTOINSTALL

"make clean" "nvidia"

"make module KERNDIR=/lib/modules/$kernelver \ IGN0RE_XEN_PRESENCE=1 IGN0RE_CC_MISMATCH=1 \ SYSSRC=$kernel_source_dir" "/kernel/dn'vers/video/nvidia" "nvidia-rt-compat.patch" "Л2.6.2[8]" "yes"</code>


Если эти условия выполнены, передайте модуль ядра под контроль DKMS с помощью команды dkms add, скомпилируйте его и установите для актуального ядра. В дальнейшем этот процесс будет автоматически выполняться при обновлении ядра. Следующие примеры вновь относятся к драйверу ядра NVIDIA (эти команды автоматически выполняются при установке пакета драйвера в Ubuntu):

<code>root# dkms add -m nvidia -v 180.44 root# dkms build -m nvidia -v 180.44 root# dkms install -m nvidia -v 180.44</code>


Выполнив dkms status или посмотрев в каталог /var/lib/dkms, вы увидите, какие модули в данный момент находятся под контролем DKMS.
Читайте так же:
Самостоятельное конфигурирование и компилирование ядра Linux






Подпишитесь на рассылку! Никакого спама, только обновления!!!

Комментарии (0)


    Услуги по MODX Revolution

    Посмотреть все услуги

    Техническая оптимизация сайта

    Подробнее & Заказать

    Создание сайта на MODX Revolution

    Подробнее & Заказать

    Перенос сайта на MODX Revolution

    Подробнее & Заказать

    Продвижение сайта на MODX

    Подробнее & Заказать