systemd: проблема с правами доступа с помощью mkdir & ExecStartPre


37

У меня проблема с этим (сокращенным) файлом службы systemd:

[Unit]
Description=control FOO daemon
After=syslog.target network.target

[Service]
Type=forking
User=FOOd
Group=FOO
ExecStartPre=/bin/mkdir -p /var/run/FOOd/
ExecStartPre=/bin/chown -R FOOd:FOO /var/run/FOOd/
ExecStart=/usr/local/bin/FOOd -P /var/run/FOOd/FOOd.pid
PIDFile=/var/run/FOOd/FOOd.pid

[Install]
WantedBy=multi-user.target

Пусть FOOd будет именем пользователя, а FOO - именем группы, которое уже существует для моего демона /usr/local/bin/FOOd.

Мне нужно создать каталог /var/run/FOOd/перед запуском процесса демона /usr/local/bin/FOOdчерез # systemctl start FOOd.service. Это терпит неудачу, потому что mkdir не может создать каталог из-за разрешений:

...
Jun 03 16:18:49 PC0515546 mkdir[2469]: /bin/mkdir: cannot create directory /var/run/FOOd/: permission denied
Jun 03 16:18:49 PC0515546 systemd[1]: FOOd.service: control  process exited, code=exited status=1
...

Почему mkdir не работает в ExecStartPre и как я могу это исправить? (И нет, я не могу использовать sudo для mkdir ...)


К вашему сведению: я использую Debian 8
Matt

Можете ли вы перевести сообщение об ошибке на английский язык?
Thushi

1
... Jun 03 16:18:49 PC0515546 mkdir [2469]: / bin / mkdir: каталог / var / run / FOOd / не может быть создан: нет разрешения Jun 03 16:18:49 PC0515546 systemd [1] : FOOd.service: процесс управления завершен, код = состояние выхода = 1 ...
Мэтт

Ответы:


56

Вам нужно добавить

PermissionsStartOnly=true

к [Service]. Ваш пользователь, FOOdконечно, не авторизован для создания каталога в /var/run. Чтобы процитировать справочную страницу:

Принимает логический аргумент. Если значение равно true, параметры выполнения, связанные с разрешениями, настроенные с помощью User = и аналогичных параметров (для получения дополнительной информации см. Systemd.exec (5)), применяются только к процессу, запущенному с ExecStart =, а не к различным другим ExecStartPre = , ExecStartPost =, ExecReload =, ExecStop = и ExecStopPost =. Если false, настройка применяется ко всем настроенным командам одинаково. По умолчанию false.


1
Прекрасно, именно то, что я искал.
Роберт

2
Эта опция заставляет команды ExecReload=работать от имени root. Это может быть не то, что вы хотите.
Rockallite

@Rockallite, это то, что буквально цитируется в документации, да.
Embik

2
PermissionsStartOnlyбыл объявлен устаревшим Ссылка: github.com/NixOS/nixpkgs/issues/53852 Как это сделать сейчас?
adrelanos

2
@adrelanos Теперь добавьте +сразу после ExecStartPre=. НапримерExecStartPre=+/bin/mkdir test
Джейми Скотт

28

Это не ответ, который объясняет или устраняет проблему с разрешениями, но я думаю, что вы должны просто использовать опцию systemds RuntimeDirectory. Цитирую справочную страницу :

RuntimeDirectory=, RuntimeDirectoryMode=
       Takes a list of directory names. If set, one or more directories by
       the specified names will be created below /run (for system
       services) or below $XDG_RUNTIME_DIR (for user services) when the
       unit is started, and removed when the unit is stopped. The
       directories will have the access mode specified in
       RuntimeDirectoryMode=, and will be owned by the user and group
       specified in User= and Group=. Use this to manage one or more
       runtime directories of the unit and bind their lifetime to the
       daemon runtime. The specified directory names must be relative, and
       may not include a "/", i.e. must refer to simple directories to
       create or remove. This is particularly useful for unprivileged
       daemons that cannot create runtime directories in /run due to lack
       of privileges, and to make sure the runtime directory is cleaned up
       automatically after use. For runtime directories that require more
       complex or different configuration or lifetime guarantees, please
       consider using tmpfiles.d(5).

Поэтому все, что вам нужно сделать, это изменить файл службы на:

[Unit]
Description=control FOO daemon
After=syslog.target network.target

[Service]
Type=forking
User=FOOd
Group=FOO
RuntimeDirectory=FOOd
RuntimeDirectoryMode=$some-mode
ExecStart=/usr/local/bin/FOOd -P /run/FOOd/FOOd.pid
PIDFile=/run/FOOd/FOOd.pid

[Install]
WantedBy=multi-user.target

Спасибо Спасибо. К сожалению, отсутствует в пакете OpenVPN Ubuntu!
BaseZen

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.