Làm cách nào để ghi đè hoặc định cấu hình dịch vụ systemd?


109

Nhiều tập lệnh init sysv đã sử dụng một tệp tương ứng /etc/defaultđể cho phép người quản trị định cấu hình nó. Công việc mới bắt đầu có thể được sửa đổi bằng cách sử dụng .overridecác tập tin. Làm cách nào để ghi đè hoặc định cấu hình các đơn vị systemd, bây giờ systemd là mặc định trong Ubuntu?


Lưu ý rằng khi xóa 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ột ExecStart=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.
tysik

Câu trả lời:


185

systemdcác đơn vị không cần phải tuân theo các tập tin trong /etc/default. systemdcó 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 đó, systemdcho 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 foohoặ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.conftệ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 .conftệp khác trong /etc/systemd/system/foo.service.d/).

Ghi đè các đối số lệnh

Lấy gettydị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@tty2dịch vụ ( tty2là 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@tty2dị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 ExecStartdò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:

  1. Tôi phải dứt khoát rõ ràng ExecStarttrướ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ế RestartSechay Type. ExecStartcó thể có nhiều mục chỉ cho Type=oneshotcác dịch vụ.
  2. Tôi đã phải sử dụng tiêu đề phần thích hợp. Trong tệp gốc, ExecStartnằm trong [Service]phần, vì vậy ghi đè của tôi cũng phải đặt ExecStarttrong [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 catsẽ 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 edittự độ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@tty2là 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/defaultcác tệp là thiết lập các biến môi trường. Thông thường, /etc/defaultlà 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/grubchỉ 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 Environmentcá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 đè systemdcá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:


1
Bạn phải xóa biến trước khi đặt nó cho các dịch vụ không thuộc loại oneshot. Điều này đã giải quyết vấn đề của tôi.
Colin

3
@MarkEdington từ systemd.service(5)manpage, phần trên ExecStart: "Trừ khi Type = là oneshot, chính xác một lệnh phải được Khi Type = oneshot được sử dụng, không hay nhiều lệnh có thể được xác định lệnh có thể được xác định bằng cách cung cấp nhiều dòng lệnh trong cùng.. Lệnh này hoặc cách khác, lệnh này có thể được chỉ định nhiều lần với cùng một hiệu ứng. Nếu chuỗi trống được gán cho tùy chọn này, danh sách các lệnh bắt đầu được đặt lại, các phép gán trước của tùy chọn này sẽ không có hiệu lực. "
muru

1
@Orient bạn có thể sudo rmghi đè tệp và sau đó systemctl daemon-reload, hoặc bạn có thể systemctl editvà thay thế mọi thứ trong phần ghi đè bằng nhận xét. Nhận xét trong các tập tin dịch vụ bắt đầu bằng #.
muru

3
@Orientsystemctl revert foo
Ayell

1
Thứ tự ưu tiên của ba phương thức (tệp ghi đè, tệp môi trường, biến môi trường) là gì? Tức là, đối với một biến được xác định trong cả ba, giá trị nào sẽ là giá trị hiệu quả?
Nikolaos Kakouros
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.