Как переопределить или настроить службы systemd?

Многие сценарии инициализации sysv использовали соответствующий файл в /etc/default, чтобы позволить администратору настроить его. Upstart задания могут быть изменены с помощью файлов .override. Как переопределить или настроить модули systemd, теперь это systemd по умолчанию в Ubuntu?

110
задан 9 August 2015 в 06:31

1 ответ

systemd единицы не должны повиноваться файлам в /etc/default. systemd легко настраивается, но требует, чтобы Вы знали синтаксис systemd файлов единицы.

Пакеты обычно поставляют файлы единицы в /lib/systemd/system/. Они не должны быть отредактированы. Вместо этого systemd позволяет Вам переопределять эти файлы путем создания соответствующих файлов в /etc/systemd/system/.

Для данного сервиса foo, пакет обеспечил бы /lib/systemd/system/foo.service. Можно проверить его использование состояния systemctl status foo, или просмотрите его использование журналов journalctl -u foo. Переопределять что-то в определении foo, сделайте:

sudo systemctl edit foo

Это создает каталог в /etc/systemd/system названный в честь единицы, и override.conf файл в том каталоге (/etc/systemd/system/foo.service.d/override.conf). Можно добавить или переопределить настройки с помощью этого файла (или другой .conf файлы в /etc/systemd/system/foo.service.d/).

Переопределение аргументов команды

Возьмите getty сервис, например. Скажите, что я хочу иметь автовход в систему TTY2 своего пользователя (это не желательно, но просто пример). TTY2 выполняется getty@tty2 сервис (tty2 будучи экземпляром шаблона /lib/systemd/system/getty@service). Чтобы сделать это, я должен изменить getty@tty2 сервис.

$ 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

В частности, я должен измениться ExecStart строка, которая в настоящее время является:

$ systemctl cat getty@tty2 | grep Exec     
ExecStart=-/sbin/agetty --noclear %I $TERM

Для переопределения этого сделайте:

sudo systemctl edit getty@tty2

И добавьте:

[Service]
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

Обратите внимание что:

  1. Я должен был явно очиститься ExecStart прежде, чем установить его снова, поскольку это - аддитивная установка, подобная After, Environment (в целом, не на переменную) и EnvironmentFile, и настроенный против переопределяющих настроек как RestartSec или Type. ExecStart может иметь многократные въезды только для Type=oneshot сервисы.
  2. Я должен был использовать надлежащий заголовок раздела. В исходном файле, ExecStart находится в [Service] раздел, таким образом, мое переопределение должно поместить ExecStart в [Service] раздел также. Часто, взглянув на использование файла практической эксплуатации systemctl cat скажет Вам, что необходимо переопределить и которые разделяют его, находится в.

Обычно при редактировании systemd файла единицы чтобы он вступил в силу, необходимо работать:

sudo systemctl daemon-reload

Однако systemctl edit автоматически делает это для Вас.

Теперь:

$ 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 ; ... }

И если я делаю:

sudo systemctl restart getty@tty2

и нажмите CtrlAltF2, престо! Я буду зарегистрирован в свою учетную запись на этом TTY.

Поскольку я сказал прежде, getty@tty2 экземпляр шаблона. Так, что, если я хотел переопределить все экземпляры того шаблона? Это может быть сделано путем редактирования самого шаблона (удаляющий идентификатор экземпляра - в этом случае tty2):

systemctl edit getty@

Переопределение среды

Случай общего использования /etc/default файлы устанавливают переменные среды. Обычно, /etc/default сценарий оболочки, таким образом, Вы могли использовать конструкции языка оболочки в нем. С systemd, однако, дело обстоит не так. Можно указать переменные среды двумя способами:

Через файл

Скажите установку переменных среды в файле:

$ cat /path/to/some/file
FOO=bar

Затем можно добавить к переопределению:

[Service]
EnvironmentFile=/path/to/some/file

В частности, если Ваш /etc/default/grub содержит только присвоения и никакой синтаксис оболочки, Вы могли использовать его в качестве EnvironmentFile.

Через Environment записи

Вышеупомянутое могло также быть выполнено с помощью следующего переопределения:

[Service]
Environment=FOO=bar

Однако это может стать хитрым с несколькими переменными, пробелами, и т.д. Взгляните на один из моих других ответов для примера такого экземпляра.

Дальнейшее чтение

С помощью этого механизма становится очень легко переопределить systemd единицы, а также отменить такие изменения (путем простого удаления файла переопределения). Это не единственные настройки, которые могут быть изменены.

Следующие ссылки были бы полезны:

187
ответ дан 9 August 2015 в 16:31

Другие вопросы по тегам:

Похожие вопросы: