Вопрос или проблема
На виртуальной машине на базе 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
.
-
Непостоянные ошибки монтирования:
- Иногда одно или два связываемых монтирования не активируются, причем не наблюдается сообщений об ошибках в
journalctl
. - При этом монтирование выполняется успешно вручную с помощью администратора (root).
- Иногда одно или два связываемых монтирования не активируются, причем не наблюдается сообщений об ошибках в
-
Порядок монтирования:
- Порядок, в котором указываются записи в файле
fstab
, не влияет на конечный результат. - Возникает впечатление, что результат монтирования зависит от некоторой гонки между процессами, особенно в контексте зависимостей.
- Порядок, в котором указываются записи в файле
-
Сравнение с RHEL7:
- Похожая конфигурация работала в RHEL7 без таких проблем, что указывает на изменения в поведении systemd в более новых версиях.
Причины проблемы
Судя по предоставленной информации, проблема может быть вызвана различными факторами:
- Гонки монтирования: Возможно, связываемые монтирования и их исходные директории монтируются не в верном порядке из-за асинхронного монтирования, что может быть следствием обновлений в systemd.
- Зависимости монтирования: Установленные зависимости могут не гарантировать требуемые ожидания для завершения монтирования исходной точки перед монтированием подкаталогов.
Рекомендации по решению проблемы
-
Обновите зависимости монтирования:
Попробуйте указать зависимости монтирования явно, добавив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
-
Добавьте время ожидания:
Вы можете добавить механизмы ожидания для связываемых монтирований, аналогично тому, как вы сделали в своем примере с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 }
-
Логирование монтирования:
Настройте логирование монтирования для мониторинга и анализа процесса загрузки. Это поможет вам выявить, в какой момент происходит сбой. Используйте командуsystemd-analyze
для диагностики проблем с загрузкой. -
Переход на systemd-модули:
Если проблема остается нерешенной, рассмотрите возможность использования модулей и зависимостей systemd вместоfstab
. Создание юнитов для нужных монтирований может помочь устранить эту проблему.
Заключение
Проблемы с ненадежными связываемыми монтированиями на RHEL8 могут быть сложными, однако применение правильной конфигурации и зависимостей, а также использование средств ожидания и логирования могут значительно улучшить стабильность монтирования во время загрузки. Если предложенные решения не приведут к успеху, рассмотрите возможность получения помощи от сообщества или профессиональных консультантов для более глубокого анализа ситуации.