Skip to main content

Зачем нужны A/B разделы?

Во встраиваемых системах неудачные обновления могут привести к поломке устройств. Схема A/B решает эту проблему, поддерживая две корневые файловые системы:

  • Слот A - активная rootfs
  • Слот B - резервный rootfs для следующего обновления

Когда обновление проходит успешно, загрузчик переключается на новый слот. Если загрузка не удалась, он откатывается к последней известной хорошей версии.

Этот подход предполагает, что слот A и слот B имеют одинаковый размер раздела, что может быть иногда затруднительно во встроенных системах, когда ресурсы ограничены.

swupdate с системой спасения

Другой подход заключается в том, чтобы создать разделы для маленькой спасательной системы и больший раздел для обычной работающей системы.

Пример расположения разделов

Типичный Raspberry Pi Compute Module 5 (CM5) раскладка может выглядеть следующим образом:
РазделТипНазначение
p1FAT32/boot_A (ядро, cmdline, загрузчик)
p2ext4rootfs A
p3FAT32/boot_B (ядро, cmdline, загрузчик для спасательной системы)
p4ext4rootfs_B
p5ext4данные / конфигурация
Загрузчик может использовать флаг (например, GPIO17=1 в rpi-eeprom), чтобы определить, загружаться ли со спасательного раздела.

Практический пример

Эта настройка демонстрируется в двух rpi-image-genпримерах проектов:

В первом случае создается спасательная система, а во втором - спасательная система объединяется с другой работающей системой, настраивая метки разделов в cmdline.txt и fstab.

Управляющее обновление

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

Интеграция с SWUpdate

SWUpdate поддерживает стратегии обновления с двумя корневыми системами (A/B).
Разделы и логика обновления определяются непосредственно в sw-description файле.

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