Работаю над механизмом загрузки по сети. Идея заключается в том, чтобы можно было грузить несколько клиентов с одного источника, в формате ReadOnly
, при этом изменения каждого клиента хранить на другом ресурсе в ReadWrite
.
Для разработки был взят Debian 12. Сам механизм реализуется в initrd
.
- Загрузка в iPXE
- Подключение и последующая загрузка с iSCSI
- Монтирование NFS ресурса, на котором лежит пользовательский
qcow2
- Монтирование
qcow2
- Создание стека
overlayfs
в качестве корневой директории, где iSCSI в нижний слой, аqcow2
в верхний слой - Передача последующей загрузки в сформированный корень
Вся магия монтирования реализована в /run
, чтобы при передачи загрузки система видела смонтированные источники.
Данный механизм отрабатывает на несколько клиентов, проблем нет, всё корректно грузится и работает. Конфликтов нет.
Проблемы возникают на этапе выключения. Даже с учетом того, что смонтированный стек «живёт» в /run
, systemd всё же «не понимает» его устройство и размонтирует всё в своём порядке.
Проблем с iSCSI не возникает, так как в /etc/default/open-iscsi
есть параметр, которому можно передать кастомную точку монтирования, которую он учтет при размонтировании.
Но вот с двойным монтированием NFS + qcow2 не удаётся провернуть подобный трюк. При этом qcow2 является RW устройством. Соответственно, в процессе выключения некоторые данные, всё же, ещё пишутся.
Возникает кольцевая зависимость (если я правильно понимаю).
Был бы удобный вариант выхода из данной ситуации, если бы можно сделать обратный процесс выхода в условный initrd
и потом в правильной последовательности это всё размонтировать не ломая логику записи на диск и т.п.
Может есть иной подход?