Функція снепшотів (знімків) файлової системи: /sbin/snapshot
Ця функція була згадана в анонсі Barrier Breaker, але потребувала документації. Нижченаведена інформація взята з листування на розсилці Battlemesh від розробника, який реалізував цю функцію.
Сценарії використання
Є багато ситуацій, де це корисно, але ця система не є заміною jffs2.
Ця технологія орієнтована на масові розгортання, коли багато пристроїв працюють на однаковій прошивці та повинні отримувати однакові оновлення одночасно.
Мета — зберігати конфігурацію та невеликі зміни у вигляді ланцюжка блоків. Зрештою, все працює на tmpfs.
Основна перевага: можна просто відкотитися до попереднього знімка, якщо щось пішло не так. Наприклад, тригером для відкaту може бути ситуація, коли “неможливо під’єднатись до mesh-мережі”.
Деталі реалізації
Зазвичай у OpenWrt використовується поєднання squashfs + jffs2 overlay. У цій реалізації:
- rootfs_data більше не використовується для jffs2 - натомість використовується для зберігання ланцюжка блоків, вирівняних за розміром сторінки flash (erasesize) - кожен блок містить заголовок та tar-архів - заголовок містить: розмір, хеш, тип - є два типи блоків: snapshot та volatile - блок типу volatile може бути лише один і завжди останній у ланцюжку
Під час завантаження:
1. Монтується squashfs як базова rootfs
2. Поверх неї — overlayfs, але замість jffs2 використовується tmpfs
3. Потім розпаковуються tar-архіви з блоків у вказаному порядку
4. Після всіх snapshot-блоків виконується додатковий overlay з tmpfs та volatile-блоком
У підсумку ми маємо багатошаровий overlay, де:
- `/snapshot` — знімок (delta) початкового стану
- `/overlay` — зміни, що відбулись після останнього завантаження
Використання
Цей інструмент доступний за замовчуванням у Barrier Breaker.
Після завантаження та ініціалізації jffs2 виконайте:
snapshot convert
Це перетворить поточні зміни overlay у ланцюжок з одним volatile-блоком. Тепер система працює подібно до initramfs — зміни у `/etc/config/` не зберігаються після перезавантаження.
Щоб зберегти зміни в overlay у volatile-блок:
snapshot config
Коли ви задоволені поточним станом — можна створити статичний знімок:
snapshot push
Під час перезапису блоків (наприклад, заміни volatile або конвертації у snapshot), використовуються останні сектори флеш-пам’яті як резервна буферна зона. Це дозволяє зберігати попередню версію даних для відкату у разі помилки.
Оновлення знімка з оновленням прошивки:
snapshot upgrade
Ця команда:
- шукає доступні оновлення (наприклад, через `opkg`)
- якщо знаходить — встановлює
- автоматично створює новий знімок після встановлення