International conference of developers
and users of free / open source software

Debos -- еще одна утилита для создания ОС

Denis Pynkin, Minsk, Belarus

LVEE Winter 2018

Debos is a tool to make creation of various debian based os "images" simpler. While most other tools focus on specific use-case, debos is more meant as a toolchain to make comon actions trivial while providing enough rope to do whatever tweaking that might be required behind the scene.

Утилита Debos создана Sjoerd Simons в качестве альтернативы существующим системам подготовки образов дисков на базе дистрибутива Debian, с прицелом на встраиваемые системы. Основная задача, которую решает Debos — максимально упростить пользователю описание для создания образов систем, готовых к “заливке” на целевое устройство.

Для реализации основной задачи используются несколько принципов, заложенных в архитектуру проекта:

  • вся информация о сборке должна находится в конфигурационном файле или “рецепте”(recipe) проекта;
  • строго последовательное выполнение действий при создании образа;
  • для каждого отдельного действия (action) создается свой модуль;
  • действия должны быть самодостаточными и, в идеале, не связанными друг с другом;
  • каждое действие должно быть простым — для сложных задач декларируется использование пользовательких скриптов и/или внешних программ.

Одна из стандартных проблем, которая возникает при сборке образа — это необходимость использования повышенных привилегий для некоторых шагов, таких как установка пакетов. Разными утилитами и дистрибутивами эта задача решается по-разному. Для ‘debos’ используется библиотека fakemachine, написанной Sjoerd Simons. Данная библиотека утилизирует виртуальную машину Qemu, позволяя работать с “повышенными” привилегиями, в текущей системе. Кроме того, такой подход позволяет без дополнительных затрат организовать сборку образа под любую архитектуру, поддерживаемую в Qemu.

В задачу утилиты не входит создание повторяемого сборочного окружения. Подразумевается, что для каждого проекта оно индивидуально и должно создаваться другими средствами, позволяющими создавать воспроизводимое окружение для запуска — Docker, к примеру.

Синтаксис для recipe

Конфигурационный файл для создания образа представляет собой файл, описывающий пошаговое выполнение действий, в формате YAML. Для расширения возможностей, при описании конфигурации используется текстовый шаблонизатор (https://golang.org/pkg/text/template)

Рецепт, условно, можно разделить на 2 части:

  • заголовок
  • список шагов

Для комментирования используется символ “#”. Пример рецепта:

# Declare variable 'Var'
{{- !http://www.codecogs.com/png.latex?\textstyle%20Var%20:=%20%22Value%22%20-%7D%7D%0D%0A%0D%0A%23%20Header%0D%0Aarchitecture:%20arm64%0D%0A%0D%0A%23%20Actions%20are%20executed%20in%20listed%20order%0D%0Aactions:%0D%0A%20%20-%20action:%20ActionName1%0D%0A%20%20%20%20property1:%20true%0D%0A%0D%0A%20%20-%20action:%20ActionName2%0D%0A%20%20%20%20%23%20Use%20value%20of%20variable%20'Var'%20defined%20above%0D%0A%20%20%20%20property2:%20%7B%7B!Var}}

На данный момент поддерживаются следующие базовые действия, которые можно использовать для создания образа системы:

  • apt — установка пакетов в целевое окружение с помощью apt;
  • debootstrap — создание базового окружения с помощью утилиты debootstrap;
  • download — скачивание файла и распаковка, если это необходимо;
  • filesystem-deploy — “перенос” подготовленного окружения на образ диска;
  • image-partition — создание файла-образа диска, разметка и создание разделов;
  • ostree-commit — фиксирует ревизию (“коммитит”) в репозиторий в формате ostree;
  • ostree-deploy — использует версию из репозитория в формате ostree для подготовки целевого окружения;
  • overlay — позволяет копировать файлы и директории со сборочной системы в целевое окружение;
  • pack — создает архив с целевым окружением, как правило для использования в других сценариях или с помощью “chroot” либо аналогов;
  • raw — запись файла напрямую в образ диска или раздела по указанному смещению — чаще всего используется для загрузчиков;
  • run — запуск пользовательского скрипта или команды. Можно запускать как в сборочном, так и в целевом окружении;
  • unpack — распаковать архив в целевом окружении.

Постоянно обновляемая документация по существующим “действиям” (actions) доступна по адресу https://godoc.org/github.com/go-debos/debos/actions, а пример для создания загружаемого образа, пока что только для Raspberry Pi 3 — https://github.com/go-debos/debos-recipes.

Заключение

На момент подготовки статьи Debos уже используется в проекте Apertis при подготовке загружаемых образов дисков, как "классических, так и ostree-based, в том числе и для контейнеров LXC. По мере расширения использования и вовлечения в проект новых людей, находятся и “латаются” ошибки, а также появляются новые идеи для новых действий (actions).

Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license

Back