Какова последовательность загрузки модуля ядра Linux при запуске? Как приоритет для них?

9

У меня есть модуль ядра Linux, который я скомпилировал динамически. Как это добавляется в автозагрузку? Есть много .koфайлов в /lib/modules. Как устанавливается приоритет для загрузки этих модулей?

ganeshredcobra
источник

Ответы:

11

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

  • Запрос в пользовательском пространстве: охватывает все, от служб init до udev и командной строки. Init или udev, вероятно, являются наиболее простым средством, если вы хотите загрузить определенный модуль во время загрузки.

  • Устройство с горячим подключением: когда вы подключаете что-либо, например, к USB или PCI, ядро ​​обнаруживает это и запрашивает соответствующий модуль на основе того, как устройство идентифицирует себя.

  • Необходимый протокол или другая реализация : когда ядру нужно что-то сделать, например, прочитать файловую систему, и обнаружить, что для этого ему не хватает знаний, оно запросит модуль.

Обратите внимание, что для последних двух я использовал фразу «запросить модуль» - это потому, что ядро ​​фактически загружается через демон userpace, kmodкоторый выполняется /sbin/modprobe. По словам Вольфганга Моерера из Linux Kernel Architecture , в ядре 2.6 есть только ~ 100 различных точек, где он вызывает внутреннюю request_module()функцию.

modprobeиспользует базу данных установленных MODULE_ALIAS. Они явно указаны в исходном коде модуля или получены из его MODULE_DEVICE_TABLE, который представляет собой список идентификаторов OEM-устройств, которые обслуживает модуль.

лютик золотистый
источник
3

Многие системы настроены на использование initrd или initramfs . Это образы файловой системы, которые загружаются загрузчиком и становятся доступными ядру до его монтирования в корневой раздел. Это позволяет скомпилировать драйверы, необходимые для монтирования корневого раздела (драйверы дисков, драйверы файловой системы, драйверы устройств отображения или логических томов,…), и загрузить их из initrd / initramfs.

Скрипты запуска в initrd ( /linuxrc) или initramfs ( /init) обычно загружают некоторые модули и обнаруживают корневую файловую систему. Каждый дистрибутив имеет свою настройку. Ubuntu использует initramfs, который собран из компонентов в initramfs-toolsпакете и регенерирован для каждого ядра на основе необходимых драйверов для монтирования корневой файловой системы.

После того, как корневая файловая система смонтирована, во время загрузки системы загружаются модули, перечисленные в /etc/modules(Debian,…) или /etc/modules.conf(Red Hat, Arch,…). Этот файл обычно содержит несколько модулей, если таковые имеются. Большинство модулей загружаются по требованию.

Когда ядро ​​обнаруживает некоторое оборудование, для которого ему не хватает драйвера, или некоторые другие компоненты, такие как сетевые протоколы или криптографические алгоритмы, оно вызывает /sbin/modprobeзагрузку модуля. Для драйверов аппаратного обеспечения ядро ​​передает имена, которые кодируют идентификатор PCI, идентификатор USB или другое систематическое обозначение оборудования. Существует таблица, в /lib/modules/$VERSION/modules.aliasкоторой эти систематические обозначения сопоставляются с именами модулей. Эта таблица генерируется depmodи читается modprobe.

Если у вас есть дополнительный модуль ядра, который вы скомпилировали вручную для аппаратного устройства, поместите его в /lib/modules/$VERSION/local(создайте localподкаталог, если он не существует) и запустите depmod -aдля регенерации базы данных псевдонимов. Если модуль предназначен для какой-то необычной функции, которую ядро ​​не может обнаружить автоматически, поместите его /lib/modules/$VERSION/local, запустите depmod -aдля анализа его зависимостей и добавьте имя модуля /etc/modules.

Жиль "ТАК - перестань быть злым"
источник
Я не могу найти /var/lib/modulesни a /lib/modules/*/local, ни я не могу найти упоминания об этом в Google или на depmodстранице man. Посмотрел в CentOS 6.4, 7.4 и Ubuntu 19.04.
сенток
@itsadok Я уверен, что хотел написать /lib/modules/…. Просто создайте localподкаталог ( рекурсивно depmodобходит /lib/module/$VERSION).
Жиль "ТАК - перестать быть злым"