Сборка образов прошивки: различия между версиями

Материал из Wiren Board
(не показаны 74 промежуточные версии 6 участников)
Строка 1: Строка 1:
Для сборки образов прошивки контроллера мы подготовили специальный образ Docker. Сборку можно производить внутри этого образа в автоматическом или ручном режиме. После предварительной настройки окружения можно использовать скрипты для сборки без контейнера.
Для сборки образов прошивки контроллера подготовлен специальный набор скриптов. Процесс сборки образа состоит из двух этапов:


= Подготовка =
# Подготовка корневой ФС (rootfs)
# Сборка образа для загрузки на контроллер


== Установка Docker и подготовка хост-системы ==
Скрипты находятся в репозитории [https://github.com/contactless/wirenboard wirenboard]. Далее пути будут обозначаться от директории с репозиторием.
Перый шаг — это установка [https://docs.docker.com/ Docker].


Инструкции по установке:
== Подготовка rootfs ==


* [https://docs.docker.com/engine/install/ubuntu/ Ubuntu]
Скрипт для подготовки корневой ФС находится в директории rootfs.
* [https://docs.docker.com/engine/install/debian/ Debian]


На '''хост-системе''' нужно установить также пакет <code>qemu-user-static</code>:
Как использовать скрипт create_rootfs.sh:
<syntaxhighlight lang="console">
$ sudo apt install -y qemu binfmt-support qemu-user-static
</syntaxhighlight>


Не забудьте добавить пользователя в группу docker, чтобы не использовать sudo:
<syntaxhighlight lang="console">
$ sudo usermod -aG docker ${USER}
</syntaxhighlight>
После добавления пользователя в группу надо выйти из системы и войти снова, чтобы изменения применились.
== Скачивание инструментария для сборки образа ==
Создаем директорию, в которой будет лежать инструментарий и файлы образа, и скачиваем скрипты из репозитория.
<syntaxhighlight lang="console">
$ mkdir ~/wirenboard-wbdev
$ cd ~/wirenboard-wbdev
$ git clone https://github.com/wirenboard/wirenboard
$ cd wirenboard
</syntaxhighlight>
== Выкачивание образа Docker-контейнера ==
{{note|info|Учитывайте, что образ контейнера займет ~5.5 Гб на <code>/var</code>}}
Запускаем:
<syntaxhighlight lang="console">
$ ./wbdev root exit
</syntaxhighlight>
Команда выкачает, затем запустит контейнер и завершится. Отсутствие ошибок - покажет что контейнер работает нормально.
=Cборка образа=
Про идеологию разделов контроллера можно прочитать на странице [[WB_Firmware_Update_Details | Обновление прошивки, информация для разработчиков]].
==Автоматическая сборка==
Готовим файл с командами. Для Wiren Board 6 версии до 6.7 задаём переменную <code>BOARD=6x</code>, от 6.7 и выше - <code>BOARD=67</code>. Для WB7 - <code>BOARD=7x</code>
Сразу создаем каталог <code>mkdir ./output/images/</code>
Релиз, на основе которого будет собран образ, задаётся в переменной <code>WB_RELEASE</code>.
'''Обратите внимание''': если корневая ФС была отредактирована, нужно удалить строки в скрипте, отвечающие за удаление старой и создание новой корневой ФС
(отмечены комментарием в скрипте):
<blockquote>'''Важно:''' кэш сохраняется по пути /home/XXX/wbdev/go/src/github.com/contactless/wirenboard/output -
эта же папка шарена между нашим хостом и докером, из неё мы и запускаем ./wbdev. Если у вас что-то сбоит на старых версиях - можно переиначить все пути на
<syntaxhighlight>/root/rootfs/ </syntaxhighlight>
но при этом будет потеряна возможность использовать кэш при сборке.
'''дополнительно:''' DEBIAN_RELEASE= в скрипте есть смысл ставить тот который требуется в зависимости от версии board. wb6 со скриптом ниже не заработает без изменения релиза на предыдущий.
</blockquote>
<syntaxhighlight lang="bash">
$ BOARD=7x; WB_RELEASE=stable; DEBIAN_RELEASE=stretch; cat << EOFcommand > tmp.sh
#!/bin/bash
apt-get update
apt-get install -y kpartx zip device-tree-compiler u-boot-tools libfdt1 binutils
mount -t devtmpfs none /dev
export ROOTFS=./output/rootfs_wb${BOARD}
# нужно удалить эти 3 строки, если rootfs уже была создана ранее и изменена,
# иначе она будет удалена и создана заново!
echo "Create new clean rootfs"
rm -rf \$ROOTFS
WB_RELEASE=${WB_RELEASE} DEBIAN_RELEASE=${DEBIAN_RELEASE}  rootfs/create_rootfs.sh ${BOARD}
# можно использовать /root/rootfs/create_rootfs.sh ${BOARD} но в этом случае у вас не будет использоваться кэш сокращающий время компиляции в 2 раза
echo "Create .fit image"
./image/create_images.sh ${BOARD}
echo "fix permissions"
chown ${UID} -R ./output/images/
#Uncomment next string for remove script
#rm tmp.sh
EOFcommand
</syntaxhighlight>
<blockquote>'''Важно:'''u-boot-tools=2016.11+dfsg1-4 - больше не требуется. Но если вам вдруг надо на старой wb поставить именно его -
<syntaxhighlight>wget https://cloudfront.debian.net/debian-archive/debian/pool/main/u/u-boot/u-boot-tools_2016.11+dfsg1-4_amd64.deb
dpkg -i u-boot-tools_2016.11+dfsg1-4_amd64.deb
rm u-boot-tools_2016.11+dfsg1-4_amd64.deb </syntaxhighlight></blockquote>
Запускаем скрипт в контейнере:
<syntaxhighlight lang="bash">
$ ./wbdev root bash ./tmp.sh
</syntaxhighlight>
<blockquote>'''Важно:''' Изменения внутри контейнера не сохранятся </blockquote>
После завершения — «корневая» файловая система остается в каталоге <code>./output/rootfs_wbXX</code> (XX соответствует значению <code>BOARD</code>)и доступна для следующего использования. Можно изменять и дополнять в «ручном» режиме.
Готовый для загрузки в контроллер образ — в <code>./output/images/YYYYMMDDHHMM</code>
==Ручная сборка==
По сути — то же самое, но команды выполняются вручную, есть возможность изменить параметры.
=== Запуск контейнера ===
Запускаем в том же каталоге <code>~/wirenboard-wbdev/wirenboard</code> следующую команду:
<syntaxhighlight lang="bash">
~/wirenboard-wbdev/wirenboard$ ./wbdev root
</syntaxhighlight>
и после запуска контейнера готовим среду, команды те же что и в «автоматическом» режиме:
<syntaxhighlight lang="console">
# apt-get update && \
apt-get install -y kpartx zip device-tree-compiler u-boot-tools=2016.11+dfsg1-4 libfdt1 binutils && \
mount -t devtmpfs none /dev
</syntaxhighlight>
=== Подготовка rootfs ===
Если rootfs уже создана ранее, то просто указываем ее расположение (переменная ROOTFS).
<syntaxhighlight lang="bash">
export ROOTFS=./output/rootfs_wb7x
</syntaxhighlight>
Скрипт для подготовки корневой файловой системы находится в директории <code>wirenboard/rootfs</code>.
Синтаксис запуска скрипта <code>create_rootfs.sh</code>:
<pre>
<pre>
  $ ./create_rootfs.sh <board_ver> [<list of additional repos>]
  $ ./create_rootfs.sh <path_to_new_rootfs> <board_ver> [<list of additional repos>]
</pre>
</pre>


Здесь:
Здесь:
* ''board_ver'' версия контроллера, для которого готовится образ. Допустимые значения:
 
** 7x - для Wiren Board 7
* ''path_to_new_rootfs'' - имя директории, в которой будет создана корневая ФС. Директория будет создана автоматически;
** 67 — для Wiren Board 6.7 и выше
* ''board_ver'' - версия контроллера, для которого готовится образ. Допустимые значения:
** 6x — для Wiren Board 6-6.6
** 5 - для Wiren Board 5
** 5 — для Wiren Board 5
** 55 - для Wiren Board 5.5
** 55 для Wiren Board 5.5
** 4 - для Wiren Board 4
** 4 для Wiren Board 4
** 32 - для WB Smart Home (3.2)
** 32 для WB Smart Home (3.2)
** 28
** 28
** NETMON
** NETMON
Строка 146: Строка 30:
** MKA31
** MKA31
** AC-E1
** AC-E1
* ''list of additional repos'' адреса дополнительных репозиториев с тестовыми пакетами (см. ниже). Опциональный параметр.
* ''list of additional repos'' - адреса дополнительных репозиториев с тестовыми пакетами (см. ниже). Опциональный параметр.
* ''путь к корневой ФС'' из переменной ROOTFS, имя директории, в которой будет создана корневая ФС. Директория будет создана автоматически.


Зададим расположение ФС, уже существующей или вновь создаваемой:
Пример. Собираем базовую (без доп. репозиториев) корневую ФС в директории rootfs/rootfs для Wiren Board 5.5:
<syntaxhighlight lang="console">
# export ROOTFS=./output/rootfs_wb6x
</syntaxhighlight>


Пример. Собираем базовую (без доп. репозиториев) корневую ФС в директории <code>rootfs/rootfs</code> для Wiren Board 7x:
<pre>
 
$ cd rootfs
<syntaxhighlight lang="console">
$ ./create_rootfs.sh ./rootfs/ 55
# cd rootfs
</pre>
# ROOTFS=./rootfs/rootfs_7x WB_RELEASE=stable DEBIAN_RELEASE=stretch ./create_rootfs.sh 7x
</syntaxhighlight>
 
Если не используем уже существующую, то создаем:
<syntaxhighlight lang="console">
# export ROOTFS=./output/rootfs_wb7x
# export WB_RELEASE=stable DEBIAN_RELEASE=stretch
# wirenboard/rootfs/create_rootfs.sh 7x
</syntaxhighlight>
 
Если нет ошибок — можно переходить к следующему этапу.


=== Дополнительные репозитории ===
=== Дополнительные репозитории ===
Строка 174: Строка 43:
Добавление дополнительных репозиториев необходимо, если вы хотите добавить свои версии пакетов в собираемую корневую ФС.
Добавление дополнительных репозиториев необходимо, если вы хотите добавить свои версии пакетов в собираемую корневую ФС.


Добавляется при помощи wbrepo, общий мануал https://github.com/wirenboard/wirenboard/blob/master/README-wbrepo.md
В скрипт передаются ''только адреса'' репозиториев. Например:
В скрипт передаются ''только адреса'' репозиториев. Например:


<syntaxhighlight lang="console">
<pre>
# ./create_rootfs.sh 55 http://server1.net/ http://server2.net:8086/
$ ./create_rootfs.sh ./rootfs/ 55 http://server1.net/ http://server2.net:8086/
</syntaxhighlight>
</pre>


Формат репозиториев соответствует тому, который создаётся с помощью утилиты [[Special:MyLanguage/wbrepo|wbrepo]]. К дополнительному репозиторию предъявляются требования:
Формат репозиториев соответствует тому, который создаётся с помощью утилиты [[wbrepo]]. Конкретно, к дополнительному репозиторию предъявляются следующие требования:


* В корне на сервере репозитория должен храниться публичный GPG-ключ в файле <code>/repo.gpg.key</code>. Например, если репозиторий расположен по адресу http://localhost:8086/, то ключ должен быть доступен по ссылке http://localhost:8086/repo.gpg.key
* В корне на сервере репозитория должен храниться публичный GPG-ключ в файле /repo.gpg.key. Например, если репозиторий расположен по адресу http://localhost:8086/, то ключ должен быть доступен по ссылке http://localhost:8086/repo.gpg.key
* Имя используемого дистрибутива testing (если не менялся код в )
* Имя используемого дистрибутива - testing
* Используемый компонент main
* Используемый компонент - main


При использовании wbrepo с хоста из докера можно найти их на http://172.17.0.1:8086/ - просто оставьте wbrepo serve запущенным на хосте и вызовите из докера
То есть, если передан адрес репозитория http://localhost:8086/, то в sources.list он будет представлен как
<syntaxhighlight lang="console">
# ./create_rootfs.sh 7x http://172.17.0.1:8086/
</syntaxhighlight>
При изменении имени дистрибутива - отредактировать в https://github.com/wirenboard/wirenboard/blob/master/wbrepo
<pre>
DISTRIBUTION=testing #меняем тут testing на нужное наименование дистрибутива
</pre>
Или смотрим под какой дистрибутив запустился сервер под wbrepo serve и меняем на нужный в ручном запуске
<pre>
./rootfs/create_rootfs.sh 7x http://172.17.0.1:8086@testing:main
</pre>
То есть, если передан адрес репозитория http://localhost:8086/, то в <code>sources.list</code> он будет представлен как


<pre>
<pre>
  deb http://localhost:8086/ testing main
  deb http://localhost:8086/ testing main
</pre>
</pre>
При проблемах - посмотрите внимательно на <code>curl -v</code> вывод адреса репозитория


=== Работа внутри корневой ФС ===
== Сборка образа для загрузки на контроллер ==


Для того чтобы установить какие-нибудь дополнительные пакеты в корневую систему используется chroot.
''TODO: раздел требует дополнения''
Если уже создана ФС в каталоге <code>./output/rootfs_wb6x</code> то делаем chroot в нее:


<syntaxhighlight lang="console">
Скрипты для сборки образов находятся в директории images. Перед сборкой образа необходима готовая корневая ФС.
# ./output/rootfs_wb6x/chroot_this.sh
</syntaxhighlight>


и можно изменить параметры и/или добавить пакеты. Добавим, например, lsof
Дополнительно на хост-машине потребуются утилиты (названия приведены для Debian/Ubuntu):
<syntaxhighlight lang="console">
# apt update && apt install lsof -y
</syntaxhighlight>


<blockquote>''Не забывайте '''выйти''' из chroot</blockquote>
* kpartx
<syntaxhighlight lang="console">
* device-tree-compiler
# exit
</syntaxhighlight>


== Сборка образа для загрузки на контроллер ==
Пример: собираем образ прошивки для Wiren Board 5, корневая ФС находится по пути rootfs/rootfs/:


Скрипты для сборки образов находятся в директории images. Перед сборкой образа необходима '''готовая''' корневая ФС.
<pre>
<blockquote>''Не забывайте установить путь у ФС в переменную ROOTFS</blockquote>
$ cd image
$ ./create_images_wb5.sh ../rootfs/rootfs/ <tag>
</pre>


Пример: собираем образ прошивки для Wiren Board '''6x''', корневая ФС находится по пути $ROOTFS:
Здесь ''tag'' - суффикс, который будет добавлен к имени файла образа.


<syntaxhighlight lang="console">
Готовый образ будет лежать по пути image/image/wb5/<current_datetime>/<current_datetime>_emmc_<tag>.img.
# ./image/create_images.sh 6x
</syntaxhighlight>
 
Владельцем созданных файлов образов будет пользователь root, поэтому после создания файла может понадобиться отдельно дать доступ к нему обычным пользователям, например, так:
 
<syntaxhighlight lang="console">
# chown a+rw -R ./output/images/
</syntaxhighlight>
 
Готовый образ будет лежать по пути <code>output/image/<current_datetime>/<current_datetime>_webupd_wb<board>.fit</code>.


== См. также ==
== См. также ==
 
* [[Обновление прошивки]]
* [[Special:MyLanguage/Обновление прошивки|Обновление прошивки]]
* [[Wiren Board 5: Восстановление прошивки]]
* [[Wiren Board 5: Восстановление прошивки|Wiren Board 5: Восстановление прошивки]]

Версия 17:01, 15 октября 2016

Для сборки образов прошивки контроллера подготовлен специальный набор скриптов. Процесс сборки образа состоит из двух этапов:

  1. Подготовка корневой ФС (rootfs)
  2. Сборка образа для загрузки на контроллер

Скрипты находятся в репозитории wirenboard. Далее пути будут обозначаться от директории с репозиторием.

Подготовка rootfs

Скрипт для подготовки корневой ФС находится в директории rootfs.

Как использовать скрипт create_rootfs.sh:

 $ ./create_rootfs.sh <path_to_new_rootfs> <board_ver> [<list of additional repos>]

Здесь:

  • path_to_new_rootfs - имя директории, в которой будет создана корневая ФС. Директория будет создана автоматически;
  • board_ver - версия контроллера, для которого готовится образ. Допустимые значения:
    • 5 - для Wiren Board 5
    • 55 - для Wiren Board 5.5
    • 4 - для Wiren Board 4
    • 32 - для WB Smart Home (3.2)
    • 28
    • NETMON
    • MKA3
    • CQC10
    • MKA31
    • AC-E1
  • list of additional repos - адреса дополнительных репозиториев с тестовыми пакетами (см. ниже). Опциональный параметр.

Пример. Собираем базовую (без доп. репозиториев) корневую ФС в директории rootfs/rootfs для Wiren Board 5.5:

 $ cd rootfs
 $ ./create_rootfs.sh ./rootfs/ 55

Дополнительные репозитории

Добавление дополнительных репозиториев необходимо, если вы хотите добавить свои версии пакетов в собираемую корневую ФС.

В скрипт передаются только адреса репозиториев. Например:

 $ ./create_rootfs.sh ./rootfs/ 55 http://server1.net/ http://server2.net:8086/

Формат репозиториев соответствует тому, который создаётся с помощью утилиты wbrepo. Конкретно, к дополнительному репозиторию предъявляются следующие требования:

  • В корне на сервере репозитория должен храниться публичный GPG-ключ в файле /repo.gpg.key. Например, если репозиторий расположен по адресу http://localhost:8086/, то ключ должен быть доступен по ссылке http://localhost:8086/repo.gpg.key
  • Имя используемого дистрибутива - testing
  • Используемый компонент - main

То есть, если передан адрес репозитория http://localhost:8086/, то в sources.list он будет представлен как

 deb http://localhost:8086/ testing main

Сборка образа для загрузки на контроллер

TODO: раздел требует дополнения

Скрипты для сборки образов находятся в директории images. Перед сборкой образа необходима готовая корневая ФС.

Дополнительно на хост-машине потребуются утилиты (названия приведены для Debian/Ubuntu):

  • kpartx
  • device-tree-compiler

Пример: собираем образ прошивки для Wiren Board 5, корневая ФС находится по пути rootfs/rootfs/:

 $ cd image
 $ ./create_images_wb5.sh ../rootfs/rootfs/ <tag>

Здесь tag - суффикс, который будет добавлен к имени файла образа.

Готовый образ будет лежать по пути image/image/wb5/<current_datetime>/<current_datetime>_emmc_<tag>.img.

См. также