Сборка модулей ядра
Материал из ALT Linux Wiki
(→Как собрать модуль правильно) |
м (→Сборка kernel-source-module) |
||
Строка 39: | Строка 39: | ||
<code> | <code> | ||
git clone git://git.altlinux.org/people/silicium/packages/kernel-source-heci.git | git clone git://git.altlinux.org/people/silicium/packages/kernel-source-heci.git | ||
- | mkdir kernel-source-module | + | mkdir kernel-source-module |
- | cd kernel-source-module | + | cd kernel-source-module |
- | git init-db | + | git init-db |
- | распакавать исходники | + | распакавать исходники |
- | git add . | + | git add . |
- | git commit -a -m "version" (ну или вариации) | + | git commit -a -m "version" (ну или вариации) |
- | git branch -m upstream (чтобы потом докладывать) | + | git branch -m upstream (чтобы потом докладывать) |
- | git checkout -b master | + | git checkout -b master |
- | cp ../kernel-source-heci/.gear* . | + | cp ../kernel-source-heci/.gear* . |
- | cp ../kernel-source-heci/*.spec | + | cp ../kernel-source-heci/*.spec |
- | mv kernel-source-heci.spec kernel-source-module.spec | + | mv kernel-source-heci.spec kernel-source-module.spec |
</code> | </code> | ||
Редактируем по образу и подобию kernel-source-module.spec там надо обычно заменить имя модуля, версию, описание и чейнджлог, сам процесс сборки обычно можно не трогать. | Редактируем по образу и подобию kernel-source-module.spec там надо обычно заменить имя модуля, версию, описание и чейнджлог, сам процесс сборки обычно можно не трогать. | ||
<code> | <code> | ||
- | git add .gear *.spec | + | git add .gear *.spec |
- | git commit -a | + | git commit -a |
</code> | </code> | ||
Далее собираем пакет при помощи gear. В результате в пакете должен быть всего один файл /usr/src/kernel/sources/kernel-source-module.tar.bz2 | Далее собираем пакет при помощи gear. В результате в пакете должен быть всего один файл /usr/src/kernel/sources/kernel-source-module.tar.bz2 |
Версия 11:29, 1 сентября 2008
Содержание |
Введение
Ядро Linux содержит в себе множество кода, поддерживающего ту или иную возможность или обрудование. Основная часть этого кода вкомпилино в ядро и загружается с ним, обычно это код поддерки процессоров, памяти и других базовых вещей, а код необходимый только части пользователей: драйверы устройств, поддержка файловых систем, и тд собрано в виде модулей. Модули могут подключаться к ядру по команде пользователя (modprobe',insmod) или автоматически при помощи udev, также модули могуть быть выгруженны либо самим ядром либо командой rmmod.
Большенство модулей находиться в пакете ядра, иногда по техническим, административным, или юредическим причинам некоторые модули выносяться в отдельные пакеты, и соответвенно собиратются отдельно.
О модулях и названиях
Поскольку в репозитарии может быть множество ядер, модули собираются так: имеется пакет с исходными кодами модуля, и пакет с модулем собранным для конкретного ядра. Приэтом SRPM второго содержит только spec и пачи, а исходные коды получает по сборочным зависимостям. Таким образом у нас есть пакеты:(module - имя модуля, flavour - вариант ядра)
Таким образом модуль с nvidia для ядра kernel-image-std-def-2.6.25-alt8 будет kernel-modules-nvidia-std-def-173.14.12-alt1.132633.8
Как собрать модуль локально
Данная фаза нужна в первую очередь для тестирования модуля, и вобщем то необязательна, но полезна для понимания процесса.
Что нам нужно
Кроме gcc, make и прочих стандарнтных сборочных вещей нам нужно kernel-headers-modules-<flavour>(ну и всё что от него зависит). Этот пакет содержит ту частьисходных кодов, заголовочных файлов, make-файлов и скриптов которые необходимы для сборки модулей.
Собственно сборка
Скачав и распоковав исходники модуля мы обнаруживаем, что просто make обычно не работает. Проблема в том что для сборки модуля необходима часть ядра, и эту самую часть make ищет по адресу /lib/modules/<currnet kernel version>/build, и не получает доступ туда, потому что собираем мы от пользователя, а собирать от рута это мовитон. Для этого открываем Makefile и ищем переменную, чтото вроде KSRC или KERNELSOURC обычно идёт в начале и содержит в значении /lib/modules. Далее запускаем сборку например make KSRC=/usr/src/linux-2.6.25-std-def. Обычно модуль после этого собирается.
Собраный модуль можно попробовать загрузить insmod или положить его в другим модулям ядра в /lib/modules/<kernelversion> и загрузить modprobe. Если модуль загрузился и работает можно переходить к следующей части.
Как собрать модуль правильно
Почему предидущий способ неправилен? Потому что недестрибутивен. Для нормальной сборки нам нужно:
Сборка kernel-source-module
Для начала нам стоит собрать пакет с исходниками модуля, этот пакет прост, и фактически содержит в себе только упаковные исходники, а его сборка только в запаковке. Для примера лучше взять что нибудь несложное и готовое, например сделать так
git clone git://git.altlinux.org/people/silicium/packages/kernel-source-heci.git
mkdir kernel-source-module cd kernel-source-module git init-db распакавать исходники git add . git commit -a -m "version" (ну или вариации) git branch -m upstream (чтобы потом докладывать) git checkout -b master cp ../kernel-source-heci/.gear* . cp ../kernel-source-heci/*.spec mv kernel-source-heci.spec kernel-source-module.spec
Редактируем по образу и подобию kernel-source-module.spec там надо обычно заменить имя модуля, версию, описание и чейнджлог, сам процесс сборки обычно можно не трогать.
git add .gear *.spec git commit -a
Далее собираем пакет при помощи gear. В результате в пакете должен быть всего один файл /usr/src/kernel/sources/kernel-source-module.tar.bz2
Обратите внимание что некоторые пакеты с исходниками в своём имени содержат версию. например kernel-source-heci-5.0.0.31-5.0.0.31-alt1. сделано это для того чтобы можно иметь возможность собирать разные весии ядер с разными версиями модулей. Например новые модули не собираются с 2.6.18.