Лучшее место для размещения файлов системного блока: /etc/systemd/system
просто обязательно добавьте цель в раздел [Install], прочитайте «Откуда он знает?» для деталей. ОБНОВЛЕНИЕ : /usr/local/lib/systemd/system
это еще один вариант, подробности читайте в «Серой зоне».
Лучшее место для размещения файлов пользовательских модулей: /etc/systemd/user
или, $HOME/.config/systemd/user
но это зависит от разрешений и ситуации.
Правда состоит в том, что юниты systemd (или, как их называет во вступительном предложении «конфигурации юнитов») могут находиться где угодно - при условии, что вы готовы создавать ручные символические ссылки и знаете о предостережениях. Это облегчает жизнь, чтобы поместить устройство туда, где systemctl daemon-reload
можно найти его по нескольким причинам:
- Использование стандартного местоположения означает, что генераторы systemd найдут их и упростят их включение при загрузке
systemctl enable
. Это потому, что ваш юнит будет автоматически добавлен в дерево зависимостей юнитов (кеш юнитов).
- Вам не нужно думать о разрешениях, потому что только правые привилегированные пользователи могут писать в назначенные области.
Как это узнать?
А как именно systemctl enable
узнать, где создать символическую ссылку? Вы жестко закодируете его в самом модуле под [install]
разделом. Обычно есть такая строка
[Install]
WantedBy = multi-user.target
это соответствует предопределенному месту в файловой системе. Таким образом, вы systemctl
узнаете, что этот модуль зависит от группы файлов модулей, которая называется multi-user.target
(«target» - это термин, используемый для обозначения групп зависимостей модулей. Вы можете перечислить все группы с помощью systemctl list-units --type target
). Группа файлов модулей, загружаемых с целью, помещается в targetname.target.wants
каталог. Это просто каталог, полный символических ссылок (или реальная вещь). Если ваш [Install]
раздел говорит , что это , но если символическая ссылка на него не существует в каталоге, то он не будет загружаться. Когда генераторы модулей systemd добавляют ваш модуль в кэш дерева зависимостей при загрузке (вы можете вручную запускать генераторы ), он автоматически знает, куда поместить символическую ссылку - в данном случае в каталогWantedBy
multi-user.target
multi-user.target.wants
systemctl daemon-reload
/etc/systemd/system/multi-user.target.wants/
если вы включите его.
Ключевые моменты в руководстве:
Дополнительные модули могут быть загружены в systemd («связаны») из каталогов, которые не находятся на пути загрузки модулей. Смотрите команду link для systemctl (1).
В systemctl ищите команды файла модуля
Путь загрузки файла модуля
Файлы модулей загружаются из набора путей, определенных во время компиляции, описанных в двух таблицах ниже. Файлы модулей, найденные в каталогах, перечисленных ранее, переопределяют файлы с таким же именем в каталогах, расположенных ниже в списке.
Когда переменная $SYSTEMD_UNIT_PATH
установлена, содержимое этой переменной переопределяет путь загрузки модуля. Если $SYSTEMD_UNIT_PATH
заканчивается пустым компонентом (":"), к содержимому переменной будет добавлен обычный путь загрузки модуля.
Таблица 1 и Таблица 2 из man systemd.unit
хороши.
Загрузка путей при работе в системном режиме ( --system
).
/etc/systemd/system
Локальная конфигурация
/run/systemd/system
Единицы времени выполнения
/usr/lib/systemd/system
Единицы установленных пакетов
Загрузка пути при работе в пользовательском режиме ( --user
)
Существует разница между единицами измерения пользователя и единицами измерения всех / глобальных пользователей.
User-зависимый
$XDG_CONFIG_HOME/systemd/user
Конфигурация пользователя (используется только когда $XDG_CONFIG_HOME
установлено)
$HOME/.config/systemd/user
Конфигурация пользователя (используется только когда $XDG_CONFIG_HOME
не задано)
$XDG_RUNTIME_DIR/systemd/user
Единицы времени выполнения (используется только когда $XDG_RUNTIME_DIR
установлено)
$XDG_DATA_HOME/systemd/user
Единицы пакетов, которые были установлены в домашнем каталоге (используется, только если $XDG_DATA_HOME
установлено)
$HOME/.local/share/systemd/user
Единицы пакетов, которые были установлены в домашнем каталоге (используется только когда $XDG_DATA_HOME
не установлен)
--global
(все пользователи)
Единицы, которые применяются ко всем пользователям, то есть принадлежат каждому пользователю. Таким образом, каждый пользователь может остановить эти службы, даже если администратор включает их при загрузке.
/etc/systemd/user
Локальная конфигурация для всех пользователей ( systemctl --global enable userunit.service
)
/usr/lib/systemd/user
Единицы пакетов, которые были установлены в масштабе всей системы для всех пользователей
/run/systemd/user
Единицы времени выполнения
Серая область
С одной стороны, Стандарт Файловой Иерархии указывает, что /etc
это для локальных конфигураций, которые не выполняют двоичные файлы. С другой стороны, он указывает, что /usr/local/
«предназначен для использования системным администратором при локальной установке программного обеспечения». Вы также можете утверждать (если не только в целях организации), что все файлы системных модулей должны быть повреждены /usr/local/lib/systemd/system
, но это предназначено для файлов модулей, которые являются частью «программного обеспечения», а не из диспетчера пакетов. Соответствующие системные системные юзеры, которые являются общесистемными, могут оказаться недоступными
/usr/local/lib/systemd/user
.
/etc/systemd/system
там, где вы помещаете свои сценарии, pacman помещает сценарии пакета,/usr/lib/systemd/system
а выдачаsystemctl enable foo.service
создает символические/usr
/etc