Сборка ядра v2

Материал из Wiren Board

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

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


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

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

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

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

$ sudo apt update && sudo apt install build-essential libncurses5-dev fakeroot lzop bc git

Если вы собираете ядро для Wiren Board 6 и новее, нужно установить компилятор для arm-linux-gnueabihf:

$ sudo apt install gcc-arm-linux-gnueabihf

Для Wiren Board 5 и более старых понадобится другой компилятор:

$ sudo apt install gcc-arm-linux-gnueabi

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

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

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

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

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

$ make ARCH=arm wirenboard7_defconfig  # для Wiren Board 7.x
$ make ARCH=arm imx6_wirenboard_defconfig  # для Wiren Board 6.x
$ make ARCH=arm mxs_wirenboard_defconfig  # для Wiren Board 5 и более старых

Можно отредактировать конфигурацию ядра с помощью menuconfig:

$ make ARCH=arm menuconfig

Чтобы посмотреть, какие настройки изменились относительно исходной версии, выполните команды:

$ make ARCH=arm savedefconfig
$ diff -u arch/arm/configs/imx6_wirenboard_defconfig defconfig  # Wiren Board 6 и новее
$ diff -u arch/arm/configs/mxs_wirenboard_defconfig defconfig  # Wiren Board 5 и более старые

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

$ make ARCH=arm savedefconfig
$ cp defconfig  arch/arm/configs/imx6_wirenboard_defconfig  # Wiren Board 6 и новее
$ cp defconfig arch/arm/configs/mxs_wirenboard_defconfig  # Wiren Board 5 и более старые

Сборка

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

Можно просто собрать бинарные файлы (zImage, модули и dtbs) без создания и скопировать на контроллер вручную.

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

Перед сборкой пакета необходимо сохранить свою версию конфигурации в исходный файл:

$ make ARCH=arm savedefconfig
$ cp defconfig  arch/arm/configs/imx6_wirenboard_defconfig  # Wiren Board 6 и новее
$ cp defconfig arch/arm/configs/mxs_wirenboard_defconfig  # Wiren Board 5 и более старые

Затем запускаем скрипт сборки:

$ make mrproper
$ KERNEL_FLAVOUR=wb6 VERSION_SUFFIX="~my~test~kernel" ./scripts/package/wb/do_build_deb.sh  # Wiren Board 6 и новее
$ KERNEL_FLAVOUR=wb2 VERSION_SUFFIX="~my~test~kernel" ./scripts/package/wb/do_build_deb.sh  # Wiren Board 5 и более старые

Можно поменять значение 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, в нём уже содержится всё необходимое.

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

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

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4  # Wiren Board 6 и новее
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage modules dtbs -j4  # Wiren Board 5 и более старые

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

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

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

$ find . -name '*.ko'

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