Міжнародная канферэнцыя распрацоўнікаў і карыстальнікаў свабодных праграм

OSTree -- атомарные обновления ОС в стиле git

Denis Pynkin, Minsk, Belarus

LVEE 2018

LibOSTree (aka "OSTree") project is aimed to create git-like bootable filesystem trees. This is shared library and set of utilities to manage content-addressed-object store and local "checkouts" of filesystem trees allowing transactional upgrades and rollbacks of the system.

Что такое 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

Назад