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

58

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

    
задан muru 09.08.2015 в 05:31
источник

1 ответ

100

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

Пакеты упаковывают файлы блоков, обычно в /lib/systemd/system/ . Это not для редактирования. Вместо этого 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 запускается службой [email protected] ( tty2 , являющейся экземпляром шаблона /lib/systemd/system/[email protected] ). Для этого мне нужно изменить службу [email protected] .

$ systemctl cat [email protected]
# /lib/systemd/system/[email protected]
#  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 [email protected], 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 [email protected] | grep Exec     
ExecStart=-/sbin/agetty --noclear %I $TERM

Чтобы переопределить это, выполните:

sudo systemctl edit [email protected]

И добавьте:

[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 [email protected] | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

$ systemctl show [email protected] | grep ExecS
ExecStart={ path=/sbin/agetty ; argv[]=/sbin/agetty -a muru --noclear %I $TERM ; ... }

И если я это сделаю:

sudo systemctl restart [email protected]

и нажмите Ctrl Alt F2 , presto! Я войду в свою учетную запись на этом TTY.

Как я уже говорил, [email protected] является экземпляром шаблона. Итак, что, если я хотел бы переопределить все экземпляры этого шаблона? Это можно сделать, отредактировав сам шаблон (удалив идентификатор экземпляра - в этом случае tty2 ):

systemctl edit [email protected]

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

Общим вариантом использования файлов /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 единиц, а также отменить такие изменения (просто удалив файл переопределения). Это не единственные настройки, которые можно изменить.

Полезны следующие ссылки:

ответ дан muru 09.08.2015 в 05:31
источник