Сборка модулей ядра

Материал из ALT Linux Wiki

(Различия между версиями)
Перейти к: навигация, поиск
(Как собрать модуль правильно)
Строка 43: Строка 43:
Собранный модуль можно попробовать загрузить с помощью {{cmd|insmod}}, или положить его к другим модулям ядра в {{path|/lib/modules/<kernelversion>}} и загрузить {{cmd|modprobe}}. Если модуль загрузился и работает, то можно переходить к следующей части.
Собранный модуль можно попробовать загрузить с помощью {{cmd|insmod}}, или положить его к другим модулям ядра в {{path|/lib/modules/<kernelversion>}} и загрузить {{cmd|modprobe}}. Если модуль загрузился и работает, то можно переходить к следующей части.
-
== Как собрать готовый модуль из шаблона ==
+
== Как собрать модуль правильно ==
-
Почему предыдущий способ неправилен? Потому что недистрибутивен. Для нормальной сборки нам нужны:
+
Почему предыдущий способ не является правильным? Потому что он недистрибутивен.
 +
Для нормальной сборки нам нужны:
* знание [[git]] (крайне желательно хотя бы начальное знание!)
* знание [[git]] (крайне желательно хотя бы начальное знание!)
* умение пользоваться [[gear]] и [[hasher]]
* умение пользоваться [[gear]] и [[hasher]]
-
* настроенный hasher
+
* настроенный [[hasher]]
* доступ на [[git.alt]] (для публикации результатов)
* доступ на [[git.alt]] (для публикации результатов)
* достаточно терпения
* достаточно терпения
-
 
-
== Сборка нового модуля ==
 
-
=== Сборка kernel-source-module ===
 
-
Для начала нам стоит собрать пакет с исходниками модуля. Этот пакет прост, и фактически содержит в себе только упакованные исходники, а его сборка состоит только в запаковке. Для примера лучше взять что нибудь несложное и готовое, например, сделать так:
 
-
<code>
 
-
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
 
-
</code>
 
-
Редактируем по образу и подобию <tt>kernel-source-''module''.spec</tt> — обычно там надо заменить имя модуля, версию, описание и changelog, а сам процесс сборки обычно можно не трогать.
 
-
<code>
 
-
git add .gear *.spec
 
-
git commit -a
 
-
</code>
 
-
Далее собираем пакет при помощи [[gear]]. В результате в пакете должен оказаться всего один файл, а именно <tt>/usr/src/kernel/sources/kernel-source-''module''.tar.bz2</tt>
 
-
 
-
Обратите внимание на то, что некоторые пакеты с исходниками в своём '''имени''' содержат '''версию''', например, <tt>kernel-source-heci-5.0.0.31-5.0.0.31-alt1</tt>. Это сделано для того, чтобы можно было иметь возможность собирать разные версии ядер с разными версиями модулей (например, новые модули не собираются с 2.6.18).
 
=== Шаблоны ===
=== Шаблоны ===
Строка 82: Строка 57:
подгоняет этот шаблон к конкретному ядру (в том числе вычисляет релиз модуля) и собирает пакет
подгоняет этот шаблон к конкретному ядру (в том числе вычисляет релиз модуля) и собирает пакет
с модулем. Сами шаблоны хранятся в git-репозитории, в котором есть множество веток, ветки
с модулем. Сами шаблоны хранятся в git-репозитории, в котором есть множество веток, ветки
-
с шаблонами называются <tt>template/''module''/''distro''</tt>, где ''module'' — это
+
с шаблонами называются <tt>template/''module''/''distro''</tt>, где ''module'' это
-
собственно название модуля (например, <tt>nvidia</tt>) а ''distro'' — это то, подо что
+
собственно название модуля (например, <tt>nvidia</tt>) а ''distro'' это то, подо что
мы собираем. Обычно это <tt>sisyphus</tt>, но, поскольку для разных бранчей шаблоны
мы собираем. Обычно это <tt>sisyphus</tt>, но, поскольку для разных бранчей шаблоны
приходиться менять, можно установить поле ''distro'' в соответствующее значение.
приходиться менять, можно установить поле ''distro'' в соответствующее значение.
Строка 141: Строка 116:
это вручную.
это вручную.
-
== dead ==
+
== Сборка нового модуля ==
-
 
+
=== Сборка kernel-source-module ===
-
После этого нам нужно создать новую ветку в репозитории с модулями:
+
Для начала нам стоит собрать пакет с исходниками модуля. Этот пакет прост, и фактически содержит в себе только упакованные исходники, а его сборка состоит только в запаковке. Для примера лучше взять что нибудь несложное и готовое, например, сделать так:
<code>
<code>
-
  cd modules
+
  git clone git://git.altlinux.org/people/silicium/packages/kernel-source-heci.git
-
  git checkout -b template/'''module'''/sisyphus origin/template/heci/sisyphus
+
mkdir kernel-source-''module''
-
  rm -f SOURCES/*
+
cd kernel-source-''module''
-
  mv kernel-modules-heci.spec kernel-modules-'''module'''.spec
+
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
</code>
</code>
-
, где '''module''' - название вашего модуля.
+
Редактируем по образу и подобию <tt>kernel-source-''module''.spec</tt> — обычно там надо заменить имя модуля, версию, описание и changelog, а сам процесс сборки обычно можно не трогать.
-
 
+
-
Теперь редактируем спек, меняем: имя, версию, описания, чейнджлог, возможно надо будет поправить опции для сборки. И коммитим.
+
<code>
<code>
-
  git add *.spec
+
  git add .gear *.spec
  git commit -a
  git commit -a
</code>
</code>
 +
Далее собираем пакет при помощи [[gear]]. В результате в пакете должен оказаться всего один файл, а именно <tt>/usr/src/kernel/sources/kernel-source-''module''.tar.bz2</tt>
-
== Как выложить модуль в репозиторий ==
+
Обратите внимание на то, что некоторые пакеты с исходниками в своём '''имени''' содержат '''версию''', например, <tt>kernel-source-heci-5.0.0.31-5.0.0.31-alt1</tt>. Это сделано для того, чтобы можно было иметь возможность собирать разные версии ядер с разными версиями модулей (например, новые модули не собираются с 2.6.18).
-
Для начала необходимо у себя в git создать репозиторий и залить <tt>kernel-source-''module''</tt>:
+
 
-
<code>
+
=== Создание нового шаблона ===
-
  ssh git.alt init-db kernel-source-''module''
+
 
-
  cd kernel-source-''module''
+
После сборки пакета с искодными кодами модуля, нам нужно создать новую ветку в репозитории с модулями:
-
  git remote add public git.alt:packages/kernel-source-''module''.git
+
$ cd modules
-
  git push --all public
+
$ git checkout -b template/''module''/sisyphus origin/template/heci/sisyphus
-
</code>
+
$ rm -f SOURCES/*
-
Потом - выложить <tt>kernel-modules</tt>
+
$ mv kernel-modules-heci.spec kernel-modules-''module''.spec
-
<code>
+
где ''module'' — название вашего модуля.
-
  ssh git.alt clone /people/silicium/packages/kernel-modules
+
 
-
  cd kernel-build-scripts/modules
+
Теперь редактируем спек, меняем: имя, версию, описания, чейнджлог, возможно надо будет поправить опции для сборки. И коммитим:
-
  git remote add public git.alt:packages/kernel-modules.git
+
$ git add *.spec && git commit -a
-
  git push --all public
+
 
-
</code>
+
=== Как выложить свой модуль в репозиторий ===
 +
Выкладывание модулей ничем не отличается от выкладывания обычных пакетов.
 +
 
 +
Выкладываем исходники:
 +
  $ ssh git.alt init-db kernel-source-''module''
 +
  $ cd kernel-source-''module''
 +
  $ git remote add public git.alt:packages/kernel-source-''module''.git
 +
  $ git push --all public
 +
 
 +
Выкладываем собственно модуль:
 +
  $ ssh git.alt init-db kernel-modules
 +
  $ cd modules
 +
  $ git remote add public git.alt:packages/kernel-modules.git
 +
  $ git push --all public
Осталось собрать пакеты через [[git.alt]].
Осталось собрать пакеты через [[git.alt]].
-
'''Важное замечание:''' для того чтобы сборка прошла правильно, kernel-source-''module'' должен быть собран до сборки kernel-modules-''module''.
+
'''Важное замечание:''' для того чтобы сборка прошла правильно, kernel-source-''module''
 +
должен быть собран до сборки kernel-modules-''module''.
== Рекомендации по взаимодействию с мейнтейнерами ядер ==
== Рекомендации по взаимодействию с мейнтейнерами ядер ==

Версия 12:32, 24 июня 2009

Содержание

Модули ядра

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

Модули могут подключаться к ядру по команде пользователя (modprobe, insmod) или автоматически при помощи udev, и быть выгружены либо самим ядром, либо командой rmmod.

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

О модулях и названиях

Поскольку в репозитории может быть множество ядер, модули собираются особым способом: имеется пакет с исходными кодами модуля, и пакеты с модулями, собранным для конкретного ядра. При этом SRPM последних содержит только .spec и патчи, а исходные коды получает по сборочным зависимостям. Таким образом, для модуля module и варианта ядра flavour у нас имеются пакеты с именами

  • kernel-source-module — содержит только исходники
  • kernel-modules-module-flavour — модуль module, собранный для ядра flavour (например, kernel-modules-nvidia-std-def)

Поле release пакетов с модулями заполняется так: alt<module_release>.<kernel_version>.<kernel_release>, где

  • <module_release> — релиз собственно модуля, то есть, если мы обновили именно модуль, то это поле изменяется;
  • <kernel_version> — версия ядра в формате 65535*major + 256 * mid + minor, то есть 2.6.25=132633. Не пугайтесь, это число рассчитывает скрипт, описанный позже;
  • <kernel_release> — релиз пакета с ядром.

К примеру, модуль с 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 обычно не работает. Эта проблема специфична для Sisyphus/ALT Linux и состоит в том, что для сборки модуля необходимы заголовки ядра, которые ищутся в каталоге /lib/modules/<currnet kernel version>/build, но не могут быть найдены там, потому что в ALT Linux и Sisyphus доступ пользователям в /lib/modules/ запрещён.

Для того, чтобы обойти эту проблему, нужно переопределить переменную (обычно KERNELSOURCE или KSRC) в Makefile. Далее запускаем сборку, например make KSRC=/usr/src/linux-2.6.25-std-def. Обычно модуль после этого собирается.

Собранный модуль можно попробовать загрузить с помощью insmod, или положить его к другим модулям ядра в /lib/modules/<kernelversion> и загрузить modprobe. Если модуль загрузился и работает, то можно переходить к следующей части.

Как собрать модуль правильно

Почему предыдущий способ не является правильным? Потому что он недистрибутивен. Для нормальной сборки нам нужны:

  • знание git (крайне желательно хотя бы начальное знание!)
  • умение пользоваться gear и hasher
  • настроенный hasher
  • доступ на git.alt (для публикации результатов)
  • достаточно терпения

Шаблоны

Поскольку править спеки каждого пакета с модулями для каждой версии ядра несколько глупо, была разработана схема, при которой для каждого модуля создается шаблон, а специальный скрипт подгоняет этот шаблон к конкретному ядру (в том числе вычисляет релиз модуля) и собирает пакет с модулем. Сами шаблоны хранятся в git-репозитории, в котором есть множество веток, ветки с шаблонами называются template/module/distro, где module — это собственно название модуля (например, nvidia) а distro — это то, подо что мы собираем. Обычно это sisyphus, но, поскольку для разных бранчей шаблоны приходиться менять, можно установить поле distro в соответствующее значение. Обычно используется alt-linux-X.Y для branch/X.Y (например, alt-linux-4.1 для branch/4.1).

Подготовка рабочей директории

Нам потребуются утилиты для сборки модулей из пакета kernel-build-tools:

# apt-get update && apt-get install kernel-build-tools

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

$ mkdir ~/build-modules && cd ~/build-modules
$ ln -s <репозиторий с ядром> kernel
$ ln -s <репозиторий с модулями> modules

При поиске репозиториев на git.alt нужно знать, что

  • репозитории с модулями обычно называются kernel-modules
  • репозитории с ядром обычно называются kernel-image
  • старые репозитории с ядрами могут называться kernel-image-version

Примеры:

$ git clone git://git.altlinux.org/people/silicium/packages/kernel-modules.git
$ git clone git://git.altlinux.org/people/shrek/packages/kernel-image.git
$ git clone git://git.altlinux.org/people/aspsk/packages/kernel-image-2.6.18.git

Сборка модуля из шаблона

Сборка модуля из шаблона происходит в рабочей директории. Для сборки модуля module под flavour std-def с помощью hasher можно использовать команду

$ buildmodules -k std-def module

Если хочется собрать такой же модуль под другую архитектуру, например под i586, то следует использовать команду

$ buildmodules --target i586 --hsh-options='--apt-conf .../i586/apt.conf' -k std-def module

где .../i586/apt.conf — соответствующий конфигурационный файл для apt.

Если не указывать список модулей, то для каждого указанного flavour будет предпринята попытка собрать все модули, указанные в файле modules.build из ядерного бранча kernel-image-flavour.

Логи сборки складываются в out/logs/kernel-modules-module-flavour.log.

Подробнее про опции скрипта buildmodules (и других) можно прочитать в файле README.ru.koi8 из репозитория kernel-build-tools.

Сборка модулей на git.alt

При сборке пакета на git.alt необходимо указать пару (репозиторий, тэг). Для (полу)автоматического обновления модулей в Сизифе можно использовать скрипт updatemodules.

Для данного темплейта этот скрипт обновляет бранчи для указанных flavour. Например, команда

$ updatemodules -k ovz-rhel

обновит бранчи для модулей, указанных в файле kernel-image-ovz-rhel:modules.build, создаст для них подписанные тэги и положит их в файл out/taglist в рабочей директории.

После этого можно запушить полученные бранчи и тэги на git.alt.

$ cd modules && git push --all && git push --tags && cd -

и добавить список модулей к последнему task'у:

$ for tag in $(cat out/taglist); do ssh git.alt task add repo packages/kernel-modules.git $tag; done

Следует, однако, учитывать, что updatemodules не затирает файл out/taglist и вам нужно делать это вручную.

Сборка нового модуля

Сборка 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 — обычно там надо заменить имя модуля, версию, описание и changelog, а сам процесс сборки обычно можно не трогать.

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).

Создание нового шаблона

После сборки пакета с искодными кодами модуля, нам нужно создать новую ветку в репозитории с модулями:

$ cd modules
$ git checkout -b template/module/sisyphus origin/template/heci/sisyphus
$ rm -f SOURCES/*
$ mv kernel-modules-heci.spec kernel-modules-module.spec

где module — название вашего модуля.

Теперь редактируем спек, меняем: имя, версию, описания, чейнджлог, возможно надо будет поправить опции для сборки. И коммитим:

$ git add *.spec && git commit -a

Как выложить свой модуль в репозиторий

Выкладывание модулей ничем не отличается от выкладывания обычных пакетов.

Выкладываем исходники:

$ ssh git.alt init-db kernel-source-module
$ cd kernel-source-module
$ git remote add public git.alt:packages/kernel-source-module.git
$ git push --all public

Выкладываем собственно модуль:

$ ssh git.alt init-db kernel-modules
$ cd modules
$ git remote add public git.alt:packages/kernel-modules.git
$ git push --all public

Осталось собрать пакеты через git.alt.

Важное замечание: для того чтобы сборка прошла правильно, kernel-source-module должен быть собран до сборки kernel-modules-module.

Рекомендации по взаимодействию с мейнтейнерами ядер

Для нормальной совместной работы рекомендуется:

  • Оповестить мейнтейнеров ядер (в списке рассылки devel-kernel), о том что есть ваш модуль,
  • При обновлении модуля обновлять сборки под максимальное количество ядер,
  • Настроить git remote на kernel-modules других мейнтейнеров,
  • В спеках kernel-modules- поле Packager установить в Kernel Maintainers team.

Про symvers и модули зависящие от других модулей

Иногда бывает, что пакет с модулями, должен собираться под другой пакет с модулями. Так например просиходит с gspca и v4l. Для нормальной сборки нам нужно 2 вещи: во-первых, проставить правильно зависимости на headers (у v4l есть свои хедеры), во-вторых, нужно импортировать файл с symvers. В gscpca проблема решилась добавлением следующей строчки в %prep фазу пакета с модулем gspca:

cat /usr/src/linux-%kversion-%flavour-%krelease/kernel-modules-v4l.symvers > Module.symvers


 
Личные инструменты