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

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


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


<!--T:2-->
== Подготовка сборочной машины ==
'''0.''' Сборку ядра следует проводить на вашем настольном компьютере под управлением Linux (не на Wiren Board - теоретически это возможно, но потребует несколько гигабайт свободного места, и займёт много времени).
Сборка ядра должна производиться на настольном компьютере, ноутбуке или сервере под управлением Linux.
Убедитесь, что у вас установлен git (http://en.wikipedia.org/wiki/Git_%28software%29). Если нет, установите его:<pre>
Собирать ядро на самом Wiren Board не стоит - у контроллера не хватит дискового пространства для получения
sudo apt-get install git
репозитория, а также вычислительной мощности. Даже на настольном компьютере сборка ядра может занять
</pre>
десятки минут.
Установите произвольные имя пользователя и почту:
<pre>
git config --global user.name "Imya Familiya"
git config --global user.email "vash@adres.ru"
</pre>


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


<!--T:3-->
Для сборки ядра понадобится установить пакеты с необходимым для сборки ПО:
'''1.''' Скачайте набор скриптов, который упрощает сборку:
<pre>
git clone git://github.com/contactless/build_kernel.git
cd build_kernel
</pre>
'''2.''' Склонируйте и инициализируйте репозиторий Linux.


<!--T:4-->
<syntaxhighlight lang="bash">
Репозиторий можно склонировать с использованием https (если у вас нет аккаунта на github.com):
$ sudo apt update && sudo apt install build-essential libncurses5-dev fakeroot lzop bc git bison flex libssl-dev rsync
<pre>
</syntaxhighlight>
git clone https://github.com/contactless/linux KERNEL
</pre>


<!--T:5-->
Если вы собираете ядро для '''Wiren Board 6''' и новее, ([https://support.wirenboard.com/t/linux-kernel-modules-linux-headers/16179/6 могут быть нюансы с версией]):
или ssh, если у вас есть аккаунт:
<pre>
git clone git@github.com:contactless/linux.git KERNEL
</pre>


<!--T:6-->
<syntaxhighlight lang="bash">
'''3.'''  Инициализируйте внешние модули:
$ sudo apt install gcc-arm-linux-gnueabihf
<pre>
</syntaxhighlight>
cd KERNEL</pre>
<pre>
git submodule init</pre>
<pre>
git submodule update</pre>
'''4.''' Установите конфиг для сборки под Wiren Board<pre>
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- mxs_wirenboard_defconfig
</pre>


==Сборка== <!--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>


<!--T:19-->
вместо '''menuconfig''' можно использовать графический '''xconfig'''.
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- savedefconfig


  <!--T:20-->
После сохранения, конфигурация заишется в сборочную директорию: '''.build-wbX/.config'''.
cp defconfig ./arch/arm/configs/mxs_wirenboard_defconfig
 
</translate>
Теперь вы можете собрать ядро с новой конфигурацией, выполнив обычную команду
<syntaxhighlight lang="bash">
$ KERNEL_FLAVOUR=wb7 scripts/package/wb/do_build_deb.sh
</syntaxhighlight>
 
и ответив N, чтобы использовать новую конфигурацию, вместо конфигурации по-умолчанию:
 
<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>
 
Далее файлы модулей копируются на контроллер в директорию /lib/modules/<версия ядра>/kernel/ с сохранением исходного пути, как было
при сборке.

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