OutOfTreeKernelModule
Введение
Поводом для написания данной статьи послужила работа по сборке модуля с драйвером для 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 взял из
В шаблоне используются параметры 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 взял из
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