|
|
(не показано 11 промежуточных версий 5 участников) |
Строка 1: |
Строка 1: |
| {{DISPLAYTITLE:Сборка ядра Linux}}
| | <languages/> |
| Сборка ядра Linux вручную может понадобиться, например, если нужно включить в ядро | | <translate> |
| модули, отсутствующие в стандартной поставке Wiren Board. Если вы не знаете, для чего | | <!--T:1--> |
| вам это нужно, то, скорее всего, вам не нужно собирать ядро вручную.
| | '''Сборка ядра''' Linux для Wiren Board может понадобиться, например, если требуется включить нужные модули в ядро. |
|
| |
|
| Начиная с 8 апреля 2021 года, скрипты для сборки deb-пакетов ядра Linux для Wiren Board
| | <!--T:2--> |
| добавлены в репозиторий с кодом ядра: 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 update && sudo apt install build-essential libncurses5-dev fakeroot lzop bc git bison flex libssl-dev rsync
| | sudo apt-get install libncurses5-dev libncursesw5-dev #установка библиотек для menuconfig |
| | #ниже идёт установка и настройка 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"> |
| $ sudo apt install gcc-arm-linux-gnueabihf
| | git clone https://github.com/contactless/build_kernel.git #скачайте набор скриптов, упрощающий сборку |
| | 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> |
|
| |
|
| Для '''Wiren Board 5''' и более старых понадобится другой компилятор:
| | ==Сборка== <!--T:7--> |
|
| |
|
| <syntaxhighlight lang="bash"> | | <!--T:8--> |
| $ sudo apt install gcc-arm-linux-gnueabi
| | Сборка ядра с упаковкой в tar.gz архивы: |
| </syntaxhighlight>
| | ./build.sh |
| | Сборка в пакет Debian |
| | ./build_deb.sh |
|
| |
|
| == Получение исходного кода ==
| |
| Исходный код ядра Linux с правками от команды Wiren Board хранится в репозитории на Github. Чтобы получить его на
| |
| свой компьютер, выполните команды:
| |
|
| |
|
| <syntaxhighlight lang="bash"> | | == Установка на Wiren Board == <!--T:9--> |
| $ git clone https://github.com/wirenboard/linux
| |
| $ cd linux
| |
| $ git submodule update --init --recursive
| |
| </syntaxhighlight>
| |
|
| |
|
| == Сборка == | | <!--T:10--> |
| Все промежуточные и конечные артефакты сборки - объектные файлы, dtb, модули ядра .ko, zImage и т.д. - будут находится в поддиректории '''.build-wbX''', где X зависит от модели контроллера.
| | export kernel_version=3.19.0-imxv5-x0.1 |
| В этой же директории находится конфигурация ядра (см. ниже).
| | (строку версии стоит взять из вывода сборочных скриптов из предыдущего пункта) |
|
| |
|
| Чаще всего для использования на контроллере удобней всего собрать deb-пакет с файлами ядра.
| | <!--T:11--> |
| | Скрипты: |
| | * 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'''.
| |
|
| |
|
| === Сборка deb-пакета === | | == Работа с конфигом ядра == <!--T:12--> |
| <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.
| |
|
| |
|
| После сборки в корне появятся файлы пакетов (пример для Wiren Board 6):
| | === Редактирование конфига ядра === <!--T:13--> |
|
| |
|
| * linux-image-wb6_4.9.22-wb1~my~test~kernel_armhf.deb - образ ядра, модули и dtbs;
| | <!--T:14--> |
| * linux-headers-wb6_4.9.22-wb1~my~test~kernel_armhf.deb - нужен для разработки
| | cd KERNEL |
| * linux-libc-dev_4.9.22-wb1~my~test~kernel_armhf.deb - нужен для разработки
| | make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig |
| | или |
| | 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--> |
| При запуске скрипт сборки deb-пакета спрашивает, использовать ли конфигурацию по-умолчанию:
| | ./config_diff.sh |
| <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'''.
| |
|
| |
|
| Чтобы поменять конфигурацию, запустите '''make''' с необходимыми параметрами:
| | === Применение изменений в стандартный конфиг === <!--T:17--> |
|
| |
|
| <syntaxhighlight lang="bash"> | | <!--T:18--> |
| $ make KBUILD_OUTPUT=.build-wb6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig # для Wiren Board 6
| | Этот пункт нужен, чтобы изменить стандартный конфиг Wiren Board, например чтобы отправить патч или pull request. |
| </syntaxhighlight>
| | cd KERNEL |
| | |
| вместо '''menuconfig''' можно использовать графический '''xconfig'''.
| |
| | |
| После сохранения, конфигурация заишется в сборочную директорию: '''.build-wbX/.config'''.
| |
| | |
| Теперь вы можете собрать ядро с новой конфигурацией, выполнив обычную команду
| |
| <syntaxhighlight lang="bash">
| |
| $ KERNEL_FLAVOUR=wb7 scripts/package/wb/do_build_deb.sh
| |
| </syntaxhighlight>
| |
|
| |
|
| и ответив N, чтобы использовать новую конфигурацию, вместо конфигурации по-умолчанию:
| | <!--T:19--> |
| | | 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>
| |
|
| |
|
| Далее файлы модулей копируются на контроллер в директорию /lib/modules/<версия ядра>/kernel/ с сохранением исходного пути, как было
| | <!--T:20--> |
| при сборке.
| | cp defconfig ./arch/arm/configs/mxs_wirenboard_defconfig |
| | </translate> |
Сборка ядра Linux для Wiren Board может понадобиться, например, если требуется включить нужные модули в ядро.
Общее описание процесса
Сборку ядра нужно проводить на настольном компьютере под управлением Linuх, а не на Wiren Board - исходный код ядра занимает около 3 Гбайт, а процедура сборки требовательная к ресурсам, и займёт много времени даже на настольном компьютере. Все команды ниже, если не указано иное, выполняются на настольном компьютере с Linux.
Последовательность действий:
- Предварительная настройка компьютера с Linux.
- Копирование исходного кода ядра.
- Изменение конфигурации ядра.
- Сборка ядра.
- Установка изменённого ядра на Wiren Board.
Предварительная настройка компьютера с Linux
sudo apt-get install libncurses5-dev libncursesw5-dev #установка библиотек для menuconfig
#ниже идёт установка и настройка git - пропустите, если он уже установлен
sudo apt-get install git
git config --global user.name "Imya Familiya"
git config --global user.email "vash@adres.ru"
Копирование исходного кода ядра
git clone https://github.com/contactless/build_kernel.git #скачайте набор скриптов, упрощающий сборку
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
Сборка
Сборка ядра с упаковкой в tar.gz архивы:
./build.sh
Сборка в пакет Debian
./build_deb.sh
Установка на Wiren Board
export kernel_version=3.19.0-imxv5-x0.1
(строку версии стоит взять из вывода сборочных скриптов из предыдущего пункта)
Скрипты:
- 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
Работа с конфигом ядра
Редактирование конфига ядра
cd KERNEL
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
или
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- xconfig
Список изменений относительно стандартного конфига
./config_diff.sh
Применение изменений в стандартный конфиг
Этот пункт нужен, чтобы изменить стандартный конфиг Wiren Board, например чтобы отправить патч или pull request.
cd KERNEL
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- savedefconfig
cp defconfig ./arch/arm/configs/mxs_wirenboard_defconfig