OSTree -- атомарные обновления ОС в стиле git
LVEE 2018
Что такое OSTree
OSTree предназначен для создания неизменяемых файловых систем в стиле git, обеспечивая атомарные обновления и откаты ОС. Проект предоставляет собой референсную библиотеку для работы с репозиториями `ostree`, а также утилиту командной строки, позволяющей производить все необходимые операции над локальным репозиторием.
В локальном `ostree` репозитории хранятся “снимки” файлов и директорий, позволяя быстро переключать корневую систему, ядро и конфигурацию загрузчика на любой из доступных вариантов.
Серверный репозиторий предназначен для использования в качестве источника обновлений поверх HTTP/HTTPS протокола. Возможность использования GPG-подписи отдельных коммитов, а также внутренняя архитектура репозитория, позволяют тиражировать серверный репозиторий и использовать его для обновлений даже из недоверенных источников.
Локальная архитектура OSTree
OSTree предназначен для работы поверх любой POSIX-совместимой файловой системы.
В репозитории `/ostree/repo` хранятся файловые объекты, а также ссылки на них — в этом репозиторий `ostree` очень похож на репозиторий `git`. Имена всех объектов в системе представляют собой sha256 хэш от содержимого, таким образом обеспечивается автоматическая дедупликация данных на уровне репозитория.
В репозитории присутствуют 3 базовых типа файлов:
.commit — описание коммита, а также “имя” корневой директории .dirtree — список файловых объектов в директории .file — файл
В отличие от git, при разворачивании (checkout, deploy) все файлы создаются в виде жёсткой ссылки на изначальный файл, находящийся в репозитории, что накладывает серьёзное ограничение — репозиторий и развёрнутый корень системы обязаны находится на одной ФС.
Директорий `/ostree/deploy` хранит развернутые корневые файловые системы в поддиректории, соответствующей имени операционной системы. Да, OSTree позволяет устанавливать и переключаться между несколькими разными, не связанными между собой ОС!
В концепции OSTree предполагается, что только 2 системные директории “/etc” и “/var” остаются в режиме записи, причем “/etc” копируется (3-way merge) при переключении, а “/var” — является общей в рамках одной ОС.
Таких развернутых версий разных ОС (stateroot) одновременно может быть несколько.
Загрузка системы
При разворачивании корня ОС, как правило копируется ядро и initrd, поставляемые с этой версией, а также создается новая конфигурация загрузчика. До того момента, пока конфигурация загрузчика не “переключится” с помощью атомарной операции создания символической ссылки на обновленную конфигурацию, загрузка системы будет осуществляться в текущую версию ОС. Поэтому при обновлении системы данная операция осуществляется в последнюю очередь. В любой момент времени ОС будет в состоянии загрузиться либо в “текущую” версию, либо в “обновленную”.
Загрузка ОС, адаптированной для OSTree предполагает, что решение, какая ОС и её версия будут загружаться, принимается на этапе работы “минисистемы” в initrd, поскольку для создания загрузочной корневой системы необходимо “правильно” подмонтировать все её части. Из-за этого невозможно применять OSTree без initrd.
Версия ОС для загрузки, как правило передается с помощью опции командной строки для ядра `ostree=`, содржащей полный путь к развернутому корню операционной системы, например:
`ostree=/ostree/boot.1/apertis/0082844f3f7223ea5093f6c250f50a35c83a5bfe2e96799bc94c3e3be95a60a0/0`
Данный параметр генерируется, как часть конфигурации загрузчика на этапе разворачивания корневой ФС.
В отличие от “классических” ОС, которым достаточно правильно инициализировать блочное устройство, для OSTree необходимо дополнительно подмонтировать все корневые директории перед вызовом “pivot_root”. Референсный пример `switchroot.sh` доступен в git-репозитории OSTree.
Использование в Apertis
Для адаптации ОС, основанной на Debian, к работе с OSTree потребовалось:
- доработать OSTree для корректного взаимодействия с загрузчиком “u-boot”;
- обеспечить загрузку и работу ОС в режиме R/O для корневой файловой системы;
- фактически создать собственную сборочную систему на базе Debos;
- переписать тесты, требующие установки дополнительных пакетов.
Кроме того для внутренних нужд был разработан шаблон для работы системы на основе OSTree в качестве контейнера LXC, что позволяет быстро и безопасно эксперементировать с технологией.
Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license
Назад