On 10/10/24 01:08, Leonid Krivoshein wrote: >> [...] >>> По результатам обсуждения я сформулировал следующие тезисы: >>> 1. Графический интерфейс инсталлятора представляет собой конфигуратор, >>> который создаёт сценарий автоустановки (kickstart-файл) >> Я не считаю, что у нас возможна совместимость с redhat в этом вопросе. >> Поэтому я предлагаю придумать этому файлу другой формат и название. >> Взяв у коллег лучшее, естественно. >> >> Формат должен быть документирован, его корректность и наличие >> всех необходимых полей должны быть проверяемы программно (т.е. >> нужна схема). > > Да. Yaml. СхемЫ тоже на Yaml. Есть возражения? Во множественном, т.к. > модульность, схемы будут разделены по пакетам. Важна строгая > типизация, давно обсуждали это и кажется Иван Захарящев даже что-то > делал для этого с woo. > Разметка дисков -- существенная часть установщика. Давно хочу написать этот бэкенд и уже примеряюсь к инструментарию, хотя архитектура Volume Slicer (vs) созрела окончательно в прошлом году. Всегда считал, что описание разметки -- весьма непростая сущность, оно не обязано быть в том же формате, что и файл ответов, хотя служит тем же целям. Если вдруг это совпадёт, будет здорово, можно вложить одно Yaml-дерево в другое, но всегда можно использовать просто ссылку на отдельный файл. Для предметного обсуждения приложил пару файлов одной и той же развесистой разметки и краткое описание основных разделов. Ключи в описаниях блочных сущностный должны просто соответствовать длинным опциям, создающим эти блочные сущности. К примеру, "homehost: FIXED" в файле разметки превратится в "--homehost FIXED" при вызове mdadm. Такой подход позволяет полностью сохранить семантику при работе с внешними утилитами. Для проверки схемы используется pydantic. Выбирал из десятка похожих проектов. В результате схема описывается где-то в Yaml-файлах, где-то прямо в коде. Пример рабочих сниппетов для лучшего понимания: def to_kebab(s: str) -> str:     return s.replace('_', '-') ... class Filesystem(BaseModel):     id: int | None = None     fstype: str | None = None     label: str | None = None     uuid: UUID | None = None     no_discard: bool | None = None     model_config = ConfigDict(         alias_generator=AliasGenerator(             validation_alias=to_snake,             serialization_alias=to_kebab,         )     )     def model_post_init(self, __context: Any) -> None:         if self.fstype is None:             self.fstype = self.__class__.__name__         self.id = id(self)     @model_validator(mode='after')     def check_fstype(self) -> Self:         print(f'fields of the {self.fstype} filesystem are checked')         return self ... class vfat(Filesystem):     uuid: str | None = Field(         default=None,         min_length=9,         max_lenght=9,         pattern=r'^[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}$'     ) ... Сама разбивалка должна получиться не очень сложной, т.к. используется много внешнего и готового. Например, для чтения используется lsblk с выводом в json, pyudev, нативные утилиты, типа dumpe2fs. Ближайшее чем-то похожее решение -- blivet, который немного залочен на RedHat и построен вокруг libblockdev. При желании его можно использовать, в Debian смогли прикрутить. Ещё чем-то очень отдалённо напоминает libstorage-ng, которая использует DOM/XML-дерево (XML-файл разметки). -- WBR, Leonid Krivoshein.