Wiren Board Firmware Update: различия между версиями

Нет описания правки
Строка 2: Строка 2:
'''Внимание! На данный момент эта функция является экспериментальной.'''
'''Внимание! На данный момент эта функция является экспериментальной.'''
</blockquote>
</blockquote>
== Обновление прошивки через веб-интерфейс ==


== Общая информация ==
 
 
 
== Информация для разработчиков ==
=== Формат файла обновления ===
=== Формат файла обновления ===
Используется Flattened Image Table (FIT). Это современный формат используемый u-boot для хранения нескольких частей прошивки в одном файле. Фактически этот формат совместим с Device Tree (DTB) и для работы с ним используются те же утилиты (dtc, fdtget, ...).
Используется Flattened Image Table (FIT). Это современный формат используемый u-boot для хранения нескольких частей прошивки в одном файле. Фактически этот формат совместим с Device Tree (DTB) и для работы с ним используются те же утилиты (dtc, fdtget, ...).
Строка 15: Строка 19:
Более подробно о FIT можно узнать из [https://lxr.missinglinkelectronics.com/#uboot/doc/uImage.FIT/howto.txt документации u-boot].
Более подробно о FIT можно узнать из [https://lxr.missinglinkelectronics.com/#uboot/doc/uImage.FIT/howto.txt документации u-boot].


Обновление для WirenBoard в формате FIT содержит следующие элементы:
Обновление для Wiren Board в формате FIT содержит следующие элементы:
* '''Метаданные''': описание, версия, информация о модели для которой предназначено обновление, и т.д. Эта информация хранится в свойствах (properties) корневого узла и на данный момент не используется
* '''Метаданные''': описание, версия, информация о модели для которой предназначено обновление, и т.д. Эта информация хранится в свойствах (properties) корневого узла и на данный момент не используется
* '''install''': bash-скрипт, который запускается в Linux после загрузки образа. Этот скрипт и производит всю работу по обновлению
* '''install''': bash-скрипт, который запускается в Linux после загрузки образа. Этот скрипт и производит всю работу по обновлению
Строка 33: Строка 37:
Отдельный общий для двух rootfs раздел /mnt/data позволяет иметь некоторые части системной конфигурации одинаковыми. Например, это важно для настроек сети и авторизации. Так же на этом разделе хранятся логи, база данных MQTT, кэш apt и директория закачек веб-сервера (чтоб не занимать место на rootfs).
Отдельный общий для двух rootfs раздел /mnt/data позволяет иметь некоторые части системной конфигурации одинаковыми. Например, это важно для настроек сети и авторизации. Так же на этом разделе хранятся логи, база данных MQTT, кэш apt и директория закачек веб-сервера (чтоб не занимать место на rootfs).


Образ SD-карты, создаваемый скриптом image/create_image.sh содержит только uboot и первую rootfs. Остальные разделы создаются при необходимости при первой загрузке.
Образ SD-карты, создаваемый скриптом ''image/create_image.sh'' содержит только uboot и первую rootfs. Остальные разделы создаются при необходимости при первой загрузке.


При первой загрузке rootfs некоторые файлы переносятся в /mnt/data с сохранением бэкапов в rootfs и заменой оригиналов симлинками. Это происходит в скрипте /etc/rc.local, выполняющимся последним при загрузке. Если нужный файл уже существует в /mnt/data, то он используется без замены - это необходимо для использования имеющейся конфигурации при загрузке "свежей" rootfs после обновления прошивки. Также этот раздел можно очистить, при этом после перезагрузки будет восстановлена стандартная конфигурация.
При первой загрузке rootfs некоторые файлы переносятся в /mnt/data с сохранением бэкапов в rootfs и заменой оригиналов симлинками. Это происходит в скрипте /etc/rc.local, выполняющимся последним при загрузке. Если нужный файл уже существует в /mnt/data, то он используется без замены - это необходимо для использования имеющейся конфигурации при загрузке "свежей" rootfs после обновления прошивки. Также этот раздел можно очистить, при этом после перезагрузки будет восстановлена стандартная конфигурация.
Строка 58: Строка 62:
Все нужные скрипты есть в той же ветке репозитория wirenboard.
Все нужные скрипты есть в той же ветке репозитория wirenboard.


<code>
<syntaxhighlight lang="bash">
$ cd wirenboard
$ cd wirenboard
$ ./image/create_update.sh <path_to_roots> <update file>
$ ./image/create_update.sh <path_to_roots> <update file>
</code>
</syntaxhighlight>


При этом в апдейт включается '''install''' из файла '''image/install_update.sh''' и собирается tar.gz с rootfs из указанной директории (также можно указать уже имеющийся tar.gz).
При этом в апдейт включается '''install''' из файла '''image/install_update.sh''' и собирается tar.gz с rootfs из указанной директории (также можно указать уже имеющийся tar.gz).


== Загрузка обновления на WirenBoard ==
== Загрузка обновления на Wiren Board ==


<code>
<syntaxhighlight lang="bash">
$ curl -v -F "file=@wb-update.fit" http://192.168.0.33/fwupdate/upload
$ curl -v -F "file=@wb-update.fit" http://192.168.0.33/fwupdate/upload
</code>
</syntaxhighlight>


Загруженный файл попадает в /var/www/uploads/, где обнаруживается скриптом '''wb-watch-update''' и при полной загрузке (проверяется наличие сигнатуры в конце файла) - запускается скрипт '''wb-run-update''' (оба этих скрипта лежат в пакете wb-utils), который проверяет контрольную сумму скрипта '''install''' и запускает его на исполнение.
Загруженный файл попадает в /var/www/uploads/, где обнаруживается скриптом '''wb-watch-update''' и при полной загрузке (проверяется наличие сигнатуры в конце файла) - запускается скрипт '''wb-run-update''' (оба этих скрипта лежат в пакете wb-utils), который проверяет контрольную сумму скрипта '''install''' и запускает его на исполнение.


Лог выполнения обновления сохраняется в файл /var/log/update.log (он же /mnt/data/var/log/update.log)
Лог выполнения обновления сохраняется в файл /var/log/update.log (он же /mnt/data/var/log/update.log)