Как переопределить или настроить службы systemd?
Многие сценарии инициализации sysv использовали соответствующий файл в /etc/default
разрешить администратору настроить его. Upstart задания могут быть изменены с помощью .override
файлы. Как переопределить или настроить модули systemd, теперь это systemd по умолчанию в Ubuntu?
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
Обратите внимание, что:
- Я должен был четко очистить
ExecStart
перед настройкой снова, так как это аддитивная настройка, аналогичнаяAfter
,Environment
(в целом, не для каждой переменной) иEnvironmentFile
и в отличие от переопределения настроек, таких какRestartSec
или жеType
,ExecStart
может иметь несколько записей только дляType=oneshot
Сервисы. - Я должен был использовать правильный заголовок раздела. В оригинальном файле
ExecStart
находится в[Service]
раздел, поэтому мое переопределение должно поставитьExecStart
в[Service]
раздел, а также. Часто, просматривая фактический файл сервиса, используяsystemctl cat
скажет вам, что вам нужно переопределить и в каком разделе он находится.
Обычно, если вы редактируете файл системного модуля, чтобы он вступил в силу, вам нужно выполнить:
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
и нажмите Ctrl Alt F2, нажмите! Я войду в свой аккаунт на этом 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
единиц, а также отменить такие изменения (просто удалив файл переопределения). Это не единственные настройки, которые можно изменить.
Следующие ссылки будут полезны:
- Arch Wiki запись на
systemd
- systemd для администраторов, часть IX: в /etc/sysconfig и / etc / default (ведущий разработчик systemd, Леннарт Поэттеринг)
-
systemd
manpages, в частности, manpagessystemd.unit
а такжеsystemd.service
- Запись вики Ubuntu на Systemd для пользователей Upstart