OutOfTreeKernelModule

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


Введение

Поводом для написания данной статьи послужила работа по сборке модуля с драйвером для USB WiFi адаптера TL-WN821N.

Основным источником информации является статья

https://www.altlinux.org/Сборка_модулей_ядра

Однако, в процессе работы выявилось много не очевидных моментов, которыми хотелось бы поделиться.

Надеюсь, что эта статья будет полезна.

Сборка out-of-tree модуля после сборки ядра, используя сборочный каталог ядра в hasher

Описание задачи: У нас есть ядро и out-of-tree модуль в виде исходников. Нужно собрать и то и другое.

Собрать ядро локально в hasher, чтобы после сборки hasher ничего не удалял в сборочном чруте, поскольку оно понадобится для сорки модуля, можно командой:

gear -v --hasher -- hsh -v --with-qemu=mipsel --target=mipsel --apt-config=/etc/apt/apt.conf.sisyphus.mipsel --lazy-cleanup ~/tmp/hasher

Затем перенести исходники драйвера в сборочницу hasher

~/tmp/hasher/chroot/.in]$ git clone ~/proj/driver-rtl8192eu/rtl8192eu-linux
~]$ hsh-shell ~/tmp/hasher

Каталог .in для сборки не подходит - у пользователя builder нет прав на запись. Нужно перенести в /usr/src/, который является домашним каталогом builder.

cp -R /.in/rtl8192eu-linux .

Сборка:

cd rtl8192eu-linux/
make KSRC=/usr/src/RPM/BUILD/kernel-image-<flavor>-<version>

Если выдаются предупреждения вида:

WARNING: "cfg80211_del_sta" [/usr/src/rtl8192eu-linux/8192eu.ko] undefined!

то есть проблема - нужные для сборки этого модуля части ядра (в данном случае модуль cfg80211.ko) не были собраны.

При загрузке модуля эта проблема проявляется так:

insmod: ERROR: could not insert module 8192eu.ko: Unknown symbol in module
dmesg
[ 3284.471883] 8192eu: Unknown symbol cfg80211_del_sta (err 0)

Следует включить нужное в конфигурации ядра (в данном случае CONFIG_CFG80211=m), пересобрать ядро и только после этого собирать модуль.

Нужно установить собранное ядро:

Прописать путь к пакету с ядром в конфигурации apt, например:

rpm-dir file:/home/user/repo mipsel hasher

Подать команды

apt-get update
apt-cache pkgnames kernel-image

Найти нужный пакет в списке.

update-kernel -r <version>-<release>@<disttag>

и перезагрузить машину.

Собранный модуль нужно скопировать в соответсвующий каталог, в данном случае

/lib/modules/<version>-<flavor>-<release>/kernel/net/wireless

подать команду

depmod -a

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

Сборка out-of-tree модуля для ядра из репо, используя пакет kernel-headers-modules-<flavor>

Описание задачи: У нас есть ядро в репо и out-of-tree модуль в виде исходников. Нужно собрать локально модуль для этого ядра.

Установить пакет с заголовками от установленного в системе ядра

apt-get update
apt-get install kernel-headers-modules-<flavor>

Собрать модуль

cd rtl8192eu-linux/
make KSRC=/usr/src/linux-<version>-<flavor>

Собранный модуль нужно скопировать в соответсвующий каталог, в данном случае

/lib/modules/<version>-<flavor>-<release>/kernel/net/wireless

подать команду

depmod -a

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

Сборка исходников out-of-tree модуля и самого модуля в репо по шаблону

Описание задачи: У нас есть ядро в репо и out-of-tree модуль в виде исходников. Нужно:

Собрать пакет исходных кодов драйвера в репо

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

Собрать пакет исходных кодов драйвера в репо

Делаем по процедуре:

https://www.altlinux.org/Сборка_модулей_ядра#Сборка_нового_модуля

За образец предлагается взять git.altlinux.org/gears/k/kernel-source-kdbus.git

git clone  git://git.altlinux.org/gears/k/kernel-source-kdbus.git
git checkout --track remotes/origin/p8

Создать каталог для будущего gear репозитория пакета с исходниками

mkdir kernel-source-rtl8192eu

Скопировать все из rtl8192eu-linux в kernel-source-rtl8192eu

Это уже git репо. Назвал ветку upstream

git branch -m upstream

Свои изменения буду вносить в новую ветку

git checkout -b master

Образцы файлов

cp kernel-source-kdbus/.gear* .
cp kernel-source-kdbus/*.spec .
mv kernel-source-kdbus.spec kernel-source-rtl8192eu.spec

Отредактировал kernel-source-rtl8192eu.spec в соответствии с данными, указанными для драйвера.

Name: kernel-source-rtl8192eu
Version: 5.2.19.1
Release: alt1
Summary: Realtek rtl8192eu official Linux driver
License: MIT
Group: Development/Kernel
URL: https://github.com/clnhub/rtl8192eu-linux
...
%description
This driver is based on the (latest) official Realtek v5.2.19.1 driver
with fixes and improvements to support the latest kernels (up to 5.1).
...


apt-get install kernel-build-tools
add_changelog kernel-source-rtl8192eu.spec


git add .gear* *.spec
gear-commit -a
gear -v --hasher -- hsh -v --with-qemu=mipsel --target=mipsel --apt-config=/etc/apt/apt.conf.sisyphus.mipsel ~/tmp/hasher

Пакет с исходниками модуля создан.

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

Создать новый шаблон для создания пакета с модулем. За образец взял template/kdbus/sisyphus:

git clone -b template/ipset/sisyphus http://git.altlinux.org/people/boyarsh/packages/kernel-modules.git
git checkout -b template/rtl8192eu/sisyphus origin/template/kdbus/sisyphus
mv kernel-modules-kdbus.spec kernel-modules-rtl8192eu.spec

Прошу обратить внимание на название ветки git-репозитория, содержащей шаблон. Оно имеет вид:

template/<module name>/<branch name>

<branch name> - название ветки репозитория пакетов, в которой будет использоваться данный шаблон, например sisyphus или p9.

Отредактировал kernel-modules-rtl8192eu.spec в соответствии с данными, указанными для драйвера.

%define module_name     rtl8192eu
%define module_version  5.2.19.1
%define module_release  alt1
...
Summary: Realtek rtl8192eu official Linux driver
...
License: MIT
...
%description
This driver is based on the (latest) official Realtek v5.2.19.1 driver
with fixes and improvements to support the latest kernels (up to 5.1).
...

Как оказалось, этот образец от 2015 г. не очень хорош - в нем не хватало 2-х важных вещей:

- правильной прописи karch

- указания эпохи kepoch для версии kernel-headers-modules

Желательно брать за образец что-нибудь поновее.

Пример для karch взял из

http://git.altlinux.org/people/boyarsh/packages/kernel-modules.git?p=kernel-modules.git;a=blob;f=.gear/rules;h=c70d22add132159867caaa7ab3637031c9f04320;hb=ea8341be69ace8002557b1b5d9d93f92756098c7#l1

http://git.altlinux.org/people/boyarsh/packages/kernel-modules.git?p=kernel-modules.git;a=blob;f=kernel-modules-zfs.spec;h=c6110f27c97b1408ac03b4ee1216e418a6ecac3a;hb=ea8341be69ace8002557b1b5d9d93f92756098c7#l6

В шаблоне используются параметры kflavour и karch, получаемые с помощью gear-specsubst.

При локальном тестировании сборки модуля по шаблону в hasher их нужно указать так:

git config --add gear.specsubst.kflavour mitx-def
git config --add gear.specsubst.karch mipsel

Они должны быть прописаны в .gear/rules так:

specsubst: kflavour karch

В spec должно быть определение вида:

%define flavour @kflavour@
%define karch @karch@

Пример для kepoch взял из

http://git.altlinux.org/people/boyarsh/packages/kernel-modules.git?p=kernel-modules.git;a=blob;f=kernel-modules-ipset.spec;h=732e5a50158505be47b48faed217803a473e5ffa;hb=template/ipset/sisyphus#l24

BuildRequires: kernel-headers-modules-%flavour = %kepoch%kversion-%krelease

Команду сборки исправил, сделал, как при локальной сборке:

%build
%make_build KSRC=%_usrsrc/linux-%kversion-%flavour

Был создан патч для удаления в файле kernel-source-rtl8192eu-5.2.19.1/core/rtw_debug.c строки

       RTW_PRINT_SEL(sel, "build time: %s %s\n", __DATE__, __TIME__);

Был создан тэг:

km-create-tag -k mitx-def rtl8192eu -a 'mipsel'
...
gear-create-tag: Created tag "sisyphus/kernel-modules-rtl8192eu-mitx-def-5.2.19.1-alt1"

Как выяснилось позденее тэг не обязателен.

Нужен параметр --commit, даже если не было никаких изменений:

gear -v --commit --hasher -- hsh -v --with-qemu=mipsel --target=mipsel --apt-config=/etc/apt/apt.conf.sisyphus.mipsel ~/tmp/hasher

Пакет kernel-modules-rtl8192eu-mitx-def-5.2.19.1-alt1.201484.7.mipsel.rpm собрался.

Опубликовал gear репо и собрал пакеты с помощью сборочницы.

ssh e-git.sec init-db packages/kernel-source-rtl8192eu
git remote add mipsel ssh://e-git.sec/people/jqt4/packages/kernel-source-rtl8192eu.git
git push mipsel master
gear-create-tag
git push mipsel "5.2.19.1-alt1"
ssh e-gyle.sec build --commit -b sisyphus_mipsel packages/kernel-source-rtl8192eu.git 5.2.19.1-alt1
task #32021: added #100: build tag "5.2.19.1-alt1" from /people/jqt4/packages/kernel-source-rtl8192eu.git
2019-Jul-10 14:26:07 :: task #32021 for sisyphus_mipsel DONE
ssh e-git.sec init-db packages/kernel-modules
kernel-modules]$ git remote add mipsel ssh://e-git.sec/people/jqt4/packages/kernel-modules.git
kernel-modules]$ git push mipsel template/rtl8192eu/sisyphus
kernel-modules]$ git push mipsel "sisyphus/kernel-modules-rtl8192eu-mitx-def-5.2.19.1-alt1"
ssh e-gyle.sec build --test-only -b sisyphus_mipsel packages/kernel-modules.git "sisyphus/kernel-modules-rtl8192eu-mitx-def-5.2.19.1-alt1"
task #32025: added #100: build tag "sisyphus/kernel-modules-rtl8192eu-mitx-def-5.2.19.1-alt1" from /people/jqt4/packages/kernel-modules.git
...
id=32025 locked=no shared=no fail_early=yes test_only=yes repo=sisyphus_mipsel owner=jqt4 state=TESTED try=2 iter=1

После тестирования собрал модуль в репо:

ssh e-gyle.sec task run --commit 32025