Di mana saya meletakkan file unit systemd saya?

59

Saya membaca bahwa ada dua folder untuk file unit (bukan dalam mode pengguna).

/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator

Bertentangan dengan pemahaman ini adalah jawaban berikut: https://unix.stackexchange.com/a/47715/33386 . Dapatkah seseorang mengisi informasi yang hilang sehingga saya mengerti apa yang sedang terjadi? ( PEMBARUAN: Jawabannya telah diperbarui, dan pemahaman saya tidak lagi bertentangan dengan itu. )

Selain itu, tampaknya skrip disusun dalam subfolder di dalam /etc/systemd/system/folder:

getty.target.wants
multi-user.target.wants

Di lokasi lain saya membaca bahwa ada lokasi lain. Tampaknya ini untuk layanan khusus pengguna.

/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.

Pembaruan 2015-08-31:

Demi orang lain, berikut adalah tautan ke pertanyaan terkait yang baru-baru ini saya tanyakan: Di mana saya meletakkan skrip yang dijalankan oleh unit systemd?

Jonathan Komar
sumber
4
/etc/systemd/systemadalah tempat Anda meletakkan skrip Anda, pacman menempatkan skrip paket /usr/lib/systemd/systemdan mengeluarkan systemctl enable foo.servicemenciptakan symlink dari /usrke /etc...
jasonwryan
1
Lihat man systemd.target: itu menjelaskan alasan di balik pengelompokan.
jasonwryan

Jawaban:

57

Tempat terbaik untuk meletakkan file unit sistem : /etc/systemd/system Pastikan untuk menambahkan target di bawah bagian [Instal], baca "Bagaimana dia tahu?" untuk detail. PEMBARUAN : /usr/local/lib/systemd/systemadalah opsi lain, baca "Area Abu-abu" untuk detailnya. "

Tempat terbaik untuk meletakkan file unit pengguna : /etc/systemd/user atau $HOME/.config/systemd/user tetapi tergantung pada izin dan situasinya.

Yang benar adalah bahwa unit systemd (atau seperti kalimat intro menyebutnya, "konfigurasi unit") dapat pergi ke mana saja — terbukti Anda bersedia membuat symlink manual dan Anda menyadari peringatan. Itu membuat hidup lebih mudah untuk menempatkan unit di mana systemctl daemon-reloaddapat menemukannya untuk beberapa alasan:

  • Menggunakan lokasi standar berarti bahwa generator systemd akan menemukannya dan membuatnya mudah diaktifkan saat booting systemctl enable. Ini karena unit Anda secara otomatis akan ditambahkan ke pohon dependensi unit (cache unit).
  • Anda tidak perlu memikirkan izin, karena hanya pengguna dengan hak istimewa yang dapat menulis ke area yang ditentukan.

Bagaimana bisa tahu?

Dan bagaimana tepatnya systemctl enabletahu di mana membuat symlink? Anda membuat kode keras di dalam unit itu sendiri di bawah [install]bagian. Biasanya ada garis seperti

[Install]
WantedBy = multi-user.target

yang sesuai dengan tempat yang telah ditentukan pada sistem file. Dengan cara ini, systemctltahu bahwa unit ini bergantung pada sekelompok file unit yang disebut multi-user.target("target" adalah istilah yang digunakan untuk menunjuk grup ketergantungan unit. Anda dapat mencantumkan semua grup dengan systemctl list-units --type target). Grup file unit yang akan dimuat dengan target dimasukkan ke dalam targetname.target.wantsdirektori. Ini hanya direktori yang penuh dengan symlink (atau yang asli). Jika Anda [Install]bagian mengatakan itu adalah WantedByyang multi-user.target, tetapi jika symlink untuk itu tidak ada dalam multi-user.target.wantsdirektori, maka tidak akan memuat. Ketika generator unit systemd menambahkan file unit Anda ke cache pohon dependensi saat boot (Anda dapat secara manual memicu generator dengan systemctl daemon-reload), ia secara otomatis tahu di mana harus meletakkan symlink — dalam hal ini dalam direktori/etc/systemd/system/multi-user.target.wants/ haruskah Anda mengaktifkannya.

Poin-Poin Utama dalam Manual:

Unit tambahan mungkin dimuat ke systemd ("ditautkan") dari direktori bukan pada jalur pemuatan unit. Lihat perintah tautan untuk systemctl (1).

Di bawah systemctl, cari Perintah File Unit

Jalur Muat File Unit

File unit diambil dari serangkaian jalur yang ditentukan selama kompilasi, dijelaskan dalam dua tabel di bawah ini. File unit yang ditemukan dalam direktori yang tercantum sebelumnya menimpa file dengan nama yang sama di direktori yang lebih rendah dalam daftar.

Ketika variabel $SYSTEMD_UNIT_PATHdiatur, konten variabel ini menimpa jalur beban unit. Jika $SYSTEMD_UNIT_PATHdiakhiri dengan komponen kosong (":"), jalur muatan unit biasa akan ditambahkan ke konten variabel.

Tabel 1 dan Tabel 2 dari man systemd.unitbaik.

Muat jalur saat berjalan dalam mode sistem ( --system).

  • /etc/systemd/system Konfigurasi lokal
  • /run/systemd/system Unit runtime
  • /usr/lib/systemd/system Unit paket yang diinstal

Muat jalur saat berjalan dalam mode pengguna ( --user)

Ada perbedaan antara unit pengguna dan semua / unit pengguna global .

Tergantung pada pengguna

  • $XDG_CONFIG_HOME/systemd/user Konfigurasi pengguna (hanya digunakan saat $XDG_CONFIG_HOMEdiatur)
  • $HOME/.config/systemd/user Konfigurasi pengguna (hanya digunakan saat $XDG_CONFIG_HOMEtidak disetel)
  • $XDG_RUNTIME_DIR/systemd/user Unit runtime (hanya digunakan saat $XDG_RUNTIME_DIRdisetel)

  • $XDG_DATA_HOME/systemd/user Unit paket yang telah diinstal di direktori home (hanya digunakan saat $XDG_DATA_HOMEdisetel)

  • $HOME/.local/share/systemd/user Unit paket yang telah diinstal di direktori home (hanya digunakan saat $XDG_DATA_HOMEtidak disetel)

--global (semua pengguna)

Unit yang berlaku untuk semua pengguna - artinya dimiliki oleh setiap pengguna juga. Jadi setiap pengguna dapat menghentikan layanan ini bahkan jika administrator mengaktifkannya saat boot.

  • /etc/systemd/user Konfigurasi lokal untuk semua pengguna ( systemctl --global enable userunit.service)
  • /usr/lib/systemd/user Unit paket yang telah diinstal di seluruh sistem untuk semua pengguna
  • /run/systemd/user Unit runtime

Area abu-abu

Di satu sisi, File Hierarchy Standard menetapkan itu /etcuntuk konfigurasi lokal yang tidak menjalankan binari. Di sisi lain itu menentukan bahwa /usr/local/"digunakan oleh administrator sistem ketika menginstal perangkat lunak secara lokal". Anda juga bisa berargumen (jika bukan hanya untuk tujuan organisasi) bahwa semua file unit sistem harus /usr/local/lib/systemd/systemdimasukkan, tetapi ini ditujukan untuk file unit yang merupakan bagian dari "perangkat lunak" bukan dari manajer paket. Unit-unit pengguna systemd terkait yang seluruh sistem bisa masuk /usr/local/lib/systemd/user.

Jonathan Komar
sumber
Saran tentang memasukkan file unit /etc/systemd/system, apakah itu saran umum untuk file unit yang dibuat sendiri? Apa pun yang diinstal oleh manajer paket harus selalu dimasukkan /usr/lib/systemd/systemsebagai contoh.
slm
@slm Ya, ketika pertanyaan mengacu pada file unit systemd saya , ini dimaksudkan untuk menyiratkan yang dibuat sendiri.
Jonathan Komar
Saya akan berbeda: /etc/systemd/useruntuk layanan pengguna di seluruh sistem (dijamin) dan ~/.config/systemd/useruntuk layanan khusus pengguna khusus.
Suuuehgi
16

/etc/systemd/systemadalah tempat Anda meletakkan skrip Anda , pacman menempatkan skrip paket/usr/lib/systemd/system .

Penerbitan systemctl enable foo.servicemenciptakan symlinks dari /usrke /etc. Lihat bagian Unit Load Path man systemd.unit(5)untuk lebih detail.

jasonwryan
sumber
@ macmadness86 tidak ada karena tidak terkait dengan pertanyaan.
jasonwryan
1

Saya telah menulis 3, satu untuk ntpd, satu untuk kartu ethernet kedua, statis, dan satu untuk menjalankan p0f, pengenal OS pasif. Saya memasukkan semuanya /etc/systemd/system. Sepertinya saya mungkin bisa membiarkan systemdmenangani hal-hal NTP, tapi saya pikir saya tidak ingin terlalu bergantung pada itu.

Bruce Ediger
sumber