Відповіді:
systemd
одиниці не повинні виконувати файли в /etc/default
. 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
і натисніть 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
одиниці, а також скасувати такі зміни (просто видаливши файл перезапису). Це не єдині настройки, які можна змінити.
Наступні посилання будуть корисними:
systemd
systemd
сторінках Довідника , зокрема, з сторінки керівництво systemd.unit
іsystemd.service
systemd.service(5)
, розділ на тему ExecStart
: "Якщо Type = є onehot, потрібно вказати рівно одну команду. Коли використовується Type = onehot, можна вказати нуль або більше команд. Команди можуть бути визначені шляхом надання декількох командних рядків в одній і тій же. Директива, або, як альтернатива, ця директива може бути задана не один раз з однаковим ефектом. Якщо порожній рядок призначений цій опції, список команд для початку буде скинутий, попередні призначення цього параметра не матимуть ефекту. "
sudo rm
перезаписати файл, а потім systemctl daemon-reload
, або ви можете systemctl edit
замінити все, що перезаписане, коментарями. Коментарі в службових файлах починаються з #
.
systemctl revert foo
ExecStart=
з порожнім записом ви не можете ставити коментар після нього, як:ExecStart= # Empty line to clear previous entries.
Це буде сприйнято як іншийExecStart=
запис та додано до списку. PS. Я не зміг додати коментар до відповіді Муру через низьку репутацію.