Ненадежные привязанные монтировки

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

На виртуальной машине на базе RHEL8 с systemd 239 у меня есть следующая настройка привязки:

  • файловая система (идентифицируемая по UUID), подключенная к “исходной” точке монтирования (/path/to/sourcemnt)
  • несколько подпапок в этой “исходной” точке монтирования:
    /path/to/sourcemnt/dirA
    /path/to/sourcemnt/dirB
    /path/to/sourcemnt/dirC
    
  • привязки для каждой подпапки к “целевым” точкам монтирования

fstab выглядит следующим образом:

# авто-сгенерированные записи для 'sourcemnt'
UUID=<...>               /path/to/sourcemnt       ext4  defaults                                   1 2

# вручную добавленные записи для привязок
/path/to/sourcemnt/dirA  /path/to/targetmnt/dirA  none  bind,x-systemd.requires=/path/to/sourcemnt 0 0
/path/to/sourcemnt/dirB  /path/to/targetmnt/dirB  none  bind,x-systemd.requires=/path/to/sourcemnt 0 0
/path/to/sourcemnt/dirC  /path/to/targetmnt/dirC  none  bind,x-systemd.requires=/path/to/sourcemnt 0 0

Проблема

Не все привязки автоматически монтируются во время загрузки. Это видно по владельцам/разрешениям точек монтирования, а также по выводу команд findmnt и mountpoint.

  • Вывод journalctl не содержит сообщений об ошибках, пытающихся смонтировать “неудавшиеся” привязки, они просто никогда не упоминаются. Упоминаются только успешно смонтированные привязки:
    <Дата> <ИмяХоста> systemd[1]: Монтирование /path/to/sourcemnt...
    ...
    <Дата> <ИмяХоста> systemd[1]: Смонтировано /path/to/sourcemnt.
    <Дата> <ИмяХоста> systemd[1]: Монтирование /path/to/targetmnt/dirB...
    ...
    <Дата> <ИмяХоста> systemd[1]: Смонтировано /path/to/targetmnt/dirB.
    
  • Ручное монтирование (как root) работает.
  • Количество “неудачных” привязок не стабильно при перезагрузке. Иногда отсутствует только одна, иногда две, но по крайней мере одна всегда успешно монтируется.
  • Изменение порядка, в котором указаны привязки в fstab, не меняет того, какие из них смонтированы, а какие нет.
  • Кажется, что одна, стоящая лексикографически посередине (dirB), всегда присутствует, dirA иногда, а dirC только после жесткой перезагрузки (если вообще) — но я не пробовал достаточно часто, чтобы сказать это с уверенностью.
  • Та же конфигурация по-прежнему работала на RHEL7

Это выглядит как проблема синхронизации/состояния гонки, но как можно гарантировать, что все привязки присутствуют? Я даже пытался “каскадировать” требования к монтированию, как в

/path/to/sourcemnt/dirA  /path/to/targetmnt/dirA  none  bind,x-systemd.requires=/path/to/sourcemnt 0 0
/path/to/sourcemnt/dirB  /path/to/targetmnt/dirB  none  bind,x-systemd.requires=/path/to/targetmnt/dirA 0 0
/path/to/sourcemnt/dirC  /path/to/targetmnt/dirC  none  bind,x-systemd.requires=/path/to/targetmnt/dirB 0 0

но это тоже не помогло (тем не менее, почему это должно было помочь в первую очередь?).

Я сталкивался с похожей проблемой, но в моем случае исходный диск был смонтирован через NFS.

Иногда я наблюдал циклы зависимостей при загрузке, которые вызывали сбои других служб (например, named-chroot).

В конце концов, я не смог это исправить, поэтому я обманул систему. Я создал скрипт rc.local, который ждал, пока источник станет доступным, а затем выполнял привязки там.

m()
{
  cnt=0
  while [ ! -e $1 -a $cnt -lt 10 ]
  do
    sleep 1
    cnt=$((cnt+1))
  done
  
  mount -o bind -r $1 $2
}

m /datadisk/netboot/kvm/boot /var/lib/tftpboot/9cdc29af
m /datadisk/netboot/econet-bridge/boot /var/lib/tftpboot/661b168a

Непорядок, но это работает!

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

Ненадежные связываемые монтирования (bind-mounts) на RHEL8: Анализ и Решения

Ваша проблема с ненадежными связываемыми монтированиями на виртуальной машине с RHEL8, использующей systemd 239, может быть связана с несколькими факторами, включая порядок загрузки системы и конфигурацию зависимостей монтирования. Давайте рассмотрим возможные причины проблемы и предложим пути её решения.

Описание проблемы

На вашей системе вы настроили связующие монтирования для нескольких подкаталогов, находящихся на исходной точке монтирования /path/to/sourcemnt. Вы заметили, что не все связующие монтирования автоматически активируются во время загрузки, о чем свидетельствуют права доступа и вывод команд findmnt и mountpoint.

  1. Непостоянные ошибки монтирования:

    • Иногда одно или два связываемых монтирования не активируются, причем не наблюдается сообщений об ошибках в journalctl.
    • При этом монтирование выполняется успешно вручную с помощью администратора (root).
  2. Порядок монтирования:

    • Порядок, в котором указываются записи в файле fstab, не влияет на конечный результат.
    • Возникает впечатление, что результат монтирования зависит от некоторой гонки между процессами, особенно в контексте зависимостей.
  3. Сравнение с RHEL7:

    • Похожая конфигурация работала в RHEL7 без таких проблем, что указывает на изменения в поведении systemd в более новых версиях.

Причины проблемы

Судя по предоставленной информации, проблема может быть вызвана различными факторами:

  • Гонки монтирования: Возможно, связываемые монтирования и их исходные директории монтируются не в верном порядке из-за асинхронного монтирования, что может быть следствием обновлений в systemd.
  • Зависимости монтирования: Установленные зависимости могут не гарантировать требуемые ожидания для завершения монтирования исходной точки перед монтированием подкаталогов.

Рекомендации по решению проблемы

  1. Обновите зависимости монтирования:
    Попробуйте указать зависимости монтирования явно, добавив x-systemd.requires и x-systemd.after для каждого монтирования. Измените ваши записи в fstab:

    /path/to/sourcemnt/dirA  /path/to/targetmnt/dirA  none  bind,x-systemd.requires=/path/to/sourcemnt,x-systemd.after=/path/to/sourcemnt 0 0
    /path/to/sourcemnt/dirB  /path/to/targetmnt/dirB  none  bind,x-systemd.requires=/path/to/sourcemnt,x-systemd.after=/path/to/targetmnt/dirA 0 0
    /path/to/sourcemnt/dirC  /path/to/targetmnt/dirC  none  bind,x-systemd.requires=/path/to/sourcemnt,x-systemd.after=/path/to/targetmnt/dirB 0 0
  2. Добавьте время ожидания:
    Вы можете добавить механизмы ожидания для связываемых монтирований, аналогично тому, как вы сделали в своем примере с rc.local. Версия systemd позволяет использовать сервисы для выполнения скриптов после завершения начальных монтирований.

    m()
    {
     cnt=0
     while [ ! -e $1 -a $cnt -lt 10 ]; do
       sleep 1; cnt=$((cnt+1))
     done
     if [ $cnt -lt 10 ]; then
       mount --bind $1 $2
     fi
    }
  3. Логирование монтирования:
    Настройте логирование монтирования для мониторинга и анализа процесса загрузки. Это поможет вам выявить, в какой момент происходит сбой. Используйте команду systemd-analyze для диагностики проблем с загрузкой.

  4. Переход на systemd-модули:
    Если проблема остается нерешенной, рассмотрите возможность использования модулей и зависимостей systemd вместо fstab. Создание юнитов для нужных монтирований может помочь устранить эту проблему.

Заключение

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

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

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