How To Build Linux Kernel: различия между версиями

Материал из Wiren Board
(пакет rsync добавил)
 
(не показано 11 промежуточных версий 5 участников)
Строка 1: Строка 1:
<languages/>
{{DISPLAYTITLE:Сборка ядра Linux}}
<translate>
Сборка ядра Linux вручную может понадобиться, например, если нужно включить в ядро
<!--T:1-->
модули, отсутствующие в стандартной поставке Wiren Board. Если вы не знаете, для чего
'''Сборка ядра''' Linux для Wiren Board может понадобиться, например, если требуется включить нужные модули в ядро.
вам это нужно, то, скорее всего, вам не нужно собирать ядро вручную.


<!--T:2-->
Начиная с 8 апреля 2021 года, скрипты для сборки deb-пакетов ядра Linux для Wiren Board
==Общее описание процесса==
добавлены в репозиторий с кодом ядра: http://github.com/wirenboard/linux.
Сборку ядра нужно проводить на настольном компьютере под управлением Linuх, а не на Wiren Board - исходный код ядра занимает около 3 Гбайт, а процедура сборки требовательная к ресурсам, и займёт много времени даже на настольном компьютере. Все команды ниже, если не указано иное, выполняются на настольном компьютере с Linux.


Последовательность действий:
== Подготовка сборочной машины ==
# Предварительная настройка компьютера с Linux.
Сборка ядра должна производиться на настольном компьютере, ноутбуке или сервере под управлением Linux.
# Копирование исходного кода ядра.
Собирать ядро на самом Wiren Board не стоит - у контроллера не хватит дискового пространства для получения
# Изменение конфигурации ядра.
репозитория, а также вычислительной мощности. Даже на настольном компьютере сборка ядра может занять
# Сборка ядра.
десятки минут.
# Установка изменённого ядра на Wiren Board.
 
Сборочные скрипты писались с расчётом на дистрибутивы Debian и Ubuntu, инструкции в этой статье приводятся
также из расчёта использования этих дистрибутивов. Инструкция была проверена в Ubuntu 18.04.
 
Для сборки ядра понадобится установить пакеты с необходимым для сборки ПО:


==Предварительная настройка компьютера с Linux==
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
sudo apt-get install libncurses5-dev libncursesw5-dev #установка библиотек для menuconfig
$ sudo apt update && sudo apt install build-essential libncurses5-dev fakeroot lzop bc git bison flex libssl-dev rsync
#ниже идёт установка и настройка git - пропустите, если он уже установлен
sudo apt-get install git
git config --global user.name "Imya Familiya"
git config --global user.email "vash@adres.ru"
</syntaxhighlight>
</syntaxhighlight>


==Копирование исходного кода ядра==
Если вы собираете ядро для '''Wiren Board 6''' и новее, ([https://support.wirenboard.com/t/linux-kernel-modules-linux-headers/16179/6 могут быть нюансы с версией]):
 
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
git clone https://github.com/contactless/build_kernel.git #скачайте набор скриптов, упрощающий сборку
$ sudo apt install gcc-arm-linux-gnueabihf
cd build_kernel
git clone https://github.com/contactless/linux KERNEL #скопируйте ядро, адаптированное для Wiren Board
cd KERNEL
git submodule init; git submodule update #инициализируйте внешние модули
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- mxs_wirenboard_defconfig #установите конфиг для сборки под Wiren Board
</syntaxhighlight>
</syntaxhighlight>


==Сборка== <!--T:7-->
Для '''Wiren Board 5''' и более старых понадобится другой компилятор:


<!--T:8-->
<syntaxhighlight lang="bash">
Сборка ядра с упаковкой в tar.gz архивы:
$ sudo apt install gcc-arm-linux-gnueabi
./build.sh
</syntaxhighlight>
Сборка в пакет Debian
./build_deb.sh


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


== Установка на Wiren Board == <!--T:9-->
<syntaxhighlight lang="bash">
$ git clone https://github.com/wirenboard/linux
$ cd linux
$ git submodule update --init --recursive
</syntaxhighlight>


<!--T:10-->
== Сборка ==
export kernel_version=3.19.0-imxv5-x0.1
Все промежуточные и конечные артефакты сборки - объектные файлы, dtb, модули ядра .ko, zImage и т.д. - будут находится в поддиректории '''.build-wbX''', где X зависит от модели контроллера.
(строку версии стоит взять из вывода сборочных скриптов из предыдущего пункта)
В этой же директории находится конфигурация ядра (см. ниже).


<!--T:11-->
Чаще всего для использования на контроллере удобней всего собрать deb-пакет с файлами ядра.  
Скрипты:
* tools/copy_kernel_latest_deb.sh - копирует и устанавливает последний deb-пакет с ядром. Аргумент: папка с rootfs (или примонтированный eMMC/microSD накопитель Wiren Board)
* tools/scp_kernel_latest_deb.sh - - копирует и устанавливает последний deb-пакет с ядром. Аргумент: root@hostname, где hostname - это IP-адрес Wiren Board


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


== Работа с конфигом ядра == <!--T:12-->
=== Сборка deb-пакета ===
<syntaxhighlight lang="bash">
$ make mrproper
$ KERNEL_FLAVOUR=wb6 VERSION_SUFFIX="~my~test~kernel" ./scripts/package/wb/do_build_deb.sh  # Wiren Board 6
</syntaxhighlight>


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


=== Редактирование конфига ядра === <!--T:13-->
После сборки в корне появятся файлы пакетов (пример для Wiren Board 6):


<!--T:14-->
* linux-image-wb6_4.9.22-wb1~my~test~kernel_armhf.deb - образ ядра, модули и dtbs;
cd KERNEL
* linux-headers-wb6_4.9.22-wb1~my~test~kernel_armhf.deb - нужен для разработки
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
* linux-libc-dev_4.9.22-wb1~my~test~kernel_armhf.deb  - нужен для разработки
или
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- xconfig


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


=== Список изменений относительно стандартного конфига === <!--T:15-->
== Разные модели контроллеров ==
{| class="wikitable"
|-
! Модель контроллера
! KERNEL_FLAVOUR
! файл defconfig
! сборочная директория
! переменная CROSS_COMPILE
! файлы dts и dtb
|-
| Wiren Board 6
| wb6
| imx6_wirenboard_defconfig
| .build-wb6
| CROSS_COMPILE=arm-linux-gnueabihf-
| imx6ul-wirenboard6*
|-
| Wiren Board 5 и ниже
| wb2
| mxs_wirenboard_defconfig
| .build-wb2
| CROSS_COMPILE=arm-linux-gnueabi-
| imx28-wirenboard5*
|-
| Wiren Board 7
| wb7
| wirenboard7_defconfig
| .build-wb7
| CROSS_COMPILE=arm-linux-gnueabihf-  
| sun8i-r40-wirenboard7*
|}


<!--T:16-->
== Настройка ядра ==
./config_diff.sh
При запуске скрипт сборки deb-пакета спрашивает, использовать ли конфигурацию по-умолчанию:
<syntaxhighlight lang="bash">
$ 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)
</syntaxhighlight>


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


=== Применение изменений в стандартный конфиг === <!--T:17-->
Чтобы поменять конфигурацию, запустите '''make''' с необходимыми параметрами:


<!--T:18-->
<syntaxhighlight lang="bash">
Этот пункт нужен, чтобы изменить стандартный конфиг Wiren Board, например чтобы отправить патч или pull request.
$ make KBUILD_OUTPUT=.build-wb6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig # для Wiren Board 6
cd KERNEL
</syntaxhighlight>
 
вместо '''menuconfig''' можно использовать графический '''xconfig'''.
 
После сохранения, конфигурация заишется в сборочную директорию: '''.build-wbX/.config'''.
 
Теперь вы можете собрать ядро с новой конфигурацией, выполнив обычную команду
<syntaxhighlight lang="bash">
$ KERNEL_FLAVOUR=wb7  scripts/package/wb/do_build_deb.sh
</syntaxhighlight>


  <!--T:19-->
и ответив N, чтобы использовать новую конфигурацию, вместо конфигурации по-умолчанию:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- savedefconfig
 
<syntaxhighlight lang="bash">
Use wirenboard7_defconfig instead? (y/N)
</syntaxhighlight>
 
Когда вы полностью довольны результатом, можно посмотреть изменения относительно исходной версии:
 
<syntaxhighlight lang="bash">
# для 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 # посмотреть её отличия от исходной конфигурации
</syntaxhighlight>
 
Чтобы заменить исходную версию настроек своей (например, при подготовке патча или pull request):
 
<syntaxhighlight lang="bash">
# для 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
</syntaxhighlight>
 
После этого скрипт '''do_build_deb.sh''' будет использовать обновлённую конфигуацию при ответе "y".
 
=== Сборка вручную ===
Этот этап не требуется для стандартных задач.
Если вы хотите выполнить вручную какой-либо этап сборки, то можно запустить '''make''' вручную.
 
<syntaxhighlight lang="bash">
# для Wiren Board 6
$ make KBUILD_OUTPUT=.build-wb6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs modules -j4
</syntaxhighlight>
 
(-j4 запускает сборку в 4 потока, можно это убрать или поменять значение на более подходящее вашему компьютеру, идеальное значение - количество ядер CPU)
 
В результате появятся нужные нам файлы:
 
* .build-wb6/arch/arm/boot/zImage - образ ядра, который нужно скопировать в /boot/zImage на контроллере;
* .build-wb6/arch/arm/boot/dtb/* - файлы device tree, используемые для настройки оборудования при запуске, копируются в директорию /boot/dtbs/.
 
Файлы модулей можно найти с помощью команды:
 
<syntaxhighlight lang="bash">
$ find . -name '*.ko'
</syntaxhighlight>


<!--T:20-->
Далее файлы модулей копируются на контроллер в директорию /lib/modules/<версия ядра>/kernel/ с сохранением исходного пути, как было
cp defconfig ./arch/arm/configs/mxs_wirenboard_defconfig
при сборке.
</translate>

Текущая версия на 19:50, 21 марта 2024

Сборка ядра 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 bison flex libssl-dev rsync

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

$ 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

Сборка

Все промежуточные и конечные артефакты сборки - объектные файлы, 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

Можно поменять значение 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 файл defconfig сборочная директория переменная CROSS_COMPILE файлы dts и dtb
Wiren Board 6 wb6 imx6_wirenboard_defconfig .build-wb6 CROSS_COMPILE=arm-linux-gnueabihf- imx6ul-wirenboard6*
Wiren Board 5 и ниже wb2 mxs_wirenboard_defconfig .build-wb2 CROSS_COMPILE=arm-linux-gnueabi- imx28-wirenboard5*
Wiren Board 7 wb7 wirenboard7_defconfig .build-wb7 CROSS_COMPILE=arm-linux-gnueabihf- sun8i-r40-wirenboard7*

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

При запуске скрипт сборки 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

вместо 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/ с сохранением исходного пути, как было при сборке.