Зачем нужны A/B разделы?
Во встраиваемых системах неудачные обновления могут привести к поломке устройств. Схема A/B решает эту проблему, поддерживая две корневые файловые системы:
- Слот A - активная rootfs
- Слот B - резервный rootfs для следующего обновления
Когда обновление проходит успешно, загрузчик переключается на новый слот. Если загрузка не удалась, он откатывается к последней известной хорошей версии.
Этот подход предполагает, что слот A и слот B имеют одинаковый размер раздела, что может быть иногда затруднительно во встроенных системах, когда ресурсы ограничены.
Другой подход заключается в том, чтобы создать разделы для маленькой спасательной системы и больший раздел для обычной работающей системы.
Пример расположения разделов
| Раздел | Тип | Назначение |
|---|---|---|
| p1 | FAT32 | /boot_A (ядро, cmdline, загрузчик) |
| p2 | ext4 | rootfs A |
| p3 | FAT32 | /boot_B (ядро, cmdline, загрузчик для спасательной системы) |
| p4 | ext4 | rootfs_B |
| p5 | ext4 | данные / конфигурация |
Практический пример
Эта настройка демонстрируется в двух rpi-image-genпримерах проектов:
- https://github.com/interelectronix/rpi-image-gen-projects/blob/main/deb12-cm5-rescue/README.md
- https://github.com/interelectronix/rpi-image-gen-projects/blob/main/deb12-cm5-ix-base/README.md
В первом случае создается спасательная система, а во втором - спасательная система объединяется с другой работающей системой, настраивая метки разделов в cmdline.txt и fstab.
Управляющее обновление
Вы можете смонтировать неактивный системный раздел вручную, чтобы обновить конфигурации, приложения или компоненты системы.
В производственных системах обновлениями обычно управляют с помощью SWUpdate, который безопасно автоматизирует этот процесс.
Интеграция с SWUpdate
SWUpdate поддерживает стратегии обновления с двумя корневыми системами (A/B).
Разделы и логика обновления определяются непосредственно в sw-description файле.
Такой подход обеспечивает атомарное обновление системы со встроенной безопасностью отката - важная особенность для безголовых или удаленных устройств, где ручное восстановление не представляется возможным.
Статьи из этой серии
- Building a Production-Ready Linux for Raspberry Pi Compute Module 5
- От стоковой ОС к производственной платформе
- Customizing Raspberry Pi OS with rpi-image-gen
- Устойчивость системы - Проектирование корневой файловой системы A/B.
- Provisioning — Automating First Boot with rpi-sb-provisioner
- OTA and Lifecycle — Software Updates with SWUpdate
Источники
- rpi-image-gen: https://github.com/raspberrypi/rpi-image-gen
- rpi-sb-provisioner: https://github.com/raspberrypi/rpi-sb-provisioner
- SWUpdate: https://github.com/sbabic/swupdate
- swugenerator: https://github.com/sbabic/swugenerator