systemd
unit tidak perlu mematuhi file di /etc/default
. systemd
mudah dikonfigurasi, tetapi mengharuskan Anda tahu sintaks file unit systemd.
Paket mengirimkan file unit biasanya di /lib/systemd/system/
. Ini tidak boleh diedit. Sebagai gantinya, systemd
Anda dapat mengganti file-file ini dengan membuat file yang sesuai di /etc/systemd/system/
.
Untuk layanan yang diberikan foo
, paket akan menyediakan /lib/systemd/system/foo.service
. Anda dapat memeriksa statusnya menggunakan systemctl status foo
, atau melihat log menggunakan journalctl -u foo
. Untuk mengganti sesuatu dalam definisi foo
, lakukan:
sudo systemctl edit foo
Ini membuat direktori dengan /etc/systemd/system
nama setelah unit, dan override.conf
file dalam direktori itu ( /etc/systemd/system/foo.service.d/override.conf
). Anda dapat menambah atau mengabaikan pengaturan menggunakan file ini (atau .conf
file lain di /etc/systemd/system/foo.service.d/
).
Mengganti argumen perintah
Ambil getty
layanan misalnya. Katakanlah saya ingin memiliki TTY2 autologin kepada pengguna saya (ini tidak disarankan, tetapi hanya sebuah contoh). TTY2 dijalankan oleh getty@tty2
layanan ( tty2
menjadi contoh dari templat /lib/systemd/system/getty@service
). Untuk melakukan ini, saya harus memodifikasi getty@tty2
layanan.
$ systemctl cat getty@tty2
# /lib/systemd/system/getty@.service
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes
# On systems without virtual consoles, don't start any getty. Note
# that serial gettys are covered by serial-getty@.service, not this
# unit.
ConditionPathExists=/dev/tty0
[Service]
# the VT is cleared by TTYVTDisallocate
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes
# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=
[Install]
WantedBy=getty.target
DefaultInstance=tty1
Secara khusus, saya harus mengubah ExecStart
jalur, yang saat ini adalah:
$ systemctl cat getty@tty2 | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
Untuk mengesampingkan ini, lakukan:
sudo systemctl edit getty@tty2
Dan tambahkan:
[Service]
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM
Perhatikan bahwa:
- Saya harus menghapus secara eksplisit
ExecStart
sebelum mengaturnya lagi, karena ini merupakan pengaturan tambahan, mirip dengan After
, Environment
(secara keseluruhan, bukan per-variabel) dan EnvironmentFile
, dan menentang pengaturan utama seperti RestartSec
atau Type
. ExecStart
dapat memiliki beberapa entri hanya untuk Type=oneshot
layanan.
- Saya harus menggunakan header bagian yang tepat. Di file asli,
ExecStart
ada di [Service]
bagian, jadi penggantian saya harus dimasukkan ExecStart
ke [Service]
bagian juga. Seringkali, melihat file layanan yang sebenarnya menggunakan systemctl cat
akan memberi tahu Anda apa yang perlu Anda timpa dan di bagian mana.
Biasanya, jika Anda mengedit file unit systemd, agar bisa berlaku, Anda perlu menjalankan:
sudo systemctl daemon-reload
Namun, systemctl edit
secara otomatis melakukan ini untuk Anda.
Sekarang:
$ systemctl cat getty@tty2 | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM
$ systemctl show getty@tty2 | grep ExecS
ExecStart={ path=/sbin/agetty ; argv[]=/sbin/agetty -a muru --noclear %I $TERM ; ... }
Dan jika saya melakukannya:
sudo systemctl restart getty@tty2
dan tekan CtrlAltF2, presto! Saya akan masuk ke akun saya di TTY itu.
Seperti yang saya katakan sebelumnya, getty@tty2
adalah contoh dari sebuah template. Jadi, bagaimana jika saya ingin mengganti semua contoh template itu? Itu dapat dilakukan dengan mengedit templat itu sendiri (menghapus pengidentifikasi contoh - dalam kasus ini tty2
):
systemctl edit getty@
Mengesampingkan lingkungan
Kasus penggunaan umum /etc/default
file adalah pengaturan variabel lingkungan. Biasanya, /etc/default
ini adalah skrip shell, jadi Anda bisa menggunakan konstruksi bahasa shell di dalamnya. Dengan systemd
, bagaimanapun, ini tidak terjadi. Anda dapat menentukan variabel lingkungan dengan dua cara:
Melalui file
Katakanlah Anda telah menetapkan variabel lingkungan dalam file:
$ cat /path/to/some/file
FOO=bar
Kemudian, Anda dapat menambahkan ke override:
[Service]
EnvironmentFile=/path/to/some/file
Secara khusus, jika Anda /etc/default/grub
hanya berisi tugas dan tidak ada sintaks shell, Anda dapat menggunakannya sebagai EnvironmentFile
.
Melalui Environment
entri
Hal di atas juga dapat dilakukan dengan menggunakan penggantian berikut:
[Service]
Environment=FOO=bar
Namun, ini bisa menjadi rumit dengan beberapa variabel, spasi, dll. Lihatlah salah satu jawaban saya yang lain untuk contoh dari contoh seperti itu.
Bacaan lebih lanjut
Melalui mekanisme ini, menjadi sangat mudah untuk menimpa systemd
unit, serta membatalkan perubahan tersebut (hanya dengan menghapus file override). Ini bukan satu-satunya pengaturan yang dapat dimodifikasi.
Tautan berikut akan bermanfaat:
ExecStart=
entri kosong Anda tidak dapat memberikan komentar setelahnya seperti:ExecStart= # Empty line to clear previous entries.
Ini akan diambil sebagaiExecStart=
entri lain dan ditambahkan ke daftar. PS. Saya tidak bisa menambahkan komentar pada jawaban muru karena reputasi saya yang rendah.