Правильный способ рекурсивно разделить путь (как символическую ссылку) и правильный способ размонтировать/перемонтировать, не мешая другим точкам монтирования.

Вопрос или проблема

Связывающие точки монтирования, кажется, сложны. Я ищу правильный способ использовать связывающую точку монтирования для монтирования данной директории в другую, почти как символическая ссылка (но я не могу использовать символическую ссылку, потому что моё приложение – это контейнеры Linux). Я хочу иметь возможность отмонтировать эту директорию, не нарушая другие возможные точки монтирования.

Предыстория: Я хочу поделиться пулом ZFS с хост-системы к контейнеру Linux (proxmox). Поскольку это пул ZFS, существует множество вложенных наборов данных, и поэтому я хотел бы рекурсивно выполнить монтирование. Также некоторые наборы данных зашифрованы и должны быть прозрачно доступны, если ключи шифрования загружены, и не должны быть доступны, если они отмонтированы.

Что я пробовал

  1. Точка отсчета – это хост-система с установленным свойством mountpoint, так что все наборы данных смонтированы в /zpseagate8tb на хост-системе. Я могу свободно монтировать/размонтировать наборы данных и загружать/выгружать ключи шифрования. Я хотел бы точно клонировать это дерево в контейнер

  2. Я создал другую директорию /zpseagate8tb_bind, к которой я связываю оригинальный пул. Намерение состоит в том, чтобы пометить её как зависимую, чтобы упростить размонтирование. У меня есть следующая строчка в моем /etc/fstab:

    /zpseagate8tb   /zpseagate8tb_bind      none    rbind,make-rslave,nofail
    
  3. Затем я использую встроенные возможности LXC для связывания этой директории с контейнером. Конфигурационный файл включает:

    lxc.mount.entry: /zpseagate8tb_bind zpseagate8tb none rbind,create=dir 0 0
    

Это работает безупречно, пока я не захочу размонтировать и/или пул не исчезает (из-за случайного отключения), в таком случае всегда происходит что-то неожиданное. Например, /zpseagate8tb_bind пусто, в то время как данные по-прежнему доступны/смонтированы внутри контейнера. Почти во всех случаях мне приходится перезагружать все, чтобы снова получить согласованное состояние.

Каков правильный подход для создания этой связывающей точки монтирования и какие команды нужны для удаления точки монтирования из контейнера, не нарушая ничего другого?

Ответ или решение

Правильный способ рекурсивного шаринга каталога (аналог символической ссылки) и корректное размонтирование/монтирование без вмешательства в другие точки монтирования

Когда речь идет о работе с контейнерами Linux и системами файлов ZFS, управляемыми через механизм привязки (bind mount), очень важно учитывать специфику файловой системы и архитектуры контейнеризации. Ниже описаны шаги, необходимые для корректного создания и управления такими привязками, чтобы избежать проблем с несовместимостью и несогласованностью данных.

Рекомендованный процесс создания привязок (Bind Mounts)

  1. Создание структуры привязок:
    Вы уже создали точку привязки на хост-системе: /zpseagate8tb_bind. Убедитесь, что эта директория существует, и ее свойства настроены должным образом. Можно использовать команду:

    mkdir -p /zpseagate8tb_bind
  2. Настройка файла /etc/fstab:
    Ваше текущее содержание в fstab верно, так как с использованием опции rbind,make-rslave вы обеспечиваете возможность дальнейшего подчиненного размонтирования. Остаточное содержание должно выглядеть следующим образом:

    /zpseagate8tb   /zpseagate8tb_bind      none    rbind,make-rslave,nofail
  3. Монтирование в контейнере:
    При монтировании из настроек LXC используйте следующую строку в конфигурационном файле:

    lxc.mount.entry: /zpseagate8tb_bind zpseagate8tb none rbind,create=dir 0 0

Корректное размонтирование

Во время работы с привязками на хост-системе и в контейнерах крайне важно правильно управлять размонтированием:

  1. Размонтирование контейнера:
    Используйте команду:

    lxc-attach -n <container_name> -- umount /zpseagate8tb

    Эта команда отключит точку монтирования внутри контейнера. Не забудьте заменить <container_name> на имя вашего контейнера.

  2. Проверка состояния монтирования:
    После размонтирования с помощью:

    mount | grep /zpseagate8tb_bind

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

  3. Убедитесь в последовательности операций:
    Если вы отключили ZFS пул или неверно отсоединили устройство, попробуйте в первую очередь размонтировать /zpseagate8tb из контейнера, а затем размонтировать /zpseagate8tb_bind с хост-системы:

    umount /zpseagate8tb_bind

Обеспечение согласованности данных

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

  • Используйте sync перед отключением: Это поможет записать все буферизованные данные на диск:

    sync
  • Обработка ошибок: Используйте команды проверки состояния, такие как dmesg, чтобы следить за системными сообщениями, которые могут указать на проблемы с подключением или размонтированием.

Резюме

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

Оцените материал
Добавить комментарий

Капча загружается...