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

Материал из Wiren Board
Метка: visualeditor
(Перенаправление на Wiren Board Software)
Метка: новое перенаправление
 
(не показано 310 промежуточных версий 13 участников)
Строка 1: Строка 1:
== Частичное обновление прошивки через APT ==
#REDIRECT [[Wiren_Board_Software]]
В этом способе обновление прошивки производится по частям с помощью системного менеджера пакетов операционной системы Debian.
 
Преимущество этого способа состоит в том, что обновление происходит быстро,  можно обновлять только нужные компоненты и этот способ меньше всего влияет на пользовательские файлы и настройки.
 
Недостаток способа - необходимость ответственно подходить к процессу и не делать необдуманных действий: неосторожное использование инструмента может привести к неполной установке или даже к удалению важных компонентов ПО контроллеров Wiren Board
 
=== Обновление списка пакетов ===
Перед началом работы нужно получить актуальный список пакетов из репозиториев Debian и Wiren Board.
 
== Обновление прошивки через веб-интерфейс ==
#Обновление прошивки происходит путём перезаписи раздела накопителя контроллера с операционной системой и всеми установленными программами. При этом не затрагиваются файлы, находящиеся в папках (они находятся на другом разделе). Подробнее ознакомиться с файлами, удаляющимися при обновлении системы, можно [[Пропажа_файлов_при_обновлении_прошивки|в разделе:]]  
#*''/etc/''
#*...
#:В этих папках хранятся все изменения, которые можно сделать через веб-интерфейс, включая настройки со страницу ''Configs'', все подключённые устройства и виджеты - все эти данные сохранятся.
#:Если вы хранили данные на контроллере самостоятельно в других папках, или устанавливали собственное ПО, оно '''будет потеряно'''. Вы можете загрузить нужные файлы себе на компьютер перед обновлением по инструкции [[Просмотр файлов контроллера с компьютера]].
#Скачайте свежую версию прошивки со страницы [https://github.com/contactless/wirenboard/releases https://github.com/contactless/wirenboard/releases]. Файлы прошивок имеют расширение ''.fit''.[[File:Firmware-update-github.png|400px|center|thumb|Файл прошивки с расширением ''.fit'' на Github]]
#Зайдите в [[Веб-интерфейс Wiren Board|веб-интерфейс]] на страницу ''Settings''. Найдите раздел ''Firmware update'', нажмите кнопку ''Select file'', выберите ранее скачанный файл прошивки.[[File:web-settings.png|400px|thumb|center|Нажмите кнопку ''Select file'' для загрузки файла прошивки]]
#Файл с новой прошивкой загрузится на контроллер, после этого начнётся процесс обновления. Не закрывайте страницу обновления и не производите никаких действий с контроллером, в том числе в веб-интерфейсе. Процесс обновления займёт до 10 минут.[[File:Web-settings-firmware-update-messages.png|400px|center|thumb|Во время обновления на странице появляются системные сообщения]]
#После установки новой прошивки контроллер перезагрузится. После этого на странице обновления появится сообщение об успешном завершении обновления - ''Firmware update complete''.[[File:Web-settings-firmware-update-completed.png|400px|center|thumb|Оповещение об успешном обновлении]]
 
== Перезапись прошивки ==
 
Для Wiren Board 5 см. [[Wiren Board 5: Восстановление прошивки]].
 
Для других версий контроллера см. [[Создание microSD-карты с образом]].
 
 
== Информация для разработчиков ==
=== Формат файла обновления ===
Используется Flattened Image Table (FIT). Это современный формат используемый u-boot для хранения нескольких частей прошивки в одном файле. Фактически этот формат совместим с Device Tree (DTB) и для работы с ним используются те же утилиты (dtc, fdtget, ...).
 
Преимущества FIT:
* Легкий доступ к содержимому как из Linux, так и из u-boot
* Хранение метаданных и нескольких бинарных блобов в одном и том же файле
* Поддержка контрольных сумм (SHA1) и криптографических подписей (RSA) для каждой части образа
* Скорость работы из-за возможности случайного доступа к любой части
 
Более подробно о FIT можно узнать из [https://lxr.missinglinkelectronics.com/#uboot/doc/uImage.FIT/howto.txt документации u-boot].
 
Обновление для Wiren Board в формате FIT содержит следующие элементы:
* '''Метаданные''': описание, версия, информация о модели для которой предназначено обновление, и т.д. Эта информация хранится в свойствах (properties) корневого узла и на данный момент не используется
* '''install''': bash-скрипт, который запускается в Linux после загрузки образа. Этот скрипт и производит всю работу по обновлению
* Прочие образы, используемые скриптом '''install'''. Текущая реализация этого скрипта поддерживает один образ '''rootfs''', содержащий корневую файловую систему в виде tar.gz
 
=== Схема разделов microSD/eMMC ===
 
* /dev/mmcblk0p1 (16M): содержит загрузчик u-boot
* /dev/mmcblk0p2 (1024M): первая rootfs
* /dev/mmcblk0p3 (1024M): вторая rootfs
* /dev/mmcblk0p4: расширенный раздел FAT, напрямую не используется
* /dev/mmcblk0p5 (256M): swap
* /dev/mmcblk0p6 (остальное место): общие для обоих rootfs данные (конфиги, логи, ...), монтируется в /mnt/data
 
Наличие двух независимых экземпляров rootfs позволяет в случае многократной неудачной загрузки с одной из них переключиться на другой экземпляр (например, при неудачном обновлении или порче файловой системы), а отдельный раздел /mnt/data позволяет при этом сохранить пользовательские настройки.
 
Отдельный общий для двух rootfs раздел /mnt/data позволяет иметь некоторые части системной конфигурации одинаковыми. Например, это важно для настроек сети и авторизации. Так же на этом разделе хранятся логи, база данных MQTT, кэш apt и директория закачек веб-сервера (чтоб не занимать место на rootfs).
 
Образ SD-карты, создаваемый скриптом ''image/create_image.sh'' содержит только uboot и первую rootfs. Остальные разделы создаются при необходимости при первой загрузке.
 
При первой загрузке rootfs некоторые файлы переносятся в /mnt/data с сохранением бэкапов в rootfs и заменой оригиналов симлинками. Это происходит в скрипте /etc/rc.local, выполняющимся последним при загрузке. Если нужный файл уже существует в /mnt/data, то он используется без замены - это необходимо для использования имеющейся конфигурации при загрузке "свежей" rootfs после обновления прошивки. Также этот раздел можно очистить, при этом после перезагрузки будет восстановлена стандартная конфигурация.
 
=== Переключение rootfs при ошибках загрузки ===
 
Реализована с помощью функции u-boot [http://www.denx.de/wiki/view/DULG/UBootBootCountLimit Boot Count Limit]
Используются следующие переменные окружения:
* '''bootcount''' - счетчик попыток загрузки, увеличивается на 1 при каждом входе в u-boot
* '''bootlimit''' - максимальное значение '''bootcount''' при превышении которого происходит переключение активной rootfs
* '''mmcpart''' - хранит номер раздела текущей активной rootfs (2 или 3)
* '''altbootcmd''' - команда, выполняющяяся при превышении '''bootlimit''': изменяет '''mmcpart''' и обнуляет '''bootcount''' для того, чтоб попытки загрузки с альтернативной rootfs считались заново
* '''upgrade_available''' - должна быть равна 1 чтобы весь этот механизм работал
 
При удачной загрузке переменная bootcount устанавливается в 0 из скрипта /etc/init.d/wb-init, выполняющимся предпоследним перед rc.
 
=== Сборка FIT-образа обновления ===
 
Все нужные скрипты есть в репозитории wirenboard.
 
<syntaxhighlight lang="bash">
$ cd wirenboard
$ ./image/create_update.sh <path_to_roots> <update file>
</syntaxhighlight>
 
При этом в апдейт включается '''install''' из файла '''image/install_update.sh''' и собирается tar.gz с rootfs из указанной директории (также можно указать уже имеющийся tar.gz).
 
=== Загрузка обновления на контроллер ===
 
<syntaxhighlight lang="bash">
$ curl -v -F "file=@wb-update.fit" http://192.168.0.33/fwupdate/upload
</syntaxhighlight>
 
Загруженный файл попадает в ''/var/www/uploads/'', где обнаруживается скриптом '''wb-watch-update''' и при полной загрузке (проверяется наличие сигнатуры в конце файла) - запускается скрипт '''wb-run-update''' (оба этих скрипта лежат в пакете ''wb-utils''), который проверяет контрольную сумму скрипта '''install''' и запускает его на исполнение.
 
Лог выполнения обновления сохраняется в файл ''/var/log/update.log'' (он же ''/mnt/data/var/log/update.log'')

Текущая версия на 17:28, 20 декабря 2023

Перенаправление на: