Skip to content

Техническая архитектура

InfraMedia собирается образом и не изменяется на машине. Корень файловой системы составлен из слоёв, каждый слой — образ squashfs, упакованный при сборке. Всё, что машина пишет, лежит на отдельных разделах.

Слои прошивки

Слой Содержимое
Базовый линукс с systemd, демон управления, веб-интерфейс, модули ядра
postgres сервер базы данных для продуктов, которым он нужен
Прикладной медиасервер: исполняемые файлы и то, что им нужно сверх базового слоя

Слой прикладной программы — приращение над базовым: в него попадает только разница с базовым слоем. Библиотеки, которые уже есть внизу, наверх не едут.

Разделы диска

Установщик размечает диск на три раздела.

  • FIRMWARE — загрузочный раздел EFI: загрузочные файлы версий, образы слоёв, меню загрузчика.
  • SETTINGS — настройки машины: хранилище конфигуратора и оверлей /etc.
  • VAR — изменяемые данные: журналы, каталог данных базы, рабочие файлы прикладной программы.

Корень при этом остаётся только для чтения. Домашний каталог root — tmpfs и живёт до перезагрузки; то, что должно её пережить, лежит на разделе изменяемых данных.

Загрузка

Машина грузится через systemd-boot. Ядро, initrd, командная строка и манифест состава склеены в один загрузочный файл. Это сделано ради одного свойства: выбор загрузочной записи выбирает ядро, initrd и список слоёв вместе, рассинхронизировать их нельзя. Две версии прошивки на диске — это две записи в меню, и откат возвращает состав целиком.

Порядок загрузки такой.

  1. Прошивка UEFI передаёт управление загрузчику, тот запускает загрузочный файл версии, выбранной в меню.
  2. initrd читает манифест, находит на загрузочном разделе образы слоёв и сверяет их sha256 с манифестом.
  3. Слои подключаются и собираются в корень; сверху подключается оверлей /etc с раздела настроек.
  4. Управление передаётся systemd, который поднимает демон управления и прикладную программу.

initrd — сценарий на busybox: он не зависит от прикладной программы и собирается один раз на архитектуру.

Конфигуратор

Конфигуратор — демон управления машиной. Он слушает HTTP на порту 8090 и отдаёт программный интерфейс: обзор машины, сетевые интерфейсы, имя машины и серверы времени, прошивка, перезагрузка и выключение. Он же раздаёт веб-интерфейс — отдельного порта под интерфейс нет.

Воздействие на систему идёт через вызовы штатных программ и запись конфигурационных файлов — ip, networkctl, resolvectl, hostnamectl, timedatectl, systemctl и файлы в /etc/systemd/.

Хранилище настроек

Единственный источник правды о том, как настроена машина, — хранилище настроек конфигуратора. Файлы systemd рендерятся из него и никогда не читаются обратно.

Из этого следуют два практических правила.

  • Править сгенерированные файлы руками бессмысленно: следующий рендеринг вернёт заданное значение.
  • Заданное значение и фактическое состояние — разные вещи. Заданное берётся из хранилища, фактическое конфигуратор снимает с работающей системы машиночитаемым выводом системных утилит, и они могут расходиться.

Сессия изменения

Изменения сети применяются в режиме «подтверди или откачу». Изменение открывает сессию, и пока она открыта, хранилище заморожено целиком. Если подтверждения в срок не пришло, хранилище возвращается к сохранённой копии, а настройки — к прежним. Открытых сессий не более одной.

Смысл механизма прикладной: ошибка в настройке интерфейса больше не означает потерю доступа к машине.

Ограниченный режим

Если хранилище прочитать не удалось — файл повреждён или его версия новее самого демона, — конфигуратор переходит в ограниченный режим: читающие операции работают, изменения отклоняются, рендеринг не выполняется. Машина продолжает работать на том, что уже отрендерено.

Профиль железа

Профиль железа описывает машины, на которые едет прошивка этой архитектуры: конфигурацию ядра с их драйверами и правила, приводящие физические интерфейсы к каноническим именам по пути устройства. Драйверы всех поддерживаемых машин встроены в одно ядро, и на любой из них грузится один и тот же образ.

Канонические имена назначаются по роли интерфейса — manage для управляющих, streaming для потоковых, с порядковым номером. Настраивать через программный интерфейс можно только интерфейс, получивший каноническое имя; физический интерфейс без него виден, но не настраивается.

Веб-интерфейс

Веб-интерфейс едет базовым слоем и раздаётся самим демоном — он обязан работать на машине, где прикладной программы нет вовсе или она не поднялась. Разделов пять: Обзор, Интерфейсы, Система, Обновления, Питание.

Экраны собраны отдельно от оболочки: они не несут ни темы, ни маршрутизатора, ни авторизации и не знают, по какому адресу лежит программный интерфейс. Поэтому у них два входа — приложение на порту конфигуратора и раздел внутри консоли прикладной программы, которая подгружает экраны с самой машины. Оператор настраивает шасси там же, где работает с медиасервером.

Две версии

У операционной системы и у прошивки сервера разные номера. Прошивка — это InfraMedia такой-то версии плюс прикладная программа такой-то; обе записаны в манифесте загрузочного файла. Прикладная программа собирается на опубликованных частях операционной системы, а не пересобирает её.