Ждите монтирования перед началом сервисов.

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

У меня есть система Raspbian 9 с внешним жестким диском, который монтируется как /srv/file во время загрузки. Я запускаю PostgreSQL и BIND, оба из которых имеют файлы данных на этом диске.

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

systemctl list-units | grep mount показывает, что системная единица для файловой системы – это srv-file.mount. Затем я добавил

Requires=srv-file.mount

в секцию [Unit] файла bind9.service и postgresql.service (ни один из них не имеет других требований для запуска), но это не помогло.

Что я упускаю?

Согласно документации, есть опция, специально предназначенная для монтирования:

RequiresMountsFor=/srv/file/named

обеспечивает, что все монтирования, необходимые для доступа к /srv/file/named, на месте до того, как эта единица начнет работать.

Это сработало для BIND.

Однако для PostgreSQL есть оговорка. Файл postgresql.service является заглушкой, которая просто запускает true. Существует второй файл, [email protected], который параметризован именем экземпляра. Этот файл – это то место, где происходит фактический запуск и куда нужно добавить RequiresMountsFor=. Если на системе работает несколько экземпляров PostgreSQL, это повлияет на все экземпляры (хотя путь может быть параметризован).

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

Ожидание монтирования перед запуском служб в Raspbian 9

Вы столкнулись с распространённой проблемой на системах, использующих systemd, когда некоторые службы не могут стартовать из-за зависимостей от внешних устройств, которые ещё не смонтированы. В вашем случае PostgreSQL и BIND требуют доступ к данным на внешнем жёстком диске, который монтируется в каталог /srv/file, однако они запускаются до завершения процесса монтирования. Рассмотрим, как правильно настроить зависимости, чтобы избежать этих проблем.

Проблема

Когда вы загружаете систему, systemd предлагает возможность управлять последовательностью запуска служб, включая монтирование файловых систем. Однако в вашем случае PostgreSQL и BIND стартуют до того, как внешняя файловая система была смонтирована, что приводит к ошибке в их работе. Вы уже добавили опцию Requires=srv-file.mount в секцию [Unit] для каждого из сервисов, но это не решило проблему.

Решение для BIND

Вы нашли подходящее решение, добавив строку:

RequiresMountsFor=/srv/file/named

в файл bind9.service. Этот параметр гарантирует, что все монтирования, необходимые для доступа к директории /srv/file/named, будут выполнены до запуска службы BIND. Это решение эффективно, поскольку оно напрямую связывает службу с необходимым монтированием.

Решение для PostgreSQL

С PostgreSQL ситуация более сложная. Как вы отметили, основной файл postgresql.service является "пустышкой", которая просто выполняет команду true. Реальный запуск PostgreSQL происходит в другом файле, который может иметь вид <instance>.service. Чтобы убедиться, что PostgreSQL стартует только после монтирования, вам необходимо добавить строку:

RequiresMountsFor=/srv/file/путь_к_данным_вашей_инстанции

в соответствующий файл конкретного экземпляра PostgreSQL. Если у вас несколько инстансов PostgreSQL, вы можете параметризовать это значение, подставляя динамический путь в зависимости от каждого экземпляра.

Рекомендации по дальнейшим действиям

  1. Проверьте Зависимости: Убедитесь, что все зависимости и пути указаны корректно, и что указанные каталоги существуют после монтирования.
  2. Тестирование: После внесения изменений выполните команду systemctl daemon-reload, чтобы обновить конфигурацию systemd, а затем выполните перезагрузку системы для тестирования работы служб.
  3. Логи: При возникновении новых проблем используйте journalctl -xe, чтобы проверить журналы системы и диагностировать ошибки, указанные при старте служб.
  4. Документация: Ознакомьтесь с официальной документацией systemd, особенно с секцией, касающейся зависимостей и монтирования, чтобы глубже понять работу системы.

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

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

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