Сборка ядра Linux

From Wiren Board
Revision as of 11:06, 7 March 2025 by Taraant (talk | contribs) (→‎Сборка deb-пакета)

(diff) ← Older revision | Approved revision (diff) | Latest revision (diff) | Newer revision → (diff)

Сборка ядра Linux вручную может понадобиться, например, если нужно включить в ядро модули, отсутствующие в стандартной поставке Wiren Board. Если вы не знаете, для чего вам это нужно, то, скорее всего, вам не нужно собирать ядро вручную.

Начиная с 8 апреля 2021 года, скрипты для сборки deb-пакетов ядра Linux для Wiren Board добавлены в репозиторий с кодом ядра: http://github.com/wirenboard/linux.

Подготовка сборочной машины

Сборка ядра должна производиться на настольном компьютере, ноутбуке или сервере под управлением Linux. Собирать ядро на самом Wiren Board не стоит - у контроллера не хватит дискового пространства для получения репозитория, а также вычислительной мощности. Даже на настольном компьютере сборка ядра может занять десятки минут.

Сборочные скрипты писались с расчётом на дистрибутивы Debian и Ubuntu, инструкции в этой статье приводятся также из расчёта использования этих дистрибутивов.

Для сборки ядра понадобится установить пакеты с необходимым для сборки ПО:

$ sudo apt update && sudo apt install build-essential libncurses5-dev fakeroot lzop bc git bison flex libssl-dev rsync

А также соответствующий компилятор:

$ sudo apt install gcc-arm-linux-gnueabi  # Wiren Board 5
$ sudo apt install gcc-arm-linux-gnueabihf   # Wiren Board 6/7
$ sudo apt install gcc-aarch64-linux-gnu  # Wiren Board 8

Если вы собираете ядро для Wiren Board 6/7, (могут быть нюансы с версией)

Получение исходного кода

Исходный код ядра Linux с правками от команды Wiren Board хранится в репозитории на Github. Чтобы получить его на свой компьютер, выполните команды:

$ git clone https://github.com/wirenboard/linux
$ cd linux
$ git submodule update --init --recursive

Выбор ветки ядра в зависимости от верссии контроллера

После получения исходного кода, необходимо также переключиться на соответствующую версию ядра:

$ git checkout dev/v6.8  # Для Wiren Board 8
$ git checkout dev/v5.10.y  # Для Wiren Board 6/7

Сборка

Все промежуточные и конечные артефакты сборки - объектные файлы, dtb, модули ядра .ko, zImage и т.д. - будут находится в поддиректории .build-wbX, где X зависит от модели контроллера. В этой же директории находится конфигурация ядра (см. ниже).

Чаще всего для использования на контроллере удобней всего собрать deb-пакет с файлами ядра.

Если вам нужны только некоторые бинарные файлы (zImage, модули и dtbs), то после успешной сборки deb-пакета их можно будет найти в сборочной поддиректории .build-wbX.

Сборка deb-пакета

$ make mrproper
$ KERNEL_FLAVOUR=wb6 VERSION_SUFFIX="~my~test~kernel" ./scripts/package/wb/do_build_deb.sh  # Wiren Board 6
$ KERNEL_FLAVOUR=wb7 VERSION_SUFFIX="~my~test~kernel" ./scripts/package/wb/do_build_deb.sh  # Wiren Board 7
$ KERNEL_FLAVOUR=wb8 VERSION_SUFFIX="~my~test~kernel" ./scripts/package/wb/do_build_deb.sh  # Wiren Board 8

Можно поменять значение VERSION_SUFFIX на свой вкус согласно правилам оформления версий пакетов в Debian. Это значение будет добавлено в конец номера версии пакета и поможет отличить собранное вручную ядро от ядра из репозитория Wiren Board.

После сборки в корне появятся файлы пакетов (пример для Wiren Board 6):

  • linux-image-wb6_4.9.22-wb1~my~test~kernel_armhf.deb - образ ядра, модули и dtbs;
  • linux-headers-wb6_4.9.22-wb1~my~test~kernel_armhf.deb - нужен для разработки
  • linux-libc-dev_4.9.22-wb1~my~test~kernel_armhf.deb - нужен для разработки

На контроллер достаточно скопировать файл пакета linux-image-wb6, в нём уже содержится всё необходимое.

Разные модели контроллеров

Модель контроллера KERNEL_FLAVOUR ARCH файл defconfig сборочная директория переменная CROSS_COMPILE файлы dts и dtb
Wiren Board 6 wb6 arm imx6_wirenboard_defconfig .build-wb6 CROSS_COMPILE=arm-linux-gnueabihf- imx6ul-wirenboard6*
Wiren Board 5 и ниже wb2 arm mxs_wirenboard_defconfig .build-wb2 CROSS_COMPILE=arm-linux-gnueabi- imx28-wirenboard5*
Wiren Board 7 wb7 arm wirenboard7_defconfig .build-wb7 CROSS_COMPILE=arm-linux-gnueabihf- sun8i-r40-wirenboard7*
Wiren Board 8 wb8 arm64 wb8.config .build-wb8 CROSS_COMPILE=aarch64-linux-gnu- sun50i-h616-wirenboard*

В зависимости от веток (версий ядра) файлы DTS и конфигураций распологаются в разных каталогах.

Для ядра v6.8:

  • DTS: arch/arm64/boot/dts/allwinner/
  • Config: arch/arm64/configs/

Для ядра v5.11.y:

  • DTS: arch/arm/boot/dts/
  • Config: arch/arm/configs/

Настройка ядра

При запуске скрипт сборки deb-пакета спрашивает, использовать ли конфигурацию по-умолчанию:

$ KERNEL_FLAVOUR=wb7  scripts/package/wb/do_build_deb.sh 
Building kernel packages for wb7 (Wiren Board 7)
Revision: -wb100
Architecture: armhf
Config: wirenboard7_defconfig
.config already present
Use wirenboard7_defconfig instead? (y/N)

Конфигурация по-умолчанюи при этом берётся из файлов в arch/arm/configs/, например imx6_wirenboard_defconfig.

Чтобы поменять конфигурацию, запустите make с необходимыми параметрами:

$ make KBUILD_OUTPUT=.build-wb6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig # для Wiren Board 6
$ make KBUILD_OUTPUT=.build-wb7 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig # для Wiren Board 7
$ make KBUILD_OUTPUT=.build-wb8 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig # для Wiren Board 8

вместо menuconfig можно использовать графический xconfig.

После сохранения, конфигурация заишется в сборочную директорию: .build-wbX/.config.

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

$ KERNEL_FLAVOUR=wb7  scripts/package/wb/do_build_deb.sh

и ответив N, чтобы использовать новую конфигурацию, вместо конфигурации по-умолчанию:

Use wirenboard7_defconfig instead? (y/N)

Когда вы полностью довольны результатом, можно посмотреть изменения относительно исходной версии:

# для Wiren Board 6
$ make KBUILD_OUTPUT=.build-wb6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- savedefconfig # приводит конфигурацию к стандартному виду и записывает в .build-wb6/defconfig
$ diff -u arch/arm/configs/imx6_wirenboard_defconfig .build-wb6/defconfig  # посмотреть её отличия от исходной конфигурации

Чтобы заменить исходную версию настроек своей (например, при подготовке патча или pull request):

# для Wiren Board 6
$ make KBUILD_OUTPUT=.build-wb6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- savedefconfig 
$ cp .build-wb6/defconfig  arch/arm/configs/imx6_wirenboard_defconfig

После этого скрипт do_build_deb.sh будет использовать обновлённую конфигуацию при ответе "y".

Сборка вручную

Этот этап не требуется для стандартных задач. Если вы хотите выполнить вручную какой-либо этап сборки, то можно запустить make вручную.

# для Wiren Board 6
$ make KBUILD_OUTPUT=.build-wb6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs modules -j4

(-j4 запускает сборку в 4 потока, можно это убрать или поменять значение на более подходящее вашему компьютеру, идеальное значение - количество ядер CPU)

В результате появятся нужные нам файлы:

  • .build-wb6/arch/arm/boot/zImage - образ ядра, который нужно скопировать в /boot/zImage на контроллере;
  • .build-wb6/arch/arm/boot/dtb/* - файлы device tree, используемые для настройки оборудования при запуске, копируются в директорию /boot/dtbs/.

Файлы модулей можно найти с помощью команды:

$ find . -name '*.ko'

Далее файлы модулей копируются на контроллер в директорию /lib/modules/<версия ядра>/kernel/ с сохранением исходного пути, как было при сборке.