Jak stworzyć systemowy cel?

16

Po dokładnym przeszukaniu wielu postów, filmów z YouTube'a i „dokumentacji” na temat systemd nadal jestem zagubiony.

Link ( https://wiki.archlinux.org/index.php/systemd#Create_custom_target ) wydawał się obiecujący, ale dla mnie był nieco niejasny.

Pytanie

Jak przejść do tworzenia niestandardowego systemowego celu (IE: foo.target), aby można było uruchomić przy użyciu wybranych jednostek .service?

Przykład

  1. System uruchamia default.target (dowiązanie symboliczne „foo.target”)
  2. „foo.target” uruchamia tylko X serwer barebones i program GUI, powiedz „gvim”.

Powód

Po prostu chcę stworzyć niestandardowy cel do szybkiego uruchomienia jednego programu X. Z przyjemnością wykluczę wszystkie usługi, których nie potrzebuję.

Z góry dziękuję!

Pilbox
źródło

Odpowiedzi:

16

Czytanie man 5 systemd.uniti man 5 systemd.targetmówi nam, że pliki jednostek są używane do definiowania celów, a także wszystkiego innego systemowego. Nie ma żadnej dokumentacji dotyczącej tego, jak utworzyć cel , więc trudno jest określić, jak należy to zrobić, ale nie różni się zbytnio od tworzenia usługi.

Podczas tworzenia celu konieczne będzie utworzenie dowiązań symbolicznych do target.wantskatalogu z katalogu usług systemd. Następnie możesz ustawić / uruchomić swój cel. Oto jak może wyglądać na podstawie Twojego przykładu.

/etc/systemd/system/foo.target

To jest plik jednostki celu. Jeśli jako przykład weźmy graficzny.target, możemy stworzyć własny cel, używając go jako podstawy.

[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

Aby wyjaśnić opcje zaczerpnięte ze stron systemowych;

  • Description- Opisuje cel. Powinieneś zrozumieć
  • Requires- Trudne zależności od celu. Powinieneś pozwolić na uruchomienie podstawowego systemu przed uruchomieniem własnych usług
  • Wants- Miękkie zależności. Cel nie wymaga ich uruchomienia.
  • Conflicts - Jeśli jednostka ma ustawienie Konflikty na innej jednostce, uruchomienie pierwszej spowoduje zatrzymanie drugiej i odwrotnie.
  • After - Buty po tych usługach
  • AllowIsolate- Naprawdę zależy od ciebie i twojego środowiska. Szczegóły są dostępne na stronie podręcznikasystemd.unit(5)

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

To jest katalog, w którym podłączysz usługi, które tworzysz / potrzebujesz dla swojego celu. Jest to odpowiednik Wants=opcji w pliku jednostkowym. Utwórz ten katalog, a następnie utwórz takie dowiązania symboliczne; ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service. Spowoduje to utworzenie dowiązania symbolicznego z bar.service w katalogu systemowym do katalogu foo.target.wants.


Myślę, że utworzenie pliku jednostkowego dla usługi jest w pewnym sensie poza zakresem tej odpowiedzi, a to pytanie jest zdecydowanie bardziej udokumentowane, więc na razie o tym nie wspominam. Kiedy tworzysz plik jednostki, po prostu symlinkuj go do katalogu target.wants lub dodaj go do Wants=dyrektywy.

m32
źródło
Postępowałem zgodnie z powyższym, aby utworzyć nowy cel i dodałem kilka celów do mojej usługi. Jednak żadna z tych usług nie jest uruchamiana przez systemd. Czy istnieje kompletny przykład, który pokazuje, że usługi w ramach nowo dodanego celu działają?
linuxfan
1
Zobacz post stosu nekromanty, jeśli szukasz prostych kroków, aby skonfigurować niestandardową usługę do uruchomienia podczas rozruchu.
Pilbox
@linuxfan Dodaję foo.targetdo Requirespola i Beforepola multi-user.target, i to podoba Requires: base.target foo.target. Następnie ponownie uruchomię Arch Arch vm i foobar.serviceuruchomię się automatycznie jako demon.
L_K
2
Dobra odpowiedź, ale tak naprawdę nie działa tak, jak można się spodziewać. 1. Tylko dlatego, że ma ochotę, nie oznacza, że ​​usługa rozpocznie się od tego celu. 2. Wydaje się, że multi-user.targ ma jakieś ukryte rzeczy, które sprawiają, że działa.
Otheus,