Systemd BindPaths= не работает

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

Я пытаюсь протестировать, как работает директива BindPaths= на системе Debian 8 с systemd.

У меня есть основной файл юнита для сервиса:

[Unit]
Description="Простой тестовый сервис"
BindPaths=/path:/bindmount/path:norbind

[Service]
ExecStart=/usr/bin/long_running_program --flags
Restart=always

[Install]
WantedBy=multi-user.target

Когда я выполняю findmnt до и после запуска сервиса, я не вижу, что примонтировано на /bindmount/path вообще.

Когда я выполняю ls или ls -a в месте монтирования /bindmount/path, я не вижу никаких файлов, которые находятся в /path.

Почему это не работает так, как ожидалось?

Я вижу в man странице systemd для BindPath=, где говорится:

Эта опция доступна только для системных сервисов и не поддерживается для сервисов, работающих в экземплярах менеджера сервисов на пользователя.

Как мне узнать, работаю ли я в экземпляре менеджера сервисов на пользователя или запускаю системный сервис? Это основано на том, находится ли мой сервис в /etc/systemd/system или в /lib/systemd/system?

Опция BindPaths делает файл видимым для процесса, запущенного юнитом. Это вообще не видно из оболочки, где вы вводите команду для запуска сервиса. В любой момент вы можете проверить, какие файловые системы смонтированы, посмотрев в /proc/mounts, но если вы запускаете сервис с BindPaths, думаю, единственный способ проверить, правильно ли смонтирована файловая система, это проверить /proc/pid-of-service/mounts. Последнее — это список смонтированных файловых систем для того процесса.

Что касается вашего последнего вопроса: /lib/systemd/system содержит все обычные файлы юнитов, тогда как /etc/systemd/system содержит пользовательские файлы юнитов и все зависимости между юнитами. Персональные экземпляры запускаются с помощью systemctl --user и относятся к файлам юнитов в домашнем каталоге.

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

Проблема с использованием директивы BindPaths= в вашем юнит-файле на Debian 8 связана с рядом факторов, которые могут быть потенциальными причинами неработоспособности данной функции. Давайте рассмотрим возможные причины и решения.

Погружение в проблему

Вы создаете юнит-файл для службы на системе Debian 8 с использованием директивы BindPaths=, но не видите ожидаемого результата. Прежде всего, давайте уточним несколько аспектов:

  1. Контекст выполнения: Директива BindPaths= применима только для системных служб. Она не поддерживается для служб, работающих в пользовательских экземплярах менеджера услуг. Если вы запускаете службу с флагом --user, директива работать не будет.

  2. Расположение юнит-файлов: Проверите, где находится ваш юнит-файл. Системные юнит-файлы обычно располагаются в /lib/systemd/system или /etc/systemd/system. Важно, чтобы ваш юнит-файл был в одной из этих директорий, а не в пользовательских директориях.

Подтверждение выполнения системной службы

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

  • Проверьте статус вашей службы с помощью systemctl status your-service-name. Это покажет, находится ли она среди системных или пользовательских служб.
  • Убедитесь, что вы не используете systemctl --user, так как это запускает службу в пользовательском контексте, где BindPaths= не работает.

Проверка монтирования и доступа

Когда вы используете директиву BindPaths=, результат может быть незаметен в стандартных командах, таких как findmnt, потому что монтирование происходит в контексте конкретного процесса. Для подтверждения монтирования:

  • Найдите PID процесса вашей службы с systemctl status.
  • Проверьте файлы, доступные этому процессу, через /proc/<PID>/mounts.

Практические советы

  1. Логирование и отладка: Убедитесь, что в journalctl нет ошибок, связанных с монтированием. Записи журнала могут указать на проблемы с файлами или директориями, на которых происходит монтирование.

  2. Права доступа: Проверьте, что пути, указанные в BindPaths, имеют необходимые права доступа для вашего процесса.

  3. Отсутствие rbind: Убедитесь, что вы правильно указали параметры :norbind или :rbind, если они необходимы для ваших целей. Например, если ваши файлы находятся в подкаталогах, rbind может оказаться полезным.

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

Вывод

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

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

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

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