ALT Linux Distributions development
 help / color / mirror / Atom feed
From: Leonid Krivoshein <klark.devel@gmail.com>
To: devel-distro@lists.altlinux.org
Subject: Re: [devel-distro] Пример файла разметки и описания
Date: Thu, 10 Oct 2024 04:01:15 +0300
Message-ID: <0b88a4bf-6636-4bfe-8f39-e56dbec47a6e@gmail.com> (raw)
In-Reply-To: <a14a5ee7-c097-4366-93f6-5aa09b9f6289@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 5292 bytes --]


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.

[-- Attachment #2: condtree.yaml --]
[-- Type: application/x-yaml, Size: 5880 bytes --]

[-- Attachment #3: exp-list.yaml --]
[-- Type: application/x-yaml, Size: 7202 bytes --]

[-- Attachment #4: layout-ru.md --]
[-- Type: text/markdown, Size: 12920 bytes --]

# Формат файла разметки дисков

## VSCT/1.0: Volume Slicer Condensed Tree, Version 1.0

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

Первый уровень файла разметки предусматривает следующие секции:

* `general`: информация о формате данных и глобальные опции
* `defaults`: значения по умолчанию для других секций этого файла
* `activate`: описания подсистем, задействованных до начала разметки
* `protected`: описания всех исключаемых (защищаемых) дисков
* `targets`: описания всех включаемых целевых дисков
* `layout`: описание проверяемых элементов существующей разметки
* `delete`: список удаляемых элементов существующей разметки
* `change`: описание изменений существующей разметки
* `create`: описание вновь создаваемых элементов будущей разметки
* `volumes`: список форматируемых томов и монтируемых файловых систем

Обязательными являются секции `general` и `targets`. Остальные зависят
от того, что мы хотим сделать при помощи данного файла разметки дисков.

## VSEL/1.0: Volume Slicer Expanded List, Version 1.0

Внутренний формат развёрнутого списка, в котором сохранён только первый
уровень исходного формата. Всем узлам присвоены какие-то идентификаторы,
если их не было в исходном файле. Наборы дисков и операций над ними под
общим идентификатором развёрнуты до индивидуальных дисков и операций,
каждая под своим идентификатором. Каждая блочная сущность перенесена на
второй уровень соответствующего раздела. Каждая файловая система перенесена
из раздела `create` в раздел `volumes`. Все блочные сущности и файловые
системы насыщены дефолтными значениями и информацией о позиционировании
блока в исходном файле. Раздел значений по умолчанию удалён. Добавлены
замыкания блочных устройств, имеющих дочерние устройства.

Первый уровень файла разметки предусматривает следующие секции:

* `general`: информация о формате данных и глобальные опции
* `activate`: описания подсистем, задействованных до начала разметки
* `protected`: описания всех исключаемых (защищаемых) дисков
* `targets`: описания всех включаемых целевых дисков
* `layout`: описание проверяемых элементов существующей разметки
* `delete`: список удаляемых элементов существующей разметки
* `change`: описание изменений существующей разметки
* `create`: описание вновь создаваемых элементов будущей разметки
* `volumes`: список форматируемых томов и монтируемых файловых систем

Обязательными являются секции `general` и `targets`. Остальные зависят
от того, что мы хотим сделать при помощи данного файла разметки дисков.

## Секция general

Определяет по сути две вещи:

* `data-format`: формат данных («VSCT/1.0» либо «VSEL/1.0»), «auto»
  по умолчанию, это поле можно сделать необязательным, если определить
  тип данных окажется возможным автоматически.
* `*`: глобальные флаги и опции, перебивающие дефолтные значения vs,
  но имеющие меньший приоритет, чем опции командной строки.

## Секция defaults

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

```
defaults:
  part:
    parttype: R
```

Секция поддерживается только в исходном файле типа `Condensed Tree`, она
удаляется при развёртывании «сжатого дерева» во внутренний формат списка.

## Секция activate

Может включать описание задействованных в разметке подсистем и файловых
систем, проверяемых и активируемых до начала процедуры разметки. Например,
таких, как: `multipath`, `iscsi`, `fcoe`, `aoe`, `ipoib`, `raid`, `lvm2`,
`ext4`, `swap`, `jfs`, `xfs`, `btrfs`, итд. Описание подсистем необходимо
для определения всех необходимых зависимостей на целевой системе и запуска
команд, служб, загрузки модулей ядра, установки соединений, в том числе,
с использованием аутентификационных данных, что позволит обнаружить или
подключить блочные устройства штатными средсвами Linux ядра и userspace
ещё до того, как будет запущен процесс обнаружения целевых дисков.

Нет необходимости перечислять все задействованные подсистемы в исходном
файле типа `Condensed Tree`, они заново определяются автоматически при
развёртывании «сжатого дерева» во внутренний формат списка.

## Секция protected

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

## Секция targets

Второй обязательный раздел, в котором описывается каждый целевой диск или
набор целевых дисков, соответствующие заданным критериям. Каждая следующая
секция файла описывает блочные сущности, которые строятся поверх целевых
дисков.

## Секция layout

В ней описываются блочные сущности и файловые системы, которые должны быть
проверены до внесения в разметку каких-либо изменений. Например, если мы
собираемся удалить два раздела с порядковыми номерами 5 и 6, создать новый
раздел и отформатировать его, в данной секции мы описываем существующую
таблицу разделов и, по меньшей мере, удаляемые разделы с номерами 5 и 6.

## Секция delete

В ней только перечисляются идентификаторы блочных сущностей и файловых
систем, которые были описаны в секции `layout`, и которые должны быть
рекурсивно удалены. Удаление выполняется всегда в указанном порядке
только после проверки и до внесения каких-либо иных изменений.

## Секция change

Описывает изменения отдельных свойств блочных сущностей и файловых систем
в уже существующей разметке, описанной ранее в секции `layout` и с учётом
уже выполненных к данному моменту удалений, если таковые были указаны в
секции `delete`. Здесь можно переопределить названия томов, их UUID'ы,
выполнить очистку, уменьшить или увеличить размеры разделов и другие
поддерживаемые операции, выполняемые всегда в указанном порядке.

## Секция create

Описывает все вновь создаваемые элементы будущей разметки. Они создаются
либо поверх целых дисков, описанных ранее в секции `targets`, либо поверх
элементов существующей разметки, описанной ранее в секции `layout`, но с
учётом уже выполненных к данному моменту удалений, если таковые были указаны
в секции `delete`, и с учётом уже выполненных к данному моменту изменений,
если таковые были указаны в секции `change`. При конвертировании во внутренний
формат из секции `create` удаляются описания форматируемых файловых систем.

## Секция volumes

Описывает все вновь создаваемые файловые системы, т.е. только то, что
должно быть отформатировано. Их можно описывать и в секции `create` в
исходном файле разметки, но во внутреннем формате они все будут перенесны
в секцию `volumes`. В секции `layout` перечисляются только те файловые
системы, которые будут проверены, которые должны существовать на момент
запуска утилиты, и которые могут быть использованы в процессе каскадного
монтирования томов, но они не участвуют в отдельной операции форматирования.


  reply	other threads:[~2024-10-10  1:01 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-08 13:43 [devel-distro] Тезисы для инсталлятора на базе альтератор 2.0 Антон Мидюков
2024-10-08 23:13 ` [devel-distro] " Leonid Krivoshein
2024-10-08 23:29 ` [devel-distro] Тезисы для инсталлятора " Leonid Krivoshein
2024-10-09  2:13   ` Evgeny Sinelnikov
2024-10-09 21:52     ` Leonid Krivoshein
2024-10-14  7:17       ` [devel-distro] " Sergey V Turchin
2024-10-14 19:57         ` [devel-distro] Интерфейсы " Evgeny Sinelnikov
2024-10-14 21:23           ` Leonid Krivoshein
2024-10-14 21:57             ` Антон Мидюков
2024-10-15  1:11               ` Leonid Krivoshein
2024-10-15  4:49                 ` Anton Farygin
2024-10-15  9:44                   ` Michael Shigorin
2024-10-15 15:05                     ` Denis Medvedev
2024-10-16  0:25                     ` Leonid Krivoshein
2024-10-17  7:22                       ` [devel-distro] " Sergey V Turchin
2024-10-15 19:29                   ` [devel-distro] " Leonid Krivoshein
2024-10-17  7:27                     ` [devel-distro] " Sergey V Turchin
2024-10-18  9:05                       ` [devel-distro] [JT] мировоззренческое по путям развития Michael Shigorin
2024-10-15  5:19             ` [devel-distro] Интерфейсы для инсталлятора на базе альтератор 2.0 Evgeny Sinelnikov
2024-10-15 23:02               ` Leonid Krivoshein
2024-10-15 10:30           ` [devel-distro] инсталятор как краеугольный камень выбора технологического пути Michael Shigorin
2024-10-09  1:40 ` [devel-distro] Installator 2.0: конфигуратор, создающий kickstart-файл Leonid Krivoshein
2024-10-09  9:06   ` [devel-distro] " Sergey V Turchin
2024-10-09 19:46     ` [devel-distro] " Leonid Krivoshein
2024-10-10 19:29       ` [devel-distro] про API и фронтэнды Leonid Krivoshein
2024-10-10 23:27         ` Антон Мидюков
2024-10-11  0:33           ` Leonid Krivoshein
2024-10-14  7:27         ` Sergey V Turchin
2024-10-15  4:59           ` [devel-distro] Веб-браузер в инсталляторе или для инсталлятора? Evgeny Sinelnikov
2024-10-15  5:53             ` Антон Мидюков
2024-10-15 20:53             ` Leonid Krivoshein
2024-10-18  9:25               ` Michael Shigorin
2024-10-14  7:22       ` [devel-distro] Re: Installator 2.0: конфигуратор, создающий kickstart-файл Sergey V Turchin
2024-10-14 19:58         ` [devel-distro] " Leonid Krivoshein
2024-10-15  4:52           ` Anton Farygin
2024-10-15 19:30             ` Leonid Krivoshein
2024-10-15  6:33           ` [devel-distro] " Sergey V Turchin
2024-10-17  7:32             ` [devel-distro] " Sergey V Turchin
2024-10-17  7:49               ` [devel-distro] " Антон Мидюков
2024-10-17  8:44                 ` [devel-distro] " Sergey V Turchin
2024-10-18  8:56               ` [devel-distro] qtbrowser vs wasm Michael Shigorin
2024-10-15 10:03           ` [devel-distro] [JT] Re: Installator 2.0: конфигуратор, создающий kickstart-файл Michael Shigorin
2024-10-15 23:49             ` Leonid Krivoshein
2024-10-16  8:52               ` Michael Shigorin
2024-10-14  7:43       ` [devel-distro] " Sergey V Turchin
2024-10-14 10:54         ` [devel-distro] " Sergey V Turchin
2024-10-09  9:49   ` [devel-distro] " Alexey Gladkov
2024-10-09 19:54     ` Leonid Krivoshein
2024-10-10  9:10       ` Alexey Gladkov
2024-10-10 12:21         ` Leonid Krivoshein
2024-10-10 14:31           ` Alexey Gladkov
2024-10-09  6:19 ` [devel-distro] Тезисы для инсталлятора на базе альтератор 2.0 Ivan A. Melnikov
2024-10-09  7:21   ` Антон Мидюков
2024-10-09  9:21   ` [devel-distro] " Sergey V Turchin
2024-10-09 13:08     ` [devel-distro] " Leonid Krivoshein
2024-10-09 13:56       ` [devel-distro] о голосовом управлении (was: Тезисы для инст, альтератор 2.0) Arseny Maslennikov
2024-10-10  8:11         ` [devel-distro] о голосовом управлении Антон Мидюков
2024-10-14  7:33       ` [devel-distro] Re: Тезисы для инсталлятора на базе альтератор 2.0 Sergey V Turchin
2024-10-09 22:08   ` [devel-distro] " Leonid Krivoshein
2024-10-10  1:01     ` Leonid Krivoshein [this message]
2024-10-10  8:54       ` [devel-distro] Пример файла разметки и описания Антон Мидюков
2024-10-10  5:26     ` [devel-distro] Тезисы для инсталлятора на базе альтератор 2.0 Антон Мидюков
2024-10-10 10:29       ` Leonid Krivoshein
2024-10-14  4:58 ` [devel-distro] Тезисы для инсталлятора на базе альтератор 2.0 (промежуточный итог) Антон Мидюков
2024-10-14 18:59   ` Leonid Krivoshein

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0b88a4bf-6636-4bfe-8f39-e56dbec47a6e@gmail.com \
    --to=klark.devel@gmail.com \
    --cc=devel-distro@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Distributions development

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel-distro/0 devel-distro/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel-distro devel-distro/ http://lore.altlinux.org/devel-distro \
		devel-distro@lists.altlinux.org devel-distro@lists.altlinux.ru devel-distro@lists.altlinux.com
	public-inbox-index devel-distro

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel-distro


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git