У меня есть модуль ядра Linux, который я скомпилировал динамически. Как это добавляется в автозагрузку? Есть много .ko
файлов в /lib/modules
. Как устанавливается приоритет для загрузки этих модулей?
источник
У меня есть модуль ядра Linux, который я скомпилировал динамически. Как это добавляется в автозагрузку? Есть много .ko
файлов в /lib/modules
. Как устанавливается приоритет для загрузки этих модулей?
Они не загружаются автоматически при запуске или в любое другое время, хотя многие из них в конечном итоге загружаются во время загрузки. Есть три различных механизма, с помощью которых это происходит:
Запрос в пользовательском пространстве: охватывает все, от служб 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-устройств, которые обслуживает модуль.
Многие системы настроены на использование 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./lib/modules/…
. Просто создайтеlocal
подкаталог ( рекурсивноdepmod
обходит/lib/module/$VERSION
).