× К оглавлению На главную Об авторе

Дата и время публикации:
Дата и время редакции:

Проблема и решение

1.Проблема

Современные дистрибутивы имеют предустановленные общие варианты настройки ядра, которые включают в себя все возможные решения всех проблем и требования для выбранной архитектуры вместе с технической платформой, задаваемые конфигурационным файлом по умолчанию (англ. Default kernel config), имеющий обычно постфикс _defconfig . Так, например, для архитектуры x86, в настоящее время, определены два таких файла:

Кроме того, файлы defconfig полностью или их фрагментарная часть используются для настройки конфигурации ядра linux в окружении сборочной машины Yocto/poky, которая собирает свой собственный дистрибутив Linux для встраиваемых решений для архитектуры x86, так и различных технических платформ на базе архитектуры ARM и т.п.

Для загрузки и компиляции исходного кода ядра Linux (англ. Linux Kernel Source, LKS) понадобятся следующие мета-пакеты:

А так же обязательные пакеты, такие как 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: инфо: исходный код изменён user 
dpkg-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)