Як створити системну ціль?


16

Після багатого пошуку в публікації, відео YouTube та "документації" щодо системи, я все ще втрачаю.

Посилання ( https://wiki.archlinux.org/index.php/systemd#Create_custom_target ) здавалося перспективним, але було трохи розпливчастим (для мене).

Питання

Як можна було б створити спеціальну системну ціль (IE: foo.target), щоб можна було завантажуватись із вибраних сервісних одиниць?

Приклад

  1. Система завантажує default.target (символьне посилання "foo.target")
  2. "foo.target" запускає лише сервер barebones X та програму GUI, скажімо, "gvim".

Причина

Я просто прагну створити спеціальну ціль для швидкого запуску однієї програми X. Було б добре виключити всі послуги, які мені не потрібні.

Спасибі заздалегідь!

Відповіді:


16

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

Коли ви створюєте ціль, вам потрібно буде зробити посилання на 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

Пояснити варіанти, взяті з системних наборів;

  • 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=директиви.


Я дотримувався вищесказаного, щоб створити нову ціль і додав до своєї служби кілька цілей. Однак жодна з цих служб не запускається системою. Чи є повний приклад, який демонструє роботу служб у щойно доданій цілі?
linuxfan

1
Дивіться публікацію стека necromancer, якщо ви шукаєте простих кроків для налаштування користувацької служби для запуску при завантаженні.
Pilbox

@linuxfan Я додаю foo.targetв Requiresполе і Beforeполе multi-user.target, і це подобається Requires: base.target foo.target. Після цього я перезавантажую свій Arch Linux vm і foobar.serviceзапускається як демон автоматично.
L_K

2
Приємна відповідь, але насправді це, здається, не працює так, як ви очікували. 1. Тільки тому, що він знаходиться в бажанні, не означає, що послуга розпочнеться з цієї мети. 2. Мабуть, багатоцільовий ціль має деякі приховані речі, які змушують його працювати.
Отей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.