Info
Content

systemd/systemctl

Команда systemctl без параметров или с подкомандой list-units выведет список запущенных юнитов

Вывод выглядит так
Screenshot_2.png
boot.mount loaded active mounted /boot

  1. UNIT - boot.mount - Название юнита и его тип
  2. LOAD - loaded - Состояние юнита, загружен или нет
  3. ACTIVE - active - Обобщенный статус
  4. SUB - mounted - Текущий статус
  5. DESCRIPTION - /boot - Описание

LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
JOB = Pending job for the unit.


Параметр --failed покажет список юнитов, запуск которых не удался

root@mars:~# systemctl --failed
0 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

Файлы юнитов находятся в /usr/lib/systemd/system/ и /etc/systemd/system/ (последний каталог имеет приоритет). Команда systemctl list-unit-files покажет список установленных юнитов


Юнитами могут быть сервисы, точки монтирования, устройства или сокеты

Обычно при использовании systemctl нужно указывать полное имя файла юнита (вметсе с суффиксом типа - sshd.socket). Но есть сокращения:

  • Если суффикс не указан, то предполагается что это сервис
  • Точки монтирования автоматически преобразуются в mount (напр. /home -> home.mount)
  • Имена устройств автоматически преобразуются в device (напр. /dev/sda2 -> dev-sda2.device)

Некоторые юниты содержат в названии символ @ - название@строка.service
Это значит что они являются экземплярами юнита-шаблона. Имя юнита шаблона не содержит части строка - название@.service
строка - это идентификатор экземпляра


  • systemctl help ntp.service - показать man для юнита
  • systemctl status ntp.service - статус юнита
  • systemctl is-enabled ntp.service - добавлен ли в автозагрузку
  • systemctl start/stop/restart/reload/enable/disable ntp.servec - и так понятно
  • systemctl daemon-reload - systemd при запуске загружает файлы юнитов с файловой системы в память, при изменении файла юнита, systemd изменения не увидит. Эта команда заставит systemd перечитать все юниты заново (и мягко перезапустит их)

systemctl mask/unmask ntp.service - маскирует юнит. Это делает невозможным его запуск

root@mars:/etc/systemd/system# systemctl mask ntp.service
Created symlink /etc/systemd/system/ntp.service → /dev/null.

root@mars:/etc/systemd/system# systemctl stop ntp.service

root@mars:/etc/systemd/system# systemctl start ntp.service
Failed to start ntp.service: Unit ntp.service is masked.

Файлы юнитов загружаются из разных мест, и чтобы увидеть эти места можно выполнить такую команду

root@mars:/etc/systemd# systemctl show --property=UnitPath
UnitPath=/etc/systemd/system.control /run/systemd/system.control /run/systemd/transient /etc/systemd/system /run/systemd/system /run/systemd/generator /lib/systemd/system /run/systemd/generator.late
  • /usr/lib/systemd/system/ - юниты, предоставляемые пакетами при их установке
  • /etc/systemd/system/ - юниты, устанавливаемые системным администратором

В файлах юнитов допустимы комментарии. Но каждый комментарий на отдельной строке. Комментарий начинается с решетки


Юнит файлы пакетов редактировать напрямую не стоит. Это вызовет проблемы с пакетным менеджером. Есть два пути редактирования юнит файла пакета (см. документацию)


Файлы из /etc/systemd/system/ переопределяют /usr/lib/systemd/system
А для того чтобы новый файл подтянулся, нужно выполнить systemctl reenable UNIT

Это можно сделать через утилиту systemctl edit --full UNIT
Она либо откроет файл из /etc/..., либо скопирует файл из /usr/lib/... в /etc/... и после редактирования автоматически перезагрузит все что нужно

Но этот метод может вызвать проблемы с пакетным менеджером


Также можно переопределять юнит файлы через drop-in файлы. Нужно создать каталог /etc/systemd/system/UNIT.d/ и в нем создать .conf файлы (описываются так же как и юнит-файлы). systemd будет применять эти файлы поверх оригинального

Это делает команда systemctl edit UNIT (без флага --full)

Чтобы отменить изменения сделанные через edit нужно выполнить systemctl revert UNIT


Для просмотра юнитов можно использовать systemctl cat ntp.service


systemd-delta - позволяет увидеть какие есть оверрайды для каких юнитов

root@mars:/etc/systemd# systemd-delta
[OVERRIDDEN] /etc/systemd/system/ntp.service → /usr/lib/systemd/system/ntp.service

Files /usr/lib/systemd/system/ntp.service and /etc/systemd/system/ntp.service are identical

[EXTENDED]   /usr/lib/systemd/system/rc-local.service → /usr/lib/systemd/system/rc-local.service.d/debian.conf
[EXTENDED]   /usr/lib/systemd/system/systemd-resolved.service → /usr/lib/systemd/system/systemd-resolved.service.d/resolvconf.conf
[EXTENDED]   /usr/lib/systemd/system/systemd-timesyncd.service → /usr/lib/systemd/system/systemd-timesyncd.service.d/disable-with-time-daemon.conf

4 overridden configuration files found.

Цели ( target ) используются для группировки юнитов по зависимостям в качестве точек синхронизации (как уровни запуска)

Показать все текущие цели можно такой командой

systemctl list-units --type=target

Уровни запуска, имеющие определённое значение в sysvinit (0, 1, 3, 5 и 6), один в один соответствуют конкретным целям systemd

Уровнень запуска SysV Цель systemd Примечания
0 runlevel0.target, poweroff.target Выключение системы
1, s, single runlevel1.target, rescue.target Однопользовательский уровень запуска
2, 4 runlevel2.target, runlevel4.target, multi-user.target Уровни запуска, определенные пользователем/специфичные для узла. По умолчанию соответствует уровню запуска 3
3 runlevel3.target, multi-user.target Многопользовательский режим без графики. Пользователи, как правило, входят в систему при помощи множества консолей или через сеть
5 runlevel5.target, graphical.target Многопользовательский режим с графикой. Обычно эквивалентен запуску всех служб на уровне 3 и графического менеджера входа в систему
6 runlevel6.target, reboot.target Перезагрузка
emergency emergency.target Аварийная оболочка

Переключаться между режимами можно так

systemctl isolate default.target
systemctl isolate rescue.target
systemctl isolate emergency.target

systemctl default
systemctl rescue
systemctl emergency

systemctl reboot
systemctl poweroff

Создаёте новый юнит-цель с названием /etc/systemd/system/цель, который берет за основу один из существующих уровней запуска (взгляните, например, на /usr/lib/systemd/system/graphical.target), создаёте каталог /etc/systemd/system/цель.wants, а после этого — символические ссылки на те службы из каталога /usr/lib/systemd/system/, которые вы хотите включить при загрузке

Зависимости, о которых сказано выше, можно добавлять с помощью команд

systemctl add-wants <target-unit-name> <requirement-name>
systemctl add-requires <target-unit-name> <requirement-name>

Изменить текущую цель можно командой systemctl isolate UNIT.target
Это не повлияет на последующие загрузки (только на текущую)


Стандартная цель это default.target
Узнать текущую цель можно так

# systemctl get-default
graphical.target

А указать цель можно через systemctl set-default UNIT

Также это можно указать через параметры ядра


systemd.mount - отвечает за монтирование разделов и ФС из файла /etc/fstab


systemd-tmpfiles позволяет управлять временными файлами и каталогами (пример: samba предполагает что существует каталог /run/samba с нужными правами доступа)


systemctl preset <unit-name>

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


Бывает так что юнит файл находится вне путей стандартного авто-поиска юнитов
В этом случае можно слинковать этот файл в нужно место

systemctl preset <unit-name>

Эта команда создаст ссылку в на файл в нужной папке


systemctl revert <unit-name>

Восстановит юнит-файл к изначальному состоянию. Сотрет drop-in юниты, отменит результаты команд edit, set-property, mask


С помощью systemctl show-environment можно увидеть переменные окружения которые доступны всем запускаемым юнитам

Устанавливать переменные можно через set-environment

systemctl set-environment MY_VAR=test

А удалять через unset-environment

systemctl unset-environment MY_VAR

No Comments
Back to top