Сборка образов прошивки: различия между версиями
Brainroot (обсуждение | вклад) |
|||
(не показано 39 промежуточных версий 5 участников) | |||
Строка 1: | Строка 1: | ||
<languages/> | |||
<translate> | |||
<!--T:1--> | |||
Для сборки образов прошивки контроллера мы подготовили специальный образ Docker. Сборку можно производить внутри этого образа в автоматическом или ручном режиме. После предварительной настройки окружения можно использовать скрипты для сборки без контейнера. | Для сборки образов прошивки контроллера мы подготовили специальный образ Docker. Сборку можно производить внутри этого образа в автоматическом или ручном режиме. После предварительной настройки окружения можно использовать скрипты для сборки без контейнера. | ||
= Подготовка = | = Подготовка = | ||
Актуально '''до''' ядра 4.22 включительно. Раздел в процессе правки. | |||
== Установка Docker и подготовка хост-системы == | == Установка Docker и подготовка хост-системы== | ||
Перый шаг — это установка [https://docs.docker.com/ Docker]. | Перый шаг — это установка [https://docs.docker.com/ Docker]. | ||
В зависимости от используемого дистрибутива — устанавливается по-разному, для Debian: | |||
<syntaxhighlight lang="bash"> | |||
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y | |||
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - | |||
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | |||
sudo apt update | |||
На ''' | sudo apt install docker-ce -y | ||
<syntaxhighlight lang=" | </syntaxhighlight> | ||
На хост-системе '''обязательно''' установите пакет qemu-user-static: | |||
<syntaxhighlight lang="bash"> | |||
sudo apt install -y qemu-user-static | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Не забудьте добавить пользователя в группу docker, чтобы не использовать sudo: | Не забудьте добавить пользователя в группу docker, чтобы не использовать sudo: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="bash"> | ||
sudo usermod -aG docker ${USER} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<blockquote>После добавления пользователя надо '''выйти-зайти''' чтобы изменения применились.</blockquote> | |||
==Скачивание скрипта == | |||
Создаем папку и скачиваем скрипт | |||
= | Более подробно читайте — [https://github.com/wirenboard/wirenboard в репозитории на GitHub] | ||
Скачать полностью репозиторий: | |||
<syntaxhighlight lang="bash"> | |||
mkdir ~/wirenboard-wbdev | |||
cd ~/wirenboard-wbdev | |||
git clone https://github.com/wirenboard/wirenboard | |||
cd wirenboard | |||
</syntaxhighlight> | |||
<syntaxhighlight lang=" | Скачать только скрипт. Пока не реализовано — сейчас в образе нет create_images.sh: | ||
<syntaxhighlight lang="bash"> | |||
mkdir -p ~/wirenboard-wbdev/wirenboard | |||
cd ~/wirenboard-wbdev/wirenboard | |||
mkdir ./output | |||
wget https://raw.githubusercontent.com/wirenboard/wirenboard/master/wbdev | |||
chmod +x wbdev | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== Выкачивание образа | ==Выкачивание образа== | ||
Запускаем: | Запускаем: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="bash"> | ||
./wbdev root exit | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<blockquote>'''Важно:''' Образ займет ~5.5 Гб на /var </blockquote> | |||
=Cборка образа= | =Cборка образа= | ||
==Автоматическая сборка== | ==Автоматическая сборка== | ||
Готовим файл с командами | Готовим файл с командами: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
cat << EOFcommand > tmp.sh | |||
#!/bin/bash | #!/bin/bash | ||
apt-get update | apt-get update | ||
apt-get install -y kpartx zip device-tree-compiler u-boot-tools libfdt1 binutils | apt-get install -y kpartx zip device-tree-compiler u-boot-tools=2016.11+dfsg1-4 libfdt1 binutils | ||
mount -t devtmpfs none /dev | mount -t devtmpfs none /dev | ||
export ROOTFS=./output/ | #echo "Remove exist rootfs for re-create (if need)" | ||
#rm -rf /rootfs/$WBDEV_TARGET | |||
#rm -rf ./output/rootfs_wb6x | |||
export ROOTFS=./output/rootfs_wb6x | |||
echo "Create new clean rootfs" | echo "Create new clean rootfs" | ||
rm -rf | rm -rf $ROOTFS | ||
/root/rootfs/create_rootfs.sh 6x | |||
echo "Create .fit image" | echo "Create .fit image" | ||
./image/create_images.sh | ./image/create_images.sh 6x | ||
echo " | echo "correct rights" | ||
chmod a+rw -R ./output/images/ | |||
rm tmp.sh | |||
EOFcommand | EOFcommand | ||
chmod a+x tmp.sh | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Запускаем контейнер, при этом передаем архитектуру «цели»: | |||
Запускаем | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
WBDEV_TARGET=stretch-armhf ./wbdev root ./tmp.sh | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<blockquote>'''Важно:''' Изменения внутри контейнера не сохранятся </blockquote> | <blockquote>'''Важно:''' Изменения внутри контейнера не сохранятся </blockquote> | ||
После завершения — «корневая» файловая система остается в каталоге ./output/rootfs_wb6x и доступна для следующего использования. Можно изменять и дополнять в «ручном» режиме. | |||
После завершения — «корневая» файловая система остается в каталоге | Готовый для загрузки в контроллер образ — в ./output/images/YYYYMMDDHHMM | ||
Готовый для загрузки в контроллер образ — в | |||
==Ручная сборка== | ==Ручная сборка== | ||
По сути — то же самое, но команды выполняются вручную, есть возможность изменить параметры. | По сути — то же самое, но команды выполняются вручную, есть возможность изменить параметры. | ||
=== Запуск контейнера === | === Запуск контейнера === | ||
Запускаем в том же каталоге | Запускаем в том же каталоге ~/wirenboard-wbdev/wirenboard следующую команду: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
~/wirenboard-wbdev/wirenboard | ~/wirenboard-wbdev/wirenboard | ||
WBDEV_TARGET=stretch-armhf ./wbdev root | |||
</syntaxhighlight> | </syntaxhighlight> | ||
и после запуска контейнера готовим среду, команды те же что и в «автоматическом» режиме: | и после запуска контейнера готовим среду, команды те же что и в «автоматическом» режиме: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="bash"> | ||
apt-get update && \ | |||
apt-get install -y kpartx zip device-tree-compiler u-boot-tools=2016.11+dfsg1-4 libfdt1 binutils && \ | apt-get install -y kpartx zip device-tree-compiler u-boot-tools=2016.11+dfsg1-4 libfdt1 binutils && \ | ||
mount -t devtmpfs none /dev | mount -t devtmpfs none /dev | ||
export ROOTFS=./output/rootfs_wb6x | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Подготовка rootfs === | === Подготовка rootfs === | ||
Если rootfs уже создана ранее, то просто указываем ее расположение (переменная ROOTFS). | Если rootfs уже создана ранее, то просто указываем ее расположение (переменная ROOTFS). | ||
Скрипт для подготовки корневой файловой системы находится в директории /root/rootfs. | |||
Синтаксис запуска скрипта create_rootfs.sh: | |||
Синтаксис запуска скрипта | |||
<pre> | <pre> | ||
$ ./create_rootfs.sh <board_ver> [<list of additional repos>] | $ ./create_rootfs.sh <board_ver> [<list of additional repos>] | ||
Строка 133: | Строка 120: | ||
Здесь: | Здесь: | ||
* ''board_ver'' — версия контроллера, для которого готовится образ. Допустимые значения: | * ''board_ver'' — версия контроллера, для которого готовится образ. Допустимые значения: | ||
** 6x — для Wiren Board 6-6.6 | ** 6x — для Wiren Board 6-6.6 | ||
** 5 — для Wiren Board 5 | ** 5 — для Wiren Board 5 | ||
Строка 150: | Строка 135: | ||
Зададим расположение ФС, уже существующей или вновь создаваемой: | Зададим расположение ФС, уже существующей или вновь создаваемой: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="bash"> | ||
export ROOTFS=./output/rootfs_wb6x | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Пример. Собираем базовую (без доп. репозиториев) корневую ФС в директории | Пример. Собираем базовую (без доп. репозиториев) корневую ФС в директории rootfs/rootfs для Wiren Board 5.5: | ||
< | <pre> | ||
$ cd rootfs | |||
$ ROOTFS=./rootfs/rootfs_55 ./create_rootfs.sh 55 | |||
</ | </pre> | ||
Если не используем уже существующую, то создаем: | Если не используем уже существующую, то создаем: | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="bash"> | ||
/root/rootfs/create_rootfs.sh 6x | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Если нет ошибок — можно переходить к следующему этапу. | Если нет ошибок — можно переходить к следующему этапу. | ||
=== Дополнительные репозитории === | === Дополнительные репозитории === <!--T:12--> | ||
<!--T:13--> | |||
Добавление дополнительных репозиториев необходимо, если вы хотите добавить свои версии пакетов в собираемую корневую ФС. | Добавление дополнительных репозиториев необходимо, если вы хотите добавить свои версии пакетов в собираемую корневую ФС. | ||
<!--T:14--> | |||
В скрипт передаются ''только адреса'' репозиториев. Например: | В скрипт передаются ''только адреса'' репозиториев. Например: | ||
< | <!--T:15--> | ||
<pre> | |||
</ | $ ./create_rootfs.sh 55 http://server1.net/ http://server2.net:8086/ | ||
</pre> | |||
<!--T:16--> | |||
Формат репозиториев соответствует тому, который создаётся с помощью утилиты [[Special:MyLanguage/wbrepo|wbrepo]]. К дополнительному репозиторию предъявляются требования: | Формат репозиториев соответствует тому, который создаётся с помощью утилиты [[Special:MyLanguage/wbrepo|wbrepo]]. К дополнительному репозиторию предъявляются требования: | ||
* В корне на сервере репозитория должен храниться публичный GPG-ключ в файле | <!--T:17--> | ||
* Имя используемого дистрибутива — testing | * В корне на сервере репозитория должен храниться публичный GPG-ключ в файле /repo.gpg.key. Например, если репозиторий расположен по адресу http://localhost:8086/, то ключ должен быть доступен по ссылке http://localhost:8086/repo.gpg.key | ||
* Имя используемого дистрибутива — testing | |||
* Используемый компонент — main | * Используемый компонент — main | ||
<!--T:18--> | |||
То есть, если передан адрес репозитория http://localhost:8086/, то в sources.list он будет представлен как | |||
То есть, если передан адрес репозитория http://localhost:8086/, то в | |||
<!--T:19--> | |||
<pre> | <pre> | ||
deb http://localhost:8086/ testing main | deb http://localhost:8086/ testing main | ||
</pre> | </pre> | ||
=== Работа внутри корневой ФС === | === Работа внутри корневой ФС === | ||
Для того чтобы установить какие-нибудь дополнительные пакеты в корневую систему используется chroot. | Для того чтобы установить какие-нибудь дополнительные пакеты в корневую систему используется chroot. | ||
<syntaxhighlight lang="bash"> | |||
</syntaxhighlight> | </syntaxhighlight> | ||
TODO: раздел В процессе редактирования | |||
< | |||
== Сборка образа для загрузки на контроллер == <!--T:20--> | |||
< | <!--T:21--> | ||
''TODO: раздел требует дополнения'' | |||
<!--T:22--> | |||
Скрипты для сборки образов находятся в директории images. Перед сборкой образа необходима готовая корневая ФС. | |||
<!--T:23--> | |||
< | Дополнительно на хост-машине потребуются утилиты (названия приведены для Debian/Ubuntu): | ||
<!--T:24--> | |||
* kpartx | |||
* device-tree-compiler | |||
* u-boot-tools | |||
< | <!--T:25--> | ||
Пример: собираем образ прошивки для Wiren Board 5, корневая ФС находится по пути rootfs/rootfs/: | |||
<!--T:26--> | |||
<pre> | |||
$ cd image | |||
$ ./create_images_wb5.sh ../rootfs/rootfs/ <tag> | |||
</pre> | |||
< | <!--T:27--> | ||
Здесь ''tag'' — суффикс, который будет добавлен к имени файла образа. | |||
Готовый образ будет лежать по пути | <!--T:28--> | ||
Готовый образ будет лежать по пути image/image/wb5/<current_datetime>/<current_datetime>_emmc_<tag>.img. | |||
== См. также == | == См. также == <!--T:29--> | ||
<!--T:30--> | |||
* [[Special:MyLanguage/Обновление прошивки|Обновление прошивки]] | * [[Special:MyLanguage/Обновление прошивки|Обновление прошивки]] | ||
* [[Wiren Board 5: Восстановление прошивки|Wiren Board 5: Восстановление прошивки]] | * [[Wiren Board 5: Восстановление прошивки|Wiren Board 5: Восстановление прошивки]] | ||
</translate> |
Версия 16:29, 2 декабря 2020
Для сборки образов прошивки контроллера мы подготовили специальный образ Docker. Сборку можно производить внутри этого образа в автоматическом или ручном режиме. После предварительной настройки окружения можно использовать скрипты для сборки без контейнера.
Подготовка
Актуально до ядра 4.22 включительно. Раздел в процессе правки.
Установка Docker и подготовка хост-системы
Перый шаг — это установка Docker. В зависимости от используемого дистрибутива — устанавливается по-разному, для Debian:
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce -y
На хост-системе обязательно установите пакет qemu-user-static:
sudo apt install -y qemu-user-static
Не забудьте добавить пользователя в группу docker, чтобы не использовать sudo:
sudo usermod -aG docker ${USER}
После добавления пользователя надо выйти-зайти чтобы изменения применились.
Скачивание скрипта
Создаем папку и скачиваем скрипт
Более подробно читайте — в репозитории на GitHub
Скачать полностью репозиторий:
mkdir ~/wirenboard-wbdev
cd ~/wirenboard-wbdev
git clone https://github.com/wirenboard/wirenboard
cd wirenboard
Скачать только скрипт. Пока не реализовано — сейчас в образе нет create_images.sh:
mkdir -p ~/wirenboard-wbdev/wirenboard
cd ~/wirenboard-wbdev/wirenboard
mkdir ./output
wget https://raw.githubusercontent.com/wirenboard/wirenboard/master/wbdev
chmod +x wbdev
Выкачивание образа
Запускаем:
./wbdev root exit
Важно: Образ займет ~5.5 Гб на /var
Cборка образа
Автоматическая сборка
Готовим файл с командами:
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
#echo "Remove exist rootfs for re-create (if need)"
#rm -rf /rootfs/$WBDEV_TARGET
#rm -rf ./output/rootfs_wb6x
export ROOTFS=./output/rootfs_wb6x
echo "Create new clean rootfs"
rm -rf $ROOTFS
/root/rootfs/create_rootfs.sh 6x
echo "Create .fit image"
./image/create_images.sh 6x
echo "correct rights"
chmod a+rw -R ./output/images/
rm tmp.sh
EOFcommand
chmod a+x tmp.sh
Запускаем контейнер, при этом передаем архитектуру «цели»:
WBDEV_TARGET=stretch-armhf ./wbdev root ./tmp.sh
Важно: Изменения внутри контейнера не сохранятся
После завершения — «корневая» файловая система остается в каталоге ./output/rootfs_wb6x и доступна для следующего использования. Можно изменять и дополнять в «ручном» режиме. Готовый для загрузки в контроллер образ — в ./output/images/YYYYMMDDHHMM
Ручная сборка
По сути — то же самое, но команды выполняются вручную, есть возможность изменить параметры.
Запуск контейнера
Запускаем в том же каталоге ~/wirenboard-wbdev/wirenboard следующую команду:
~/wirenboard-wbdev/wirenboard
WBDEV_TARGET=stretch-armhf ./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
export ROOTFS=./output/rootfs_wb6x
Подготовка rootfs
Если rootfs уже создана ранее, то просто указываем ее расположение (переменная ROOTFS).
Скрипт для подготовки корневой файловой системы находится в директории /root/rootfs.
Синтаксис запуска скрипта create_rootfs.sh:
$ ./create_rootfs.sh <board_ver> [<list of additional repos>]
Здесь:
- board_ver — версия контроллера, для которого готовится образ. Допустимые значения:
- 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
Если не используем уже существующую, то создаем:
/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.
TODO: раздел В процессе редактирования
Сборка образа для загрузки на контроллер
TODO: раздел требует дополнения
Скрипты для сборки образов находятся в директории images. Перед сборкой образа необходима готовая корневая ФС.
Дополнительно на хост-машине потребуются утилиты (названия приведены для Debian/Ubuntu):
- kpartx
- device-tree-compiler
- u-boot-tools
Пример: собираем образ прошивки для 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.