Сборка образов прошивки

Материал из Wiren Board

Для сборки образов прошивки контроллера мы подготовили специальный образ Docker. Сборку можно производить внутри этого образа в автоматическом или ручном режиме. После предварительной настройки окружения можно использовать скрипты для сборки без контейнера.

Подготовка

Установка Docker и подготовка хост-системы

Перый шаг — это установка Docker.

Инструкции по установке:

На хост-системе нужно установить также пакет qemu-user-static:

$ sudo apt install -y qemu binfmt-support qemu-user-static

Не забудьте добавить пользователя в группу docker, чтобы не использовать sudo:

$ sudo usermod -aG docker ${USER}

После добавления пользователя в группу надо выйти из системы и войти снова, чтобы изменения применились.

Скачивание инструментария для сборки образа

Создаем директорию, в которой будет лежать инструментарий и файлы образа, и скачиваем скрипты из репозитория.

$ mkdir ~/wirenboard-wbdev
$ cd ~/wirenboard-wbdev
$ git clone https://github.com/wirenboard/wirenboard
$ cd wirenboard

Выкачивание образа Docker-контейнера

Учитывайте, что образ контейнера займет ~5.5 Гб на /var Запускаем:

$ ./wbdev root exit

Команда запустит контейнер и завершится. Отсутствие ошибок - покажет что контейнер работает нормально.

Cборка образа

Про идеологию разделов контроллера можно прочитать на странице Обновление прошивки, информация для разработчиков.

Автоматическая сборка

Готовим файл с командами. Для Wiren Board 6 версии до 6.7 задаём переменную BOARD=6x, от 6.7 и выше - BOARD=67.

Релиз, на основе которого будет собран образ, задаётся в переменной WB_RELEASE.

Обратите внимание: если корневая ФС была отредактирована, нужно удалить строки в скрипте, отвечающие за удаление старой и создание новой корневой ФС (отмечены комментарием в скрипте):

$ BOARD=67; WB_RELEASE=stable; cat << EOFcommand > tmp.sh
#!/bin/bash
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
export ROOTFS=./output/rootfs_wb${BOARD}

# нужно удалить эти 3 строки, если rootfs уже была создана ранее и изменена,
# иначе она будет удалена и создана заново!
echo "Create new clean rootfs" 
rm -rf \$ROOTFS
WB_RELEASE=${WB_RELEASE} /root/rootfs/create_rootfs.sh ${BOARD}

echo "Create .fit image"
./image/create_images.sh ${BOARD}
echo "fix permissions"
chown ${UID} -R ./output/images/
rm tmp.sh
EOFcommand

Запускаем скрипт в контейнере:

$ ./wbdev root bash ./tmp.sh

Важно: Изменения внутри контейнера не сохранятся

После завершения — «корневая» файловая система остается в каталоге ./output/rootfs_wbXX (XX соответствует значению BOARD)и доступна для следующего использования. Можно изменять и дополнять в «ручном» режиме. Готовый для загрузки в контроллер образ — в ./output/images/YYYYMMDDHHMM

Ручная сборка

По сути — то же самое, но команды выполняются вручную, есть возможность изменить параметры.

Запуск контейнера

Запускаем в том же каталоге ~/wirenboard-wbdev/wirenboard следующую команду:

~/wirenboard-wbdev/wirenboard$ ./wbdev root

и после запуска контейнера готовим среду, команды те же что и в «автоматическом» режиме:

# 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

Подготовка rootfs

Если rootfs уже создана ранее, то просто указываем ее расположение (переменная ROOTFS).

export ROOTFS=./output/rootfs_wb6x


Скрипт для подготовки корневой файловой системы находится в директории /root/rootfs.

Синтаксис запуска скрипта create_rootfs.sh:

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

Здесь:

  • board_ver — версия контроллера, для которого готовится образ. Допустимые значения:
    • 7x - для Wiren Board 7
    • 67 — для Wiren Board 6.7 и выше
    • 6x — для Wiren Board 6-6.6
    • 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, имя директории, в которой будет создана корневая ФС. Директория будет создана автоматически.

Зададим расположение ФС, уже существующей или вновь создаваемой:

# export ROOTFS=./output/rootfs_wb6x

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

# cd rootfs
# ROOTFS=./rootfs/rootfs_55 ./create_rootfs.sh 55

Если не используем уже существующую, то создаем:

# export ROOTFS=./output/rootfs_wb6x
# /root/rootfs/create_rootfs.sh 6x

Если нет ошибок — можно переходить к следующему этапу.

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

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

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

# ./create_rootfs.sh 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

Работа внутри корневой ФС

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

# ./output/rootfs_wb6x/chroot_this.sh

и можно изменить параметры и/или добавить пакеты. Добавим, например, lsof

# apt update && apt install lsof -y

Не забывайте выйти из chroot

# exit

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

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

Не забывайте установить путь у ФС в переменную ROOTFS

Пример: собираем образ прошивки для Wiren Board 6x, корневая ФС находится по пути $ROOTFS:

# ./image/create_images.sh 6x

Владельцем созданных файлов образов будет пользователь root, поэтому после создания файла может понадобиться отдельно дать доступ к нему обычным пользователям, например, так:

# chown a+rw -R ./output/images/

Готовый образ будет лежать по пути output/image/<current_datetime>/<current_datetime>_webupd_wb<board>.fit.

См. также