GNU/Linux >> Belajar Linux >  >> Linux

Letakkan File Unit Systemd?

Saya membaca bahwa ada dua folder untuk file unit (tidak 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 untuk pertanyaan ini:Bagaimana menulis skrip startup untuk Systemd. Dapatkah seseorang mengisi informasi yang hilang sehingga saya mengerti apa yang sedang terjadi? (PERBARUI:Jawabannya telah diperbarui, dan pemahaman saya tidak lagi bertentangan dengannya. )

Juga, tampaknya skrip diatur dalam subfolder di dalam /etc/systemd/system/ map:

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

Di lokasi lain saya membaca bahwa ada lokasi lain. Sepertinya 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 ini tautan ke pertanyaan terkait yang baru-baru ini saya tanyakan:Di mana saya meletakkan skrip yang dieksekusi oleh unit systemd?

Jawaban yang Diterima:

Tempat terbaik untuk meletakkan sistem file unit: /etc/systemd/system Pastikan untuk menambahkan target di bawah bagian [Instal], baca “Bagaimana cara mengetahuinya?” untuk rincian. PERBARUI :/usr/local/lib/systemd/system adalah opsi lain, baca “Area Abu-abu” untuk detailnya.”

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

Yang benar adalah bahwa unit systemd (atau sebagai kalimat intro menyebutnya, "konfigurasi unit") dapat pergi ke mana saja —asalkan Anda bersedia membuat symlink manual dan Anda mengetahui peringatannya. Itu membuat hidup lebih mudah untuk menempatkan unit di mana systemctl daemon-reload dapat menemukannya karena beberapa alasan bagus:

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

Bagaimana ia tahu?

Dan bagaimana tepatnya systemctl enable tahu di mana membuat symlink? Anda melakukan hard code 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, systemctl tahu 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 membuat daftar semua grup dengan systemctl list-units --type target ). Grup file unit yang akan dimuat dengan target dimasukkan ke dalam targetname.target.wants direktori. Ini hanyalah direktori yang penuh dengan symlink (atau yang asli). Jika [Install] . Anda bagian mengatakan itu WantedBy multi-user.target , tetapi jika symlink ke sana tidak ada di multi-user.target.wants direktori, maka itu tidak akan dimuat. Ketika generator unit systemd menambahkan file unit Anda ke cache pohon ketergantungan saat boot (Anda dapat memicu generator secara manual dengan systemctl daemon-reload ), secara otomatis mengetahui di mana harus meletakkan symlink—dalam hal ini di direktori /etc/systemd/system/multi-user.target.wants/ jika Anda mengaktifkannya.

Poin Penting dalam Manual:

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

Di bawah systemctl, cari Perintah File Unit

Jalur Pemuatan File Unit

Silakan baca dan pahami kalimat pertama dalam kutipan berikut dari man systemd.unit (karena ini menyiratkan bahwa semua jalur yang saya sebutkan di sini mungkin tidak berlaku untuk Anda jika systemd Anda dikompilasi dengan jalur yang berbeda):

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

Ketika variabel $SYSTEMD_UNIT_PATH diatur, isi variabel ini menimpa jalur beban unit. Jika $SYSTEMD_UNIT_PATH diakhiri dengan komponen kosong (“:”), jalur pemuatan unit yang biasa akan ditambahkan ke konten variabel.

Tabel 1 dan Tabel 2 dari man systemd.unit bagus.

Terkait:Gema ke deskriptor file menimpa file?

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

  • /etc/systemd/system Konfigurasi lokal
  • /run/systemd/system Unit waktu proses
  • /usr/lib/systemd/system Unit paket yang diinstal (atau /lib/systemd/system dalam beberapa kasus, baca man systemd.unit )

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

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

Bergantung pada pengguna

  • $XDG_CONFIG_HOME/systemd/user Konfigurasi pengguna (hanya digunakan saat $XDG_CONFIG_HOME sudah diatur)

  • $HOME/.config/systemd/user Konfigurasi pengguna (hanya digunakan saat $XDG_CONFIG_HOME tidak disetel)

  • $XDG_RUNTIME_DIR/systemd/user Unit waktu proses (hanya digunakan saat $XDG_RUNTIME_DIR sudah diatur)

  • $XDG_DATA_HOME/systemd/user Unit paket yang telah diinstal di direktori home (hanya digunakan ketika $XDG_DATA_HOME sudah diatur)

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

--global (semua pengguna)

Unit yang berlaku untuk semua pengguna—artinya dimiliki oleh setiap pengguna juga. Jadi setiap pengguna dapat menghentikan layanan ini meskipun 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 (atau /lib/systemd/system dalam beberapa kasus, baca man systemd.unit)
  • /run/systemd/user Unit waktu proses

Area Abu-abu

Di satu sisi, File Hierarchy Standard menetapkan bahwa /etc adalah untuk konfigurasi lokal yang tidak menjalankan binari. Di sisi lain
itu menetapkan bahwa /usr/local/ "untuk digunakan oleh administrator sistem saat menginstal perangkat lunak secara lokal". Anda juga dapat berargumen (jika bukan hanya untuk tujuan organisasi) bahwa semua file unit sistem harus berada di bawah /usr/local/lib/systemd/system , tetapi ini ditujukan untuk file unit yang merupakan bagian dari "perangkat lunak" bukan dari manajer paket.
Unit pengguna systemd terkait yang mencakup seluruh sistem dapat berada di bawah /usr/local/lib/systemd/user .

Satuan Sementara

Tempat lain yang terlupakan sama sekali tidak ada di mana pun! Mungkin program yang kurang dikenal adalah systemd-run . Anda dapat menggunakannya untuk menjalankan unit sementara dengan cepat. lihat man systemd-run .

Misalnya, untuk menjadwalkan reboot besok pagi jam 4 pagi (Anda mungkin perlu --force untuk memastikan reboot terjadi):

systemd-run -u restart --description="Restarts machine" --on-calendar="2020-12-18 00:04:00" systemctl --force reboot

Ini akan menghasilkan file unit sementara restart.service dan pengatur waktu yang sesuai (karena --on-calendar , ditunjukkan oleh transient=yes .

/run/systemd/transient/restart.service

# This is a transient unit file, created programmatically via the systemd API. Do not edit.
[Unit]
Description=Restarts machine

[Service]
ExecStart=
ExecStart="/usr/bin/systemctl" "--force" "reboot"

Perhatikan bahwa ada juga opsi kekuatan ganda yang lebih berbahaya --force --force , yang memberi tahu kernel untuk segera berhenti (dan, jika Anda tidak tahu apa yang Anda lakukan, tidak aman, karena hampir sama dengan memotong daya).

Terkait:Perangkat berdaya rendah dalam unit tertutup — bantuan desain?
Linux
  1. Bagaimana Menyalin File Dan Membuat Direktori Target Pada Saat Yang Sama?

  2. Systemd:Tidak Dapat Menonaktifkan File Unit yang Dihasilkan?

  3. Kesalahan kompilasi Openssl

  1. Systemd Unit File - WantedBy dan After

  2. Linux:Tempat meletakkan file swap

  3. Apakah ada cara untuk melihat pohon eksekusi systemd?

  1. Salin file di terminal Linux

  2. Ganti nama file di terminal Linux

  3. Pindahkan file di terminal Linux