wb_editors
156
правок
м (→Сборка FIT-образа обновления: Поправил текст) |
N.maslov (обсуждение | вклад) |
||
(не показано 8 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE: Обновление прошивки, информация для разработчиков}} | |||
Информация | === Предупреждение === | ||
Информация на этой странице предназначена для разработчиков, планирующих вносить изменения в систему обновления контроллеров Wiren Board. | |||
Информация для пользователей находится на странице [[Обновление прошивки]]. | Информация для пользователей находится на странице [[Обновление прошивки]]. | ||
Строка 9: | Строка 11: | ||
Преимущества FIT: | Преимущества FIT: | ||
* Легкий доступ к содержимому как из Linux, так и из u-boot | * Легкий доступ к содержимому как из Linux, так и из u-boot. | ||
* Хранение метаданных и нескольких бинарных блобов в одном и том же файле | * Хранение метаданных и нескольких бинарных блобов в одном и том же файле. | ||
* Поддержка контрольных сумм (SHA1) и криптографических подписей (RSA) для каждой части образа | * Поддержка контрольных сумм (SHA1) и криптографических подписей (RSA) для каждой части образа. | ||
* | * Высокая скорость работы из-за возможности случайного доступа к любой части. | ||
Более подробно о 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]. | ||
Обновление для Wiren Board в формате FIT содержит следующие элементы: | Обновление для Wiren Board в формате FIT содержит следующие элементы: | ||
* '''Метаданные''': описание, версия, информация о модели для которой предназначено обновление, и т.д. Эта информация хранится в свойствах (properties) корневого узла и | * '''Метаданные''': описание, версия, информация о модели для которой предназначено обновление, и т.д. Эта информация хранится в свойствах (properties) корневого узла и пока не используется. | ||
* '''install''': bash-скрипт, который запускается в Linux после загрузки образа. Этот скрипт и производит всю работу по обновлению | * '''install''': bash-скрипт, который запускается в Linux после загрузки образа. Этот скрипт и производит всю работу по обновлению. | ||
* Прочие образы, используемые скриптом '''install'''. Текущая реализация этого скрипта поддерживает один образ '''rootfs''', содержащий корневую файловую систему в виде tar.gz | * Прочие образы, используемые скриптом '''install'''. Текущая реализация этого скрипта поддерживает один образ '''rootfs''', содержащий корневую файловую систему в виде tar.gz. | ||
=== Схема разделов microSD/eMMC === | === Схема разделов microSD/eMMC === | ||
* /dev/mmcblk0p1 | * <code>/dev/mmcblk0p1</code> 16 Мб, содержит загрузчик u-boot. | ||
* /dev/mmcblk0p2 | * <code>/dev/mmcblk0p2</code> 1024 Мб, первая rootfs. | ||
* /dev/mmcblk0p3 | * <code>/dev/mmcblk0p3</code> 1024 Мб, вторая rootfs. | ||
* /dev/mmcblk0p4 | * <code>/dev/mmcblk0p4</code> расширенный раздел MBR, напрямую не используется. | ||
* /dev/mmcblk0p5 | * <code>/dev/mmcblk0p5</code> 256 Мб, swap. | ||
* /dev/mmcblk0p6 | * <code>/dev/mmcblk0p6</code> остальное место — общие для обоих rootfs данные: конфиги, логи и т.п., монтируется в <code>/mnt/data</code>. | ||
Наличие двух независимых экземпляров rootfs позволяет | Наличие двух независимых экземпляров rootfs позволяет при многократной неудачной загрузке с одного из них переключиться на другой. Это может быть полезным при неудачном обновлении или порче файловой системы. Отдельный раздел <code>/mnt/data</code> позволяет сохранить пользовательские настройки. | ||
Отдельный | Отдельный раздел <code>/mnt/data</code> является общим для двух rootfs, что позволяет иметь некоторые части системной конфигурации одинаковыми: настройки сети и параметры авторизации. Так же на этом разделе хранятся логи, база данных MQTT, кэш apt и директория закачек веб-сервера. Такой подход позволяет уменьшить размер каждой из rootfs. | ||
Образ SD-карты, создаваемый скриптом | Образ SD-карты, создаваемый скриптом <code>image/create_image.sh</code> содержит только uboot и первую rootfs. Остальные разделы создаются при первой загрузке. | ||
При первой загрузке rootfs некоторые файлы переносятся в /mnt/data с сохранением бэкапов в rootfs и заменой оригиналов симлинками. Это происходит в скрипте /etc/rc.local, выполняющимся последним при загрузке. Если нужный файл уже существует в /mnt/data, то он используется без замены | При первой загрузке rootfs некоторые файлы переносятся в <code>/mnt/data</code> с сохранением бэкапов в rootfs и заменой оригиналов симлинками. Это происходит в скрипте <code>/etc/rc.local</code>, выполняющимся последним при загрузке. Если нужный файл уже существует в <code>/mnt/data</code>, то он используется без замены — это необходимо для использования имеющейся конфигурации при загрузке «свежей» rootfs после обновления прошивки. Также этот раздел можно очистить, при этом после перезагрузки будет восстановлена стандартная конфигурация. | ||
=== Переключение rootfs при ошибках загрузки === | === Переключение rootfs при ошибках загрузки === | ||
Реализована с помощью функции u-boot [http://www.denx.de/wiki/view/DULG/UBootBootCountLimit Boot Count Limit] | Реализована с помощью функции u-boot [http://www.denx.de/wiki/view/DULG/UBootBootCountLimit Boot Count Limit] | ||
Используются следующие переменные окружения: | Используются следующие переменные окружения: | ||
* '''bootcount''' | * '''bootcount''' — счетчик попыток загрузки, увеличивается на 1 при каждом входе в u-boot. | ||
* '''bootlimit''' | * '''bootlimit''' — максимальное значение '''bootcount''' при превышении которого происходит переключение активной rootfs. | ||
* '''mmcpart''' | * '''mmcpart''' — хранит номер раздела текущей активной rootfs (2 или 3). | ||
* '''altbootcmd''' | * '''altbootcmd''' — команда, выполняющяяся при превышении '''bootlimit''': изменяет '''mmcpart''' и обнуляет '''bootcount''' для того, чтоб попытки загрузки с альтернативной rootfs считались заново. | ||
* '''upgrade_available''' | * '''upgrade_available''' — должна быть равна 1 чтобы весь этот механизм работал. | ||
При удачной загрузке переменная bootcount устанавливается в | При удачной загрузке переменная bootcount устанавливается в «0» из скрипта <code>/etc/init.d/wb-init</code>, выполняющимся предпоследним перед rc. | ||
=== Сборка FIT-образа обновления === | === Сборка FIT-образа обновления === | ||
Строка 59: | Строка 62: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
При этом в апдейт включается '''install''' из файла '''image/install_update.sh''' и собирается tar.gz с rootfs из указанной директории (также можно указать уже имеющийся tar.gz). Подробную инструкцию можете прочитать в статье | При этом в апдейт включается '''install''' из файла '''image/install_update.sh''' и собирается tar.gz с rootfs из указанной директории (также можно указать уже имеющийся tar.gz). | ||
«[[Сборка_образов_прошивки|Сборка образов прошивки]]». | |||
Подробную инструкцию можете прочитать в статье «[[Сборка_образов_прошивки|Сборка образов прошивки]]». | |||
=== Загрузка обновления на контроллер === | === Загрузка обновления на контроллер === | ||
Строка 68: | Строка 72: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Загруженный файл попадает в | Загруженный файл попадает в <code>/var/www/uploads/</code>, где обнаруживается скриптом '''wb-watch-update''' и при полной загрузке (проверяется наличие сигнатуры в конце файла) — запускается скрипт '''wb-run-update''' (оба этих скрипта лежат в пакете <code>wb-utils</code>), который проверяет контрольную сумму скрипта '''install''' и запускает его на исполнение. | ||
Лог выполнения обновления сохраняется в файл | Лог выполнения обновления сохраняется в файл <code>/var/log/update.log</code>, он же <code>/mnt/data/var/log/update.log</code>. |