LINUX.ORG.RU
ФорумAdmin

Загрузка по сети с многоуровневым монтированием

 , , ,


0

1

Работаю над механизмом загрузки по сети. Идея заключается в том, чтобы можно было грузить несколько клиентов с одного источника, в формате ReadOnly, при этом изменения каждого клиента хранить на другом ресурсе в ReadWrite.

Для разработки был взят Debian 12. Сам механизм реализуется в initrd.

  1. Загрузка в iPXE
  2. Подключение и последующая загрузка с iSCSI
  3. Монтирование NFS ресурса, на котором лежит пользовательский qcow2
  4. Монтирование qcow2
  5. Создание стека overlayfs в качестве корневой директории, где iSCSI в нижний слой, а qcow2 в верхний слой
  6. Передача последующей загрузки в сформированный корень

Вся магия монтирования реализована в /run, чтобы при передачи загрузки система видела смонтированные источники.

Данный механизм отрабатывает на несколько клиентов, проблем нет, всё корректно грузится и работает. Конфликтов нет.

Проблемы возникают на этапе выключения. Даже с учетом того, что смонтированный стек «живёт» в /run, systemd всё же «не понимает» его устройство и размонтирует всё в своём порядке.

Проблем с iSCSI не возникает, так как в /etc/default/open-iscsi есть параметр, которому можно передать кастомную точку монтирования, которую он учтет при размонтировании.

Но вот с двойным монтированием NFS + qcow2 не удаётся провернуть подобный трюк. При этом qcow2 является RW устройством. Соответственно, в процессе выключения некоторые данные, всё же, ещё пишутся.

Возникает кольцевая зависимость (если я правильно понимаю).

Был бы удобный вариант выхода из данной ситуации, если бы можно сделать обратный процесс выхода в условный initrd и потом в правильной последовательности это всё размонтировать не ломая логику записи на диск и т.п.

Может есть иной подход?

Ответ на: комментарий от Khnazile

Не, тут не помогут зависимости для systemd юнитов. Не та ситуация. Нетривиальное монтирование.

Как вариант только что-то подобие, которое я предложил, а-ля initrd. У них это называется exitrd, я ссылку в предыдущем посте дал. Как-то можно через этот функционал реализовать.

azhirov1991
() автор топика
Ответ на: комментарий от aol

Нет, манипуляции с fstab это всё те же корректировки над .mount юнитами. Это не работает как ожидается. Уже все очевидные варианты проверены) тут, к сожалению, нужен неочевидный подход. Пока вот прорабатываю с exitrd. Смотрю исходники других проектов на наличие схожего механизма.

azhirov1991
() автор топика
Ответ на: комментарий от azhirov1991

Да это шутка юмора была.

x-systemd.requires-mounts-for=/,x-systemd.requires-mounts-for=/home/.hdd

Пробовал? Может, оно для размонтирования тоже помогает? https://askubuntu.com/a/48964

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)
Ответ на: комментарий от aol

Пробовал. Не помогает. Кажется, я нашёл способ решить свою проблему. По крайней мере у меня получилось добиться поствыполнения после того, как отработает systemd на выключении.

Вот эти исходники мне помогли: раз два три

Таким образом мы попадаем обратно вне корневую систему, где можем уже размонтировать безопасно всё, что нам нужно.

Вроде то, что надо. Буду прорабатывать этот вариант.

azhirov1991
() автор топика

Зачем все эти сложности с iSCSI и qcow2? Можно обойтись NFS (даже если нужно многоуровнево). По NFS выкачивать мелкие файлы по требованию быстрее, чем весь образ разом → загрузка быстрее.

У меня устроено так (FreeBSD, но в данном случае не роляет):

  • По TFTP выкачивается загрузчик;
  • По NFS монтируется rootfs в ro и загружается ядро (здесь у меня общая базовая система, обновляемая на PXE-сервере);
  • Монтируется локальное хранилище (тут ты можешь использовать другой NFS) в rw (здесь хранятся все изменения, пользовательские пакеты и всё прочее);
  • Перечитывается fstab и монтируется всё остальное.
mord0d ★★★★★
()
Ответ на: комментарий от mord0d
  1. iSCSI как универсальный инструмент для загрузки. Windows вряд ли стартанёт на NFS (может я чего-то не знаю 🤷‍♂️)
  2. образ qcow2 (ну или img) используется в гипервизоре, поэтому с ним необходимо делать манипуляции, как с условным «картриджем»

Вопрос ведь не в «зачем» или «почему», «для чего», «в честь чего», «ради чего» и т.п.

Есть описанный механизм, есть функционал, есть подводные камни, есть проблема. Поэтому и обратился на форум.

Судя по постам выше в рус.сообществе Linux как было очко, так оно и продолжает существовать.

azhirov1991
() автор топика
Ответ на: комментарий от azhirov1991

Можешь про 2. поподробнее написать? У тебя вложенная виртуализация? Т.е. по iPXE/iSCSI загружается виртуалка с гипервизором, которая запускает следующую виртуалку, у которой диск qcow2?

Или это всё делается, чтобы создать такой qcow2, который потом будет запускаться в совсем другом месте другим гипервизором?

alt-x ★★★★★
()
Ответ на: комментарий от azhirov1991

Windows вряд ли стартанёт на NFS

Windows использует TFTP для получения как загрузчика, так и файла с корнем (не помню как оно у них называется).

образ qcow2 (ну или img) используется в гипервизоре

Какой гипервизор по PXE?

Вопрос ведь не в «зачем» или «почему»

Ты пытаешься решить не проблему, а её последствия.

Судя по постам выше в рус.сообществе Linux как было очко, так оно и продолжает существовать.

Не без этого. Но я согласен с удалённым комментарием про XY Problem. Читай выше.

mord0d ★★★★★
()
Ответ на: комментарий от mord0d
  1. Причем тут загрузчик Windows, если я говорю о самой загрузки Windows? Почитайте про технологию iSCSI.
  2. Я нигде не писал, что я использую гипервизор по PXE. Откуда вообще мог сформироваться такой вывод? Я писал, что qcow2 используется как в загрузке по сети, которую я использую наложением, так и в гипервизоре. Что за бред генерится на ровном месте, не понимаю.
  3. И я не понимаю, почему люди отвечают на вопрос, который не был озвучен? Что за мания отвечать всегда не на те вопросы, которые не задаются. Я ведь не задавал, как мне лучше что использовать. Первый пост расписал так, чтобы было представление механизма. Озвучил проблему. Вот что не так было описано, чтобы это вызвало критику «понапридумывал себе проблем»?! Почему в поиске помощи в своём вопросе, нужно сидеть и читать критику всезнающих, которые не могут либо промолчать, если не знают, что корректно ответить, либо ответить в рамках поставленного вопроса.
azhirov1991
() автор топика
Ответ на: комментарий от azhirov1991

Кажется, я нашёл способ решить свою проблему. По крайней мере у меня получилось добиться поствыполнения после того, как отработает systemd на выключении. Вот эти исходники мне помогли: раз два три Таким образом мы попадаем обратно вне корневую систему, где можем уже размонтировать безопасно всё, что нам нужно. Вроде то, что надо. Буду прорабатывать этот вариант.

Странно, что shutdown отрабатывает после того, как дефолтный механизм выключения systemd будет отработан. sleep в скрипте выполняется после всех ошибок с размонтированием, а не ДО, как предполагалось. Собственно, не совсем подходящий вариант. Всё же пытается корень размонтировать в моменте, когда составляющие этого корня не существуют.

Также пробовал переопределять сетку, чтобы отсавалась «жива» в моменте выключения, переопределял mount’ы устройств. Корректно удалось отсоединить /dev/nbd устройство, и NFS шару. Но это всё выполняется не правильно в рамках последовательности (до размантирования корня). А нужно начинать с корня, а это делать в exitrd, а он выполняется в самом конце.

azhirov1991
() автор топика
Ответ на: комментарий от no-dashi-v2

Необходимо использовать загрузку с блочного устройства, что в рамках выбора подходит iSCSI, как универсальный инструмент для загрузки Windows и Linux, причем таргеты легко настраивать на те же IMG образы, что позволяет легко конфигурировать и бэкапить необходимые образы. Загрузка по NFS не подходит для этого подхода. В случае с Linux - qcow2 необходим для записи данных пользовательского пространства. Просто сконнектить какие-то отдельные директории по NFS невозможно, так как практика показывает, что отследить конкретные директории, которые могут генерировать файлы - невозможно, а потенциальная генерация кладёт систему с ошибкой I/O. Поэтому qcow2 полностью кладётся сверху как слой для read-write. Динамическая генерация для различного рода клиентов проще с созданием нового qcow2, нежели изменение конфигурации NFS с последующей перезагрузкой и т.п. в случае если «что-то пошло не так». Поэтому экспортировать общую шару с конкретным qcow2 для конечного клиента идентифируемого по MAC намного удобнее в рамках проекта. Плюс стоит учитывать возможный вариант промежуточных монтирований в overlayfs, если существует локальный диск клиента со специфическими данными, которые также стоит наслоить на read-only iSCSI корень.

Очень много нюансов, которые я не могу рассказать, да и они, в конкретно описанном механизме, не так важны для понимания проблематики в управлении этого стека, так как конечная ошибка сводится лишь к «правильному разбору» этого корневого стека.

azhirov1991
() автор топика
Ответ на: комментарий от zimniy

Можно сказать, что да, есть некое ограничение механизмом. Так же исключить перезагрузку сервисов при добавлении/удалении клиентов, сделать своего рода отказоустойчивым, насколько это возможно (остальное уже кладётся на плечи используемым технологиям). А многослойность нужно иметь в связи с потенциальным появлением дополнительных источников для наслаивания, чтобы сделать слияние универсальным, а не допиливать какие-то существующие источники.

Вот нашёл интересный коммит. Я всё копаю в эту сторону.

P.S. Не ради хейта к кому либо. Вот по ссылке выше, я вижу, чуваки прорабатывали этот вопрос. Но почему-то кучи хейта в их сторону не замечено. На мой взгляд, чисто субъективное мнение, пора бы уже культуру вахтёрной критики переводить в плоскость рассуждения на решение задачи. Это более продуктивно как для тех, у кого возникают вопросы, так и для тех, кто учавствует в поиске решения.

Поэтому я заинтересован, расположен и приветствую интересные идеи и мысли. Может это поможет и ещё кому либо.

azhirov1991
() автор топика
Ответ на: комментарий от azhirov1991

Это же ЛОР. Они с опеннетом соревнуются за звание самого токсичного линукс-ресурса.

Я свои посты перечитал, понял, что пересолил и попросил модеров снести, чтобы нормально разговор продолжить.

zimniy
()
Ответ на: комментарий от zimniy

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

По поводу сложности системы - да. Я прорабатываю возможные нестандартные варианты, а уже потом искать оптимальный. Если в каком-то направлении удастся продвинуться - это уже будет предметом для рассмотрения.

Тут принципиальная задача теперь встала - разобраться с размонтированием overlayfs. Интересный механизм, на самом деле, который можно будет использовать в других направлениях. В тех же Live или кастомных сборках с поддержкой различный устройств хранения. В общем, зацепка интересная. И интересна в том, чтобы производить постобработку при выключении. Это я уже развиваю наперёд мысль, которая может потенциально пригодиться.

Поделюсь ссылками. Вот по поводу работы Windows с iSCSI, интересный ресурс. Также сделал небольшие заметки по поводу кастомизации WinPE для использования при разворачивании в iSCS.

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

azhirov1991
() автор топика