Дата и время публикации: Дата и время редакции:
Проблема и решение
1.Проблема
Современные дистрибутивы имеют предустановленные общие варианты настройки ядра, которые включают в себя все возможные решения всех проблем и требования для выбранной архитектуры вместе с технической платформой, задаваемые конфигурационным файлом по умолчанию (англ. Default kernel config), имеющий обычно постфикс _defconfig . Так, например, для архитектуры x86, в настоящее время, определены два таких файла:
- для 32-х разрядных платформ – i386_defconfig,
- для 64-х разрядных платформ – x86_64_defconfig .
Кроме того, файлы defconfig полностью или их фрагментарная часть используются для настройки конфигурации ядра linux в окружении сборочной машины Yocto/poky, которая собирает свой собственный дистрибутив Linux для встраиваемых решений для архитектуры x86, так и различных технических платформ на базе архитектуры ARM и т.п.
Для загрузки и компиляции исходного кода ядра Linux (англ. Linux Kernel Source, LKS) понадобятся следующие мета-пакеты:
- build-essential – мета пакет, устанавливающий нужные пакеты, удовлетворяющие сборку и компиляцию LKS;
- linux-source – сами LKS;
- libncurses-dev – файлы разработки (англ. Development files) библиотеки ncurses, содержащие заголовочные и иные необходимые файлы данных и конфигурации, используемые для сборки конфигурационного меню, вызываемого командой menuconfig .
А так же обязательные пакеты, такие как bison, bc, kmod, cpio, flex и cpio, большинство из которых устанавливаются с использованием мета-пакетом gnulib или отсутствуют в зависимостях выше перечисленных пакетов.
2.Решение
Производим установку с использованием apt(8) выше, как показано в дампе 2.1
Дамп 2.1
user@home2:~$ sudo apt install build-essential linux-source \ > bc kmod cpio flex cpio libncurses-dev > libelf-dev libssl-dev:native rsync
В рабочей директории пользователя $HOME/build распаковать LKS, которые можно найти в архивном файле /usr/src/linux-source-x.x.tar.xz , где x.x – версия ядра, установленая с помощью мета-пакета linux-source , определить которую можно, как показано в дампе 2.2
Дамп 2.2
user@home2:~$ dpkg -l | grep linux-source- ii linux-source-5.4 5.4.8-1 all Linux kernel source for version 5.4 with Debian patches
Из которого видно, что в данном случае были установлены исходники версии 5.4 , что соответствует архивному файлу /usr/src/linux-source-x.x.tar.xz , который следует распаковать в рабочую директории пользователя и перейти в $HOME/build/usr/src/linux-source-x.x, как показано в дампе 2.3
Дамп 2.3
user@home2:~$ mkdir Build && cd Build && \ tar xavf /usr/src/linux-source-5.4.tar.xz && \ cd linux-source-5.4/
Затем, создаем файл конфигурации c использованием файла defconfig, как показано в дампе 2.4
Дамп 2.4
user@home2:~/Build/linux-source-5.4$ make ARCH=$(uname -m) defconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o HOSTCC scripts/kconfig/confdata.o HOSTCC scripts/kconfig/expr.o LEX scripts/kconfig/lexer.lex.c YACC scripts/kconfig/parser.tab.[ch] HOSTCC scripts/kconfig/lexer.lex.o HOSTCC scripts/kconfig/parser.tab.o HOSTCC scripts/kconfig/preprocess.o HOSTCC scripts/kconfig/symbol.o HOSTLD scripts/kconfig/conf *** Default configuration is based on 'x86_64_defconfig' # # configuration written to .config #
Но, более предпочтительным будет использовать конфигурацию от ядра Debian-built, которое прежде должно быть скопировано из файла /boot/config-$(uname r) в .config , а затем, ответить на дополнительно возникшие вопросы, если ответы на них отсутствуют из-за расхождения в версии ядра, как показано в дампе 2.4.1
Дамп 2.4.1
user@home2:~/Build/linux-source-5.4$ make oldconfig
Также, для уточнение некоторых вопросов, можно использовать make menuconfig, как показано в дампе 2.5
Дамп 2.5
user@home2:~/Build/linux-source-5.4$ make menuconfig
В результате должна быть отобразится псевдографический интерфейс на базе ncurses, как показано на рисунке 2.6
Рисунок 2.6
Затем, кроме 5-й версии ядра, необходимо позаботится о том, чтобы для измененной конфигурации были сброшены доверенные ключи, как показано в дампе 2.7
Дамп 2.7
CONFIG_SYSTEM_TRUSTED_KEYS = ""
Но, лучше создать директорию debian/certs/, а в ней файл конфигурации ключа протокола x509, как показано в дампе 2.8
Дамп 2.8
user@home2:~/Build/linux-source-5.4$ mkdir -p debian/certs/ && nano debian/certs/debian-uefi-certs.pem.x509.genkey [ req ] default_bits = 4096 distinguished_name = req_distinguished_name prompt = no string_mask = utf8only x509_extensions = myexts [ req_distinguished_name ] CN = Out of tree build key [ myexts ] basicConstraints=critical,CA:FALSE keyUsage=digitalSignature subjectKeyIdentifier=hash authorityKeyIdentifier=keyid
Сгенерировать пару приватный/публичный ключ, как показано в дампе 2.9
Дамп 2.8
user@home2:~/Build/linux-source-5.4$ openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 \ > -config debian/certs/debian-uefi-certs.pem.x509.genkey -outform PEM -out debian/certs/debian-uefi-certs.pem \ > -keyout debian/certs/debian-uefi-certs.pem Generating a RSA private key ...
Иначе, сборка может закончится отказом, как показано в дампе 2.9
Дамп 2.9
make[4]: *** No rule to make target 'debian/certs/test-signing-certs.pem', needed by 'certs/x509_certificate_list'. Stop. make[4]:Waiting for unfinished jobs....
Cборка ядра запускается командой, показанной в дампе 2.10
Дамп 2.10
user@home2:~/Build/linux-source-5.4$ make -j$(nproc)
Где опция -j$(nproc) указывается количество задействованных ядер. После успешного завершения компиляции ядра запустить сборку пакетов, как показано в дампе 2.11
Дамп 2.11
user@home2:~/Build/linux-source-5.4$ make -j$(nproc) bindeb-pkg sh ./scripts/package/mkdebian dpkg-buildpackage -r"fakeroot -u" -a$(cat debian/arch) -b -nc -uc dpkg-buildpackage: инфо: пакет исходного кода linux-5.4.8 dpkg-buildpackage: инфо: версия исходного кода 5.4.8-3 dpkg-buildpackage: инфо: дистрибутив исходного кода sid dpkg-buildpackage: инфо: исходный код изменён userdpkg-buildpackage: инфо: архитектура узла amd64 dpkg-source --before-build . debian/rules build make KERNELRELEASE=5.4.8 ARCH=x86 KBUILD_BUILD_VERSION=3 -f ./Makefile ...
После успешного завершения, в данном случае VERSION=5.4.8-3, ARCH=amd64, в родительской директории должны быть сформированы пакеты deb, как показано в дампе 2.12
Дамп 2.12
user@home2:~/Build/linux-source-5.4/ $ ls -la ../ итого 59840 -rw-r--r-- 1 user user 4762 янв 20 09:01 linux-5.4.8_5.4.8-3_amd64.buildinfo -rw-r--r-- 1 user user 2123 янв 20 09:01 linux-5.4.8_5.4.8-3_amd64.changes -rw-r--r-- 1 user user 11530904 янв 20 08:51 linux-headers-5.4.8_5.4.8-3_amd64.deb -rw-r--r-- 1 user user 48563656 янв 20 08:51 linux-image-5.4.8_5.4.8-3_amd64.deb -rw-r--r-- 1 user user 748627516 янв 20 09:00 linux-image-5.4.8-dbg_5.4.8-3_amd64.deb -rw-r--r-- 1 user user 1066980 янв 20 08:51 linux-libc-dev_5.4.8-3_amd64.deb ...
3. Библиография
3.1 Debian Wiki. BuildADebianKernelPackage
3.2 Dinosaurs Are Forever. Signed kernel modules using an auxiliary key
3.3 apt(8)