Systemd

Что такое Systemctl?

systemctl — это утилита, отвечающая за проверку и управление системой systemd и диспетчером служб. Это набор библиотек управления системой, утилит и демонов, которые функционируют как преемник демона инициализации System V. Новые команды systemctl оказались весьма полезными при управлении системными службами. Он предоставляет подробную информацию о конкретных службах systemd и других службах, которые используются в системе.

Имейте в виду, что в большинстве случаев systemctl не даст никаких результатов, если команда была написана неправильно. Однако, если systemctl не удалось выполнить задачу, вы получите сообщение об ошибке, указывающее, где именно произошёл сбой.

Управление службами

Что такое служба?

В системе systemd служба называется юнитом. Юнит — это любой ресурс, с которым система знает, как действовать и как управлять. Юниты определены в файлах конфигурации, называемыми файлами Unit-файлами или файлами модулей.

Проверка статуса службы

С помощью systemctl мы можем проверить состояние любой службы systemd на управляемой машине. Команда status предоставляет информацию о службе. Команда также покажет рабочее состояние или сведения о том, почему оно не работает, или если служба была остановлена непреднамеренно.

root@server# systemctl status имя_службы.service

Если мы подключены к серверу как пользователь без полномочий root, нам придется запускать команды systemctl с помощью sudo.

user@server$ sudo systemctl status имя_службы.service

При использовании systemctl не обязательно писать .service в имени службы. По умолчанию systemctl будет искать юниты с этим расширением.

root@server# systemctl status имя_службы

Пример вывода:

root@server# systemctl status dbus
● dbus.service - D-Bus System Message Bus
       Loaded: loaded (/lib/systemd/system/dbus.service; static)
       Active: active (running) since Mon 2022-05-02 18:55:55 MSK; 29min ago
  TriggeredBy: ● dbus.socket
         Docs: man:dbus-daemon(1)
     Main PID: 1300 (dbus-daemon)
        Tasks: 1 (limit: 18939)
       Memory: 8.6M
          CPU: 2.281s
       CGroup: /system.slice/dbus.service
             └─1300 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only

Запуск или остановка службы

Утилита systemctl также может использоваться для запуска или остановки служб systemd.

root@server# systemctl start имя_службы
root@server# systemctl stop имя_службы

Имейте в виду, что для успешного запуска службы, служба не должна быть запущена, а для успешной остановки, она должа быть запущена.

Перезапуск или перезагрузка службы

Работающую службу можно перезапустить с помощью команды restart, чтобы автоматически остановить и запустить службу.

root@server# systemctl restart имя_службы

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

root@server# systemctl reload имя_службы

Если мы не уверены, какую из двух команд нам следует использовать, есть дополнительная опция reload-or-restart, которая автоматически определит ее для нас.

root@server# systemctl reload-or-restart имя_службы

Включить или отключить службу

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

root@server# systemctl enable имя_службы

Для отключения функции автозагрузки для службы используется команда disable

root@server# systemctl disable имя_службы

Обзор состояния системы

Выше рассматривались команды systemctl для управления отдельными службами. Рассмотрим другие полезные функции.

Что такое Unit-файл?

Unit-файл — это простой текстовый файл, который содержит информацию о службе, сокете, устройстве, точке монтирования, файле подкачки, разделе, целевом объекте запуска или группе процессов.

Работа с Unit-файлами

Список служб

Команда list-units отобразит все активные службы systemd на машине. Вывод данной команды похож status, но менее подробный.

root@server# systemctl list-units

Вот пример вывода этой команды:

UNIT                           LOAD   ACTIVE SUB           DESCRIPTION
accounts-daemon.service        loaded active running       Accounts Service
apache2.service                loaded failed failed        The Apache HTTP Server
dbus.service                   loaded active running       D-Bus System Message Bus
bluetooth.service              loaded active running       Bluetooth service
fail2ban.service               loaded active running       Fail2Ban Service
snapd.service                  loaded active running       Snap Daemon

Рассмотрим значение каждого столбца.

  • UNIT: Имя модуля systemd.
  • LOAD: Показывает загружен ли файл конфигурации.
  • ACTIVE: Показывает запущен ли модуль (active) или успешно завершён (failed).
  • SUB: Более подробное состояние модуля.
  • DESCRIPTION: Краткое описание модуля и его функций.

Состояния модулей

Как сказано выше, команда list-units отобразит только активные службы, но чтобы получить список всех служб нужно использовать параметр --all

root@server# systemctl list-units -all

При использовании параметра --all будут выведены все модули, которые были загружены или которые systemd пытался загрузить. Также будут показаны неактивные, службы, находящиеся в мёртвом или неисправном состоянии.

Также есть ряд параметров для фильрации вывода. Один из них -- --state=. Он используется для фильтрации состояния в столбцах LOAD, ACTIVE и SUB.

root@server# systemctl list-units -all --state=failed

Также можно отфильтровать службы по типу.

root@server# systemctl list-units -all --type=mount

Команда list-units показывает только те модули, которые systemd пытался загрузить в память. Для того чтобы посмотреть все модули, включая незагруженные, используется команда list-unit-files. Она отобразит все доступные модули.

root@server# systemctl list-unit-files

Пример вывода:

UNIT FILE                 STATE           VENDOR PRESET
apache2.service           enabled         enabled
apparmor.service          enabled         enabled
bluetooth.service         enabled         enabled
dbus.service              static          -

Создание Unit-файла

Иногда нужно создать свой Unit-файл для пользовательских служб или другого экземпляра существующей службы. Для создания Unit-файла нужны права root. Файл создаётся в каталоге /etc/systemd/system/. Это делается так:

root@server# touch /etc/systemd/system/имя_службы.service
root@server# chmod 644 /etc/systemd/system/имя_службы.service

Далее открываем этот файл в текстовом редакторе (например Vim или Nano) и пишем в него параметры конфигурации службы. Ниже показан базовый пример Unit-файла.

[Unit]
Description=This is the manually created service
After=network.target

[Service]
ExecStart=/path/to/executable

[Install]
WantedBy=multi-user.target

Разберём каждую настройку подробнее.

  1. Description: Описание службы, которые будет отображаться при использовании команды status.
  2. After: Указывает на то, что служба запускается только после указанной службы или цели [1].
  3. ExecStart: Путь к исполняемому файлу службы.
  4. WantedBy: Указывает на цель [1], с которой должна запускаться служба.
[1](1, 2) См. Использование целей

После создания Unit-файла нужно сообщить об этом системе.

root@server# systemctl daemon-reload
root@server# systemctl start имя_службы

Просмотр Unit-файла

Для вывода Unit-файла конкретного модуля можно использовать команду cat.

root@server# systemctl cat имя_службы

Просмотр зависимостей

Для отображения дерева зависимостей модуля есть команда list-dependencies

root@server# systemctl list-dependencies имя_службы

Пример вывода:

root@server# systemctl list-dependencies bluetooth
bluetooth.service
● ├─dbus.socket
● ├─system.slice
● └─sysinit.target
●   ├─apparmor.service
●   ├─apparmor.service
●   ├─apparmor.service
●   ├─blk-availability.service
●   ├─dev-hugepages.mount
●   ├─dev-mqueue.mount
●   ├─keyboard-setup.service
●   ├─kmod-static-nodes.service
●   ├─lvm2-lvmpolld.socket
●   ├─lvm2-monitor.service
●   ├─plymouth-read-write.service
●   ├─plymouth-start.service
●   ├─proc-sys-fs-binfmt_misc.automount
●   ├─setvtrgb.service
●   ├─sys-fs-fuse-connections.mount
●   ├─sys-kernel-config.mount
●   ├─sys-kernel-debug.mount
●   ├─sys-kernel-tracing.mount
○   ├─systemd-ask-password-console.path
○   ├─systemd-binfmt.service
○   ├─systemd-boot-system-token.service
○   ├─systemd-hwdb-update.service
●   ├─systemd-journal-flush.service
●   ├─systemd-journald.service
○   ├─systemd-machine-id-commit.service
●   ├─systemd-modules-load.service
○   ├─systemd-pstore.service
●   ├─systemd-random-seed.service
●   ├─systemd-sysctl.service
●   ├─systemd-sysusers.service
●   ├─systemd-timesyncd.service
●   ├─systemd-tmpfiles-setup-dev.service
●   ├─systemd-tmpfiles-setup.service
●   ├─systemd-udev-trigger.service
●   ├─systemd-udevd.service
●   ├─systemd-update-utmp.service
●   ├─cryptsetup.target
●   ├─local-fs.target
●   │ ├─-.mount
●   │ ├─boot-efi.mount
●   │ ├─home.mount
○   │ ├─systemd-fsck-root.service
●   │ └─systemd-remount-fs.service
●   ├─swap.target
●   │ └─swapfile.swap
●   └─veritysetup.target

Просмотр свойств

Для просмотра свойств юнита используется команда show

root@server# systemctl show имя_службы

Пример вывода:

root@server# systemctl show ssh
Type=notify
Restart=on-failure
Type=notify
Restart=on-failure
NotifyAccess=main
RestartUSec=100ms
TimeoutStartUSec=1min 30s
TimeoutStopUSec=1min 30s
TimeoutAbortUSec=1min 30s
TimeoutStartFailureMode=terminate
TimeoutStopFailureMode=terminate
RuntimeMaxUSec=infinity
WatchdogUSec=infinity
WatchdogTimestampMonotonic=0
RootDirectoryStartOnly=no
RemainAfterExit=no
GuessMainPID=yes
RestartPreventExitStatus=255
MainPID=0
ControlPID=0
FileDescriptorStoreMax=0
NFileDescriptorStore=0
StatusErrno=0
Result=success
ReloadResult=success
CleanResult=success
UID=[not set]
GID=[not set]
NRestarts=0
OOMPolicy=stop
ExecMainStartTimestampMonotonic=0
ExecMainExitTimestampMonotonic=0
ExecMainPID=0
ExecMainCode=0
ExecMainStatus=0

Также можно вывести конкретный параметр с помощью флага -p. Например чтобы получить Result можно использовать команду:

root@server# systemctl show ssh -p Result
Result=success

Редактирование Unit-файлов.

В systemctl есть команда edit для редактирования Unit-файлов.

root@server# systemctl edit имя_службы

В этом случае будет создан каталог с добавленным к имени службы расширением .d. В нём будут храниться любые изменения. Для использования основного Unit-файла нужно добавить параметр --full

root@server# systemctl edit имя_службы --full

Удаление Unit-файлов

Удалить Unit-файл можно с помощью следующих команд

root@server# rm -r /etc/systemd/system/имя_службы.service.d
root@server# rm /etc/systemd/system/имя_службы.service

После этого нужно выполнить команду для применения изменений

root@server# systemctl daemon-reload

Использование целей

Что такое системная цель?

Существуют специальные Unit-файлы, которые описывают определённое состояние системы или точку синхронизации. У этих файлов есть специальное расшерение .target. Эти файлы используются для перевода системы в определённое состояние.

Список целей

Для перечисления всех системных целей можно использовать следующую команду

root@server# systemctl list-unit-files --type=target

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

root@server# systemctl list-units --type=target

Остановка или перезапуск машины

systemctl можно использовать для остановки, выключения или перезагрузки машины. Остановка:

root@server# systemctl halt

Полное выключение:

root@server# systemctl poweroff

Перезагрузка

root@server# systemctl reboot

Вывод

Утилита systemctl — это гибкий , универсальный и простой в использовании инструмент, с помощью которого мы можем контролировать и взаимодействовать с системой systemd для создания, изменения или удаления Unit-файлов.

Практическая часть

Задача 1. Запуск/ остановка служб

Посмотрите список всех запущенных служб с помощью команды systemctl. Остановите одну запущенную службу, а затем верните её в исходное состояние (подсказка: используйте утилиту systemctl + команду)

Задача 2. Отображение файла модуля

Команда cat была добавлена в версию systemd 209 и отображает файл модуля. Выведете на экран файл модуля демона-планировщика atd.

Задача 3. Редактирование файла модуля

Выведете список всех активных модулей, о которых знает systemd, затем отредактируйте файл модуля и удалите весь отредактированный файл (после удаления файла или каталога необходимо перезагрузить процесс systemd, чтобы он больше не пытался ссылаться на эти файлы и не возвращался к использов18_анию системных копий - для этого можно ввести следующую команду: systemctl daemon-reload)