OSTree – атомарные обновления ОС в стиле git (Денис Пынькин, LVEE-2018)
Материал из 0x1.tv
- Докладчик
- Денис Пынькин
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 предназначен для создания неизменяемых файловых систем в стиле git, обеспечивая атомарные обновления и откаты ОС. Проект предоставляет собой референсную библиотеку для работы с репозиториями ostree, а также утилиту командной строки, позволяющей производить все необходимые операции над локальным репозиторием.
В локальном ostree репозитории хранятся “снимки” файлов и директорий, позволяя быстро переключать корневую систему, ядро и конфигурацию загрузчика на любой из доступных вариантов.
Серверный репозиторий предназначен для использования в качестве источника обновлений поверх HTTP/HTTPS протокола. Возможность использования GPG-подписи отдельных коммитов, а также внутренняя архитектура репозитория, позволяют тиражировать серверный репозиторий и использовать его для обновлений даже из недоверенных источников.
Содержание
Видео
Посмотрели доклад? Понравился? Напишите комментарий! Не согласны? Тем более напишите.
Презентация
Thesis
Локальная архитектура 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, что позволяет быстро и безопасно экспериментировать с технологией.
Примечания и ссылки
Plays:185 Comments:0