Как ожидать монтирования NFS в службе systemd?

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

У меня есть сервис, который требует примонтирования NFS, но он не удается.

Я создал файл монтирования с использованием systemd escape. Сам файл монтирования работает, точка монтирования доступна после запуска. Он выглядит так:

[Unit]
After=network.target

[Mount]
Type=nfs
What=10.1.1.10:/opt/company/product-category/product-name/mnt
Where=/opt/company/product-category/product-name/mnt
Options=rw,user,exec

[Install]
WantedBy=multi-user.target

Я добавил RequiresMountFor=/opt/company/product-category/product-name/mnt.

Насколько я могу судить, этого должно быть достаточно, чтобы мой сервис ожидал NFS-ресурс. Моя программа требует, чтобы NFS был доступен, она пытается прочитать файл там и ошибается, если он недоступен. Так что я не уверен, что здесь не так. Думаю, что NFS просто слишком медленный, и systemd считает, что NFS доступен.

Он работает, если я добавляю ExecStartPre=/usr/bin/sleep 3 в мой сервис.

Вы видите какие-либо ошибки?

Вам нужно RequiresMountsFor= (во множественном числе). Вы не упомянули, к какому юниту вы это добавляете, но чтобы было ясно, это должно быть добавлено в юнит сервиса, в секцию [Unit].

Убедитесь, что вы проверили systemctl show -p After myservice (и то же самое с Requires) – оба должны показывать ваш .mount юнит в списке.

(Вы также можете явно указать Requires= + After= в .service файле, используя ‘systemd-escaped’ имя .mount юнита вместо пути.)

Systemd не “думает”, что NFS доступен на основе времени. Он точно знает, какие монтирования были установлены, считывая из /proc/self/mountinfo – и действительно, systemd и вызывает ядро для выполнения этих монтирований, так что он знает, когда вызов монтирования был выполнен и с каким результатом.

.

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

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

Теоретическая часть

Система systemd обладает хорошим инструментарием для управления монтированием файловых систем, в том числе и NFS. Важной особенностью systemd является то, что она использует файл-монтажи (mount units) для управления точками монтирования. Каждое монтирование NFS может быть описано в отдельном юните монтирования, что позволяет systemd управлять временем их активации и устранить гонки за счет управления зависимостями.

Ключевые моменты настройки включают:

  • Создание .mount юнита для NFS, который предполагает указание всех нужных параметров для монтирования.
  • Указание зависимостей между сервисами и монтированием через директивы RequiresMountsFor= или After= в вашем .service файле.
  • Использование правильного синтаксиса и понимание того, как systemd обрабатывает зависимости между юнитами.

Пример конфигурации

В вашем случае, конфигурационный файл для монтирования (например, /etc/systemd/system/opt-company-product-category-product-name-mnt.mount) выглядит следующим образом:

[Unit]
After=network.target

[Mount]
Type=nfs
What=10.1.1.10:/opt/company/product-category/product-name/mnt
Where=/opt/company/product-category/product-name/mnt
Options=rw,user,exec

[Install]
WantedBy=multi-user.target

Если вы настроили свой .service файл, чтобы использовать RequiresMountsFor=, убедитесь, что параметр действительно используется в множественном числе, то есть RequiresMountsFor=. Это гарантирует, что ваш сервис знает о необходимости монтирования определённого ресурса.

Применение на практике

  1. Проверьте написание конфигураций: Убедитесь, что в вашем .service файле, конкретно в секции [Unit], указаны зависимости правильно. Например:

    [Unit]
    Description=My Service
    RequiresMountsFor=/opt/company/product-category/product-name/mnt
    After=network.target
  2. Удостоверьтесь в зависимости от юнита монтирования: Проверьте, как .mount юнит называется в системе. Юниты монтирования должны следовать определённому формату имени, который соответствует пути монтирования. Вы можете использовать команду systemctl list-units --type=mount для проверки, загружается ли ваш .mount файл корректно и в каком статусе он находится.

  3. Проверка зависимостей сервиса: Используйте команды вроде systemctl show -p After myservice и systemctl show -p Requires myservice, где myservice – это имя вашего сервиса. Эти команды позволят вам проверить, видит ли systemd ваши зависимости.

  4. Явные зависимости: Вы можете также явно указать зависимости в вашем .service файле, добавив в него следующую строку:

    [Unit]
    Requires=opt-company-product-category-product-name-mnt.mount
    After=opt-company-product-category-product-name-mnt.mount

    Здесь opt-company-product-category-product-name-mnt.mount – это systemd-эскейпированное имя вашей точки монтирования, и его требуется использовать в таких командах.

  5. Отслеживание зависимостей и ошибок: Поддержка журналов предоставляет подробную информацию о процессе загрузки и возможных ошибках. Используйте journalctl -xe для просмотра детализированных журналов, особенно если у вас есть подозрения, что проблемы возникают из-за NFS.

Заключение

Правильная настройка службы с учётом всех зависимостей и порядка выполнения позволяет избежать проблем, связанных с гонками и неправильным порядком инициализации сервисов. Убедитесь, что systemd знает о всех необходимых для работы сервисов и монтированиях, используя возможности декларативного управления зависимостями. Это обеспечит более надёжную и предсказуемую работу вашей инфраструктуры.

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

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