systemd
các đơn vị không cần phải tuân theo các tập tin trong /etc/default
. systemd
có thể dễ dàng cấu hình, nhưng yêu cầu bạn phải biết cú pháp của các tệp đơn vị systemd.
Gói các tập tin đơn vị tàu thường trong /lib/systemd/system/
. Đây không phải là để được chỉnh sửa. Thay vào đó, systemd
cho phép bạn ghi đè các tệp này bằng cách tạo các tệp thích hợp trong /etc/systemd/system/
.
Đối với một dịch vụ nhất định foo
, gói sẽ cung cấp /lib/systemd/system/foo.service
. Bạn có thể kiểm tra trạng thái của nó bằng cách sử dụng systemctl status foo
hoặc xem nhật ký của nó bằng cách sử dụng journalctl -u foo
. Để ghi đè một cái gì đó trong định nghĩa của foo
, làm:
sudo systemctl edit foo
Điều này tạo ra một thư mục /etc/systemd/system
được đặt tên theo đơn vị và một override.conf
tệp trong thư mục đó ( /etc/systemd/system/foo.service.d/override.conf
). Bạn có thể thêm hoặc ghi đè cài đặt bằng tệp này (hoặc các .conf
tệp khác trong /etc/systemd/system/foo.service.d/
).
Ghi đè các đối số lệnh
Lấy getty
dịch vụ ví dụ. Nói rằng tôi muốn có TTY2 autologin cho người dùng của mình (điều này không được khuyến khích, nhưng chỉ là một ví dụ). TTY2 được điều hành bởi getty@tty2
dịch vụ ( tty2
là một thể hiện của mẫu /lib/systemd/system/getty@service
). Để làm điều này, tôi phải sửa đổi getty@tty2
dịch vụ.
$ 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
Cụ thể, tôi phải thay đổi ExecStart
dòng, hiện tại là:
$ systemctl cat getty@tty2 | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
Để ghi đè lên điều này, hãy làm:
sudo systemctl edit getty@tty2
Và thêm:
[Service]
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM
Lưu ý rằng:
- Tôi phải dứt khoát rõ ràng
ExecStart
trước khi đặt nó một lần nữa, vì nó là một môi trường phụ gia, tương tự After
, Environment
(như một toàn thể, chứ không phải mỗi biến) và EnvironmentFile
, và trái ngược với trọng cài đặt như thế RestartSec
hay Type
. ExecStart
có thể có nhiều mục chỉ cho Type=oneshot
các dịch vụ.
- Tôi đã phải sử dụng tiêu đề phần thích hợp. Trong tệp gốc,
ExecStart
nằm trong [Service]
phần, vì vậy ghi đè của tôi cũng phải đặt ExecStart
trong [Service]
phần đó. Thông thường, việc xem tệp dịch vụ thực tế bằng cách sử dụng systemctl cat
sẽ cho bạn biết những gì bạn cần ghi đè và phần đó nằm trong phần nào.
Thông thường, nếu bạn chỉnh sửa tệp đơn vị systemd, để nó có hiệu lực, bạn cần chạy:
sudo systemctl daemon-reload
Tuy nhiên, systemctl edit
tự động làm điều này cho bạn.
Hiện nay:
$ 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 ; ... }
Và nếu tôi làm:
sudo systemctl restart getty@tty2
và báo chí CtrlAltF2, uy tín! Tôi sẽ đăng nhập vào tài khoản của mình trên TTY đó.
Như tôi đã nói trước đây, getty@tty2
là một ví dụ của một mẫu. Vậy, điều gì sẽ xảy ra nếu tôi muốn ghi đè tất cả các phiên bản của mẫu đó? Điều đó có thể được thực hiện bằng cách chỉnh sửa chính mẫu (xóa định danh cá thể - trong trường hợp này tty2
):
systemctl edit getty@
Ghi đè môi trường
Một trường hợp sử dụng phổ biến của /etc/default
các tệp là thiết lập các biến môi trường. Thông thường, /etc/default
là một tập lệnh shell, vì vậy bạn có thể sử dụng các cấu trúc ngôn ngữ shell trong nó. Với systemd
, tuy nhiên, đây không phải là trường hợp. Bạn có thể chỉ định các biến môi trường theo hai cách:
Qua một tập tin
Giả sử bạn đã đặt các biến môi trường trong một tệp:
$ cat /path/to/some/file
FOO=bar
Sau đó, bạn có thể thêm vào ghi đè:
[Service]
EnvironmentFile=/path/to/some/file
Cụ thể, nếu bạn /etc/default/grub
chỉ chứa các bài tập và không có cú pháp shell, bạn có thể sử dụng nó làm EnvironmentFile
.
Qua Environment
các mục
Những điều trên cũng có thể được thực hiện bằng cách sử dụng ghi đè sau:
[Service]
Environment=FOO=bar
Tuy nhiên, điều này có thể trở nên khó khăn với nhiều biến số, dấu cách, v.v. Hãy xem một trong những câu trả lời khác của tôi để biết ví dụ về một ví dụ như vậy.
Đọc thêm
Thông qua cơ chế này, việc ghi đè systemd
các đơn vị cũng trở nên rất dễ dàng , cũng như hoàn tác các thay đổi đó (chỉ bằng cách xóa tệp ghi đè). Đây không phải là cài đặt duy nhất có thể được sửa đổi.
Các liên kết sau đây sẽ hữu ích:
ExecStart=
mục nhập trống, bạn không thể đặt bình luận sau khi nó thích:ExecStart= # Empty line to clear previous entries.
Điều này sẽ được coi là mộtExecStart=
mục khác và được thêm vào danh sách. Tái bút Tôi không thể thêm bình luận vào câu trả lời của muru vì danh tiếng thấp của tôi.