Вопрос или проблема
Я пытаюсь протестировать, как работает директива 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=
, но не видите ожидаемого результата. Прежде всего, давайте уточним несколько аспектов:
-
Контекст выполнения: Директива
BindPaths=
применима только для системных служб. Она не поддерживается для служб, работающих в пользовательских экземплярах менеджера услуг. Если вы запускаете службу с флагом--user
, директива работать не будет. -
Расположение юнит-файлов: Проверите, где находится ваш юнит-файл. Системные юнит-файлы обычно располагаются в
/lib/systemd/system
или/etc/systemd/system
. Важно, чтобы ваш юнит-файл был в одной из этих директорий, а не в пользовательских директориях.
Подтверждение выполнения системной службы
Чтобы удостовериться, что ваша служба действительно является системной, используйте команды:
- Проверьте статус вашей службы с помощью
systemctl status your-service-name
. Это покажет, находится ли она среди системных или пользовательских служб. - Убедитесь, что вы не используете
systemctl --user
, так как это запускает службу в пользовательском контексте, гдеBindPaths=
не работает.
Проверка монтирования и доступа
Когда вы используете директиву BindPaths=
, результат может быть незаметен в стандартных командах, таких как findmnt
, потому что монтирование происходит в контексте конкретного процесса. Для подтверждения монтирования:
- Найдите PID процесса вашей службы с
systemctl status
. - Проверьте файлы, доступные этому процессу, через
/proc/<PID>/mounts
.
Практические советы
-
Логирование и отладка: Убедитесь, что в
journalctl
нет ошибок, связанных с монтированием. Записи журнала могут указать на проблемы с файлами или директориями, на которых происходит монтирование. -
Права доступа: Проверьте, что пути, указанные в BindPaths, имеют необходимые права доступа для вашего процесса.
-
Отсутствие rbind: Убедитесь, что вы правильно указали параметры
:norbind
или:rbind
, если они необходимы для ваших целей. Например, если ваши файлы находятся в подкаталогах,rbind
может оказаться полезным. -
Системные обновления: Убедитесь, что все системные пакеты обновлены до последних версий, так как поддержка конкретных функций в systemd может зависеть от версии.
Вывод
Следуя изложенным выше шагам, вы сможете определить, почему BindPaths=
не функционирует должным образом в вашем системе. Возможно, вам потребуется уточнить настройки контекста выполнения службы или структуры каталогов, чтобы корректно применить монтирование. Внимательное изучение процесса и контекста выполнения поможет выявить и устранить проблему.
Помните, что для диагностики сложных случаев всегда можно обратиться к документации systemd или, при необходимости, задать вопрос в профильных сообществах.