How To Build Linux Kernel: различия между версиями
Admin (обсуждение | вклад) |
Brainroot (обсуждение | вклад) (пакет rsync добавил) |
||
(не показано 12 промежуточных версий 5 участников) | |||
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE:Сборка ядра Linux}} | |||
Сборка ядра Linux вручную может понадобиться, например, если нужно включить в ядро | |||
модули, отсутствующие в стандартной поставке Wiren Board. Если вы не знаете, для чего | |||
вам это нужно, то, скорее всего, вам не нужно собирать ядро вручную. | |||
Начиная с 8 апреля 2021 года, скрипты для сборки deb-пакетов ядра Linux для Wiren Board | |||
добавлены в репозиторий с кодом ядра: http://github.com/wirenboard/linux. | |||
== Подготовка сборочной машины == | |||
Сборка ядра должна производиться на настольном компьютере, ноутбуке или сервере под управлением Linux. | |||
Собирать ядро на самом Wiren Board не стоит - у контроллера не хватит дискового пространства для получения | |||
репозитория, а также вычислительной мощности. Даже на настольном компьютере сборка ядра может занять | |||
десятки минут. | |||
Сборочные скрипты писались с расчётом на дистрибутивы Debian и Ubuntu, инструкции в этой статье приводятся | |||
также из расчёта использования этих дистрибутивов. Инструкция была проверена в Ubuntu 18.04. | |||
Для сборки ядра понадобится установить пакеты с необходимым для сборки ПО: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
sudo apt | $ sudo apt update && sudo apt install build-essential libncurses5-dev fakeroot lzop bc git bison flex libssl-dev rsync | ||
sudo apt | |||
git | |||
</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 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Для '''Wiren Board 5''' и более старых понадобится другой компилятор: | |||
< | <syntaxhighlight lang="bash"> | ||
$ sudo apt install gcc-arm-linux-gnueabi | |||
</syntaxhighlight> | |||
== Получение исходного кода == | |||
Исходный код ядра Linux с правками от команды Wiren Board хранится в репозитории на Github. Чтобы получить его на | |||
свой компьютер, выполните команды: | |||
= | <syntaxhighlight lang="bash"> | ||
$ git clone https://github.com/wirenboard/linux | |||
$ cd linux | |||
$ git submodule update --init --recursive | |||
</syntaxhighlight> | |||
== Сборка == | |||
Все промежуточные и конечные артефакты сборки - объектные файлы, dtb, модули ядра .ko, zImage и т.д. - будут находится в поддиректории '''.build-wbX''', где X зависит от модели контроллера. | |||
( | В этой же директории находится конфигурация ядра (см. ниже). | ||
Чаще всего для использования на контроллере удобней всего собрать deb-пакет с файлами ядра. | |||
Если вам нужны только некоторые бинарные файлы (zImage, модули и dtbs), то после успешной сборки deb-пакета их можно будет найти в сборочной поддиректории '''.build-wbX'''. | |||
== | === Сборка 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. | |||
После сборки в корне появятся файлы пакетов (пример для 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, в нём уже содержится всё необходимое. | |||
=== | == Разные модели контроллеров == | ||
{| 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* | |||
|} | |||
== Настройка ядра == | |||
При запуске скрипт сборки 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'''. | |||
Чтобы поменять конфигурацию, запустите '''make''' с необходимыми параметрами: | |||
< | <syntaxhighlight lang="bash"> | ||
$ make KBUILD_OUTPUT=.build-wb6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig # для Wiren Board 6 | |||
</syntaxhighlight> | |||
вместо '''menuconfig''' можно использовать графический '''xconfig'''. | |||
После сохранения, конфигурация заишется в сборочную директорию: '''.build-wbX/.config'''. | |||
Теперь вы можете собрать ядро с новой конфигурацией, выполнив обычную команду | |||
<syntaxhighlight lang="bash"> | |||
$ KERNEL_FLAVOUR=wb7 scripts/package/wb/do_build_deb.sh | |||
</syntaxhighlight> | |||
< | и ответив N, чтобы использовать новую конфигурацию, вместо конфигурации по-умолчанию: | ||
make ARCH=arm CROSS_COMPILE=arm-linux- | |||
<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/ с сохранением исходного пути, как было при сборке.