Bagaimana cara membuat target systemd?

16

Setelah mencari banyak melalui banyak posting, video Youtube, dan "dokumentasi" tentang masalah systemd, saya masih bingung.

Tautan tersebut ( https://wiki.archlinux.org/index.php/systemd#Create_custom_target ) tampak menjanjikan, tetapi agak kabur (bagi saya).

Pertanyaan

Bagaimana cara membuat target systemd kustom (IE: foo.target) sehingga seseorang dapat boot dengan unit layanan tertentu?

Contoh

  1. System mem-boot default.target (symlink dari "foo.target")
  2. "foo.target" hanya memulai server X barebones dan program GUI, katakan "gvim".

Alasan

Saya hanya ingin membuat target khusus untuk meluncurkan satu program X dengan cepat. Saya senang mengecualikan semua layanan yang tidak saya butuhkan.

Terima kasih sebelumnya!

Pilbox
sumber

Jawaban:

16

Membaca man 5 systemd.unitdan man 5 systemd.targetmemberi tahu kami bahwa file unit digunakan untuk menentukan target dan juga semua yang lainnya systemd. Tidak ada dokumentasi khusus tentang cara membuat target , sehingga sulit untuk menentukan bagaimana harus dilakukan, tetapi tidak terlalu berbeda dengan membuat layanan.

Saat Anda membuat target, Anda perlu membuat symlink ke target.wantsdirektori dari direktori layanan systemd. Kemudian Anda dapat mengatur / boot target Anda. Begini caranya terlihat diberikan contoh Anda.

/etc/systemd/system/foo.target

Ini adalah file unit target. Jika graphical.target diambil sebagai contoh, kita dapat membuat target kita sendiri dengan menggunakannya sebagai basis.

[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

Untuk menjelaskan opsi yang diambil dari halaman manual systemd;

  • Description- Menjelaskan target. Anda harus mengerti
  • Requires- Ketergantungan yang sulit dari target. Anda harus membiarkan sistem dasar dimulai sebelum Anda memulai layanan Anda sendiri
  • Wants- Ketergantungan lunak. Target tidak mengharuskan ini untuk memulai.
  • Conflicts - Jika suatu unit memiliki pengaturan Konflik pada unit lain, memulai yang pertama akan menghentikan yang terakhir dan sebaliknya.
  • After - Boot setelah layanan ini
  • AllowIsolate- Benar-benar terserah Anda dan lingkungan Anda. Detail tersedia di halaman manualsystemd.unit(5)

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

Ini adalah direktori tempat Anda akan menautkan layanan yang Anda buat / butuhkan untuk target Anda. Ini sama dengan Wants=opsi dalam file unit. Buat direktori ini dan kemudian buat symlink seperti itu; ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service. Ini menciptakan symlink dari bar.service di direktori sistem ke direktori foo.target.wants Anda.


Saya pikir membuat file unit untuk layanan agak di luar cakupan jawaban ini, dan pertanyaan itu jelas lebih didokumentasikan jadi saya akan meninggalkannya untuk saat ini. Saat Anda membuat file unit Anda, cukup sambungkan ke direktori target.wants atau tambahkan ke Wants=direktif.

m32
sumber
Saya mengikuti langkah di atas untuk membuat target baru dan menambahkan beberapa target ke layanan saya. Namun, tidak ada layanan yang dijalankan oleh systemd. Apakah ada contoh lengkap yang menunjukkan layanan dalam target yang baru ditambahkan berfungsi?
linuxfan
1
Lihat posting tumpukan necromancer jika Anda mencari langkah-langkah sederhana untuk mengatur layanan kustom untuk dijalankan saat boot.
Pilbox
@linuxfan saya tambahkan foo.targetke Requiresbidang dan Beforebidang multi-user.target, dan rasanya Requires: base.target foo.target. Setelah itu saya me-reboot Arch Linux vm saya, dan foobar.serviceakan berjalan sebagai daemon secara otomatis.
L_K
2
Jawaban yang bagus, tetapi sepertinya tidak berfungsi seperti yang Anda harapkan. 1. Hanya karena keinginannya tidak berarti layanan akan mulai dengan target itu. 2. Multi-user.target tampaknya memiliki beberapa hal tersembunyi yang membuatnya berfungsi.
Otheus