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` перечисляются только те файловые
системы, которые будут проверены, которые должны существовать на момент
запуска утилиты, и которые могут быть использованы в процессе каскадного
монтирования томов, но они не участвуют в отдельной операции форматирования.
next prev parent 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