Как создать цель systemd?

16

После множества поисков в постах, видео на Youtube и в «документации» по systemd я все еще в растерянности.

Ссылка ( https://wiki.archlinux.org/index.php/systemd#Create_custom_target ) показалась многообещающей, но была немного расплывчатой ​​(для меня).

Вопрос

Как можно создать собственную цель systemd (IE: foo.target), чтобы можно было загружаться с выбранными модулями .service?

пример

  1. Система загружает default.target (символическая ссылка "foo.target")
  2. «foo.target» запускает только простой X-сервер и программу с графическим интерфейсом, скажем, «gvim».

причина

Я просто хочу создать собственную цель для быстрого запуска одной X-программы. Было бы неплохо исключить все услуги, которые мне не нужны.

Заранее спасибо!

Pilbox
источник

Ответы:

16

Прочитав man 5 systemd.unitи man 5 systemd.targetсообщив нам, что файлы юнитов используются для определения целей, а также всего остального systemd. Нет конкретной документации о том, как создать цель , поэтому трудно определить, как это должно быть сделано, но это не слишком отличается от создания службы.

Когда вы создаете свою цель, вам нужно будет создать символические ссылки на target.wantsкаталог из каталога системных служб. Затем вы можете установить / загрузить вашу цель. Вот как это может выглядеть на вашем примере.

/etc/systemd/system/foo.target

Это файл объекта цели. Если в качестве примера взят graphical.target, мы можем создать нашу собственную цель, используя ее в качестве базы.

[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes

Объяснить варианты, взятые из man-страниц systemd;

  • Description- Описывает цель. Ты должен понимать
  • Requires- Жесткие зависимости от цели. Вам следует разрешить запуск базовой системы, прежде чем запускать собственные службы
  • Wants- Мягкие зависимости. Цель не требует, чтобы они начали.
  • Conflicts - Если у какого-либо устройства есть настройка Конфликты на другом устройстве, запуск первого остановит последний, и наоборот.
  • After - сапоги после этих услуг
  • AllowIsolate- Действительно зависит от вас и вашего окружения. Подробности доступны на странице руководстваsystemd.unit(5)

/etc/systemd/system/foo.target.wants/

Это каталог, где вы будете связывать услуги, которые вы создаете / запрашиваете для своей цели. Это эквивалентно Wants=опции в файле модуля. Создайте этот каталог, а затем создайте символические ссылки следующим образом; ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service, Это создает символическую ссылку из bar.service в системном каталоге на ваш каталог foo.target.wants.


Я думаю, что создание файла модуля для службы выходит за рамки этого ответа, и этот вопрос определенно более задокументирован, поэтому я пока оставлю это в стороне. Когда вы создаете файл модуля, просто вставьте его в каталог target.wants или добавьте его в Wants=директиву.

m32
источник
Я следовал вышеописанному, чтобы создать новую цель, и добавил несколько целей в свой сервис. Однако ни одна из этих служб не запускается системой systemd. Есть ли полный пример, демонстрирующий работу служб в добавленной цели?
linuxfan
1
Посмотрите сообщение стека некроманта, если вы ищете простые шаги для настройки пользовательского сервиса для запуска при загрузке.
Pilbox
@linuxfan Я добавляю foo.targetв Requiresполе и Beforeполе multi-user.target, и это нравится Requires: base.target foo.target. После этого я перезагружаю свой Arch Linux vm и foobar.serviceавтоматически запускаюсь как демон.
L_K
2
Хороший ответ, но на самом деле он не работает так, как вы ожидаете. 1. То, что он находится в розыске, не означает, что сервис будет запускаться с этой целью. 2. В multi-user.target, похоже, есть какие-то скрытые вещи, которые заставляют его работать.
Отей