Systemd — это менеджер управления службами в Linux. При загрузке системы он запускает другие демоны, при этом делает это параллельно, что значительно ускоряет загрузку системы. Но зона ответственности менеджера systemd не ограничивается только запуском: каждый сервис запускается с собственным идентификатором, поэтому вы сможете вручную отслеживать статусы всех запущенных процессов, а при остановке одного из них systemd также остановит и дочерние.
Кроме быстродействия и возможности взаимодействовать с процессами напрямую, systemd также предоставляет информацию о сервисах, которую собирает из разных источников. Это достигается благодаря встроенной системе журналирования journald. Всю диагностическую информацию о работе сервиса вы можете увидеть благодаря journald — сообщения ядра, системные сообщения syslog, STDOUT и STDERR агрегируются в одном месте для того, чтобы пользователь мог быстро просмотреть информацию.
В этой статье мы рассмотрим управление системой инициализации systemd c помощью команды systemctl. Разберемся в том, как запускать и останавливать службы, проверять статус и работать с конфигурационными файлами.
Менеджер systemd заменил традиционную подсистему init в 2010-х годах и с тех пор стал системой инициализации по умолчанию во многих дистрибутивах Linux. Во всех linux-дистрибутивах, которые вы закажете на timeweb.cloud, systemd предустановлен.
Но в некоторых ОС при использовании команды systemctl вы всё ещё можете встретить ошибку systemctl is not installed. Это значит, что на вашей машине установлена другая система инициализации. Но сменить её на systemd несложно. Первое, что нужно сделать — установить пакет systemd:
sudo apt-get install systemd
Затем в настройках ядра Linux нужно прописать использование systemd. Для этого откроем файл с настройками загрузчика GRUB:
sudo nano /etc/default/grub
и добавим в настройку GRUB_CMDLINE_LINUX_DEFAULT
опцию init=/lib/systemd/systemd
.
Чтобы применить изменения нужно сгенерировать новый файл конфигурации grub и перезапустить систему:
sudo update-grub
sudo shutdown -r now
При управлении процессами менеджер systemd оперирует так называемыми модулями или юнитами. По сути, юнит — текстовое описание сервиса, в котором перечислены операции для выполнения до и после запуска службы.
Все модули можно найти в трёх каталогах:
Список всех запущенных модулей можно посмотреть, использовуя команду systemctl
. В терминале вы увидите таблицу со статусом каждой службы. Разберём, что означает каждый из столбцов:
Чтобы увидеть все модули, независимо от того, запущены они или нет, воспользуйтесь командой systemctl list-units --all
. Вы увидите все модули, которые когда-либо загружал или пытался загрузить диспетчер systemd. Для отображения конкретных записей используйте флаг --state
. Так, например, для того, чтобы увидеть все неактивные юниты, нужно использовать:
sudo systemctl list-units --all --state=inactive
Модули делятся на категории по типу. Тип каждого модуля можно узнать из названия файла — он указан через точку. Все типы модулей:
vds
Каждый модуль представляет собой текстовый файл, который разделён на обязательные секции и переменные. Разберём на примере модуля sshd:
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target
[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
Unit
Это первая обязательная секция. В ней описаны правила взаимодействия с другими службами и указаны метаданные — описание и документация. Подробнее:
Service
В этой секции необходимо указать, какими командами запускать службу:
Install
В этой секции нужно указать, на каком уровне загрузки системы нужно запускать сервис. Переменная WantedBy сообщает, как включится устройство, в качестве параметра указываются специальные файлы целей. Они служат для того, чтобы привести систему в разные состояния.
Список доступных целей вы можете получить, выполнив команду
sudo systemctl list-unit-files --type=target
Модули нельзя править напрямую. Для этого нужно использовать команду systemctl edit
. Откроется файл, который можно использовать для переопределения директив службы или добавления новых. При этом настройки из файла переопределения приоритетнее, чем настройки по умолчанию.
Если нужно отредактировать файл модуля целиком, а не добавлять новые директивы, нужно использовать флаг --full
:
sudo systemctl edit --full apache2.service
Перед вами откроется редактор, в котором вы можете править настройки юнита.
По умолчанию файлы переопределения хранятся в /etc/systemd/system/
, в каталоге который называется так же, как модуль, но с суффиксом .d
. Например, в случае apache2 это будет директория /etc/systemd/system/apache2.service.d/
.
Если вы редактируете конфигурацию напрямую с использованием флага --full
, нужный файл находится в каталоге /etc/systemd/system/
и называется так же, как модуль.
Для того, чтобы удалить переопределения, которые вы добавили, просто удалите каталог с суффиксом .d
. Если нужно восстановить настройки по умолчанию, удалите весь файл модуля. В случае с apache2 это:
sudo rm -r /etc/systemd/system/apache2.service.d
или
sudo rm /etc/systemd/system/apache2.service
После этого нужно перезагрузить процесс systemd:
sudo systemctl daemon-reload
Вы также можете создать собственный модуль systemd. Это нужно когда вы, например, написали какой-то скрипт и хотите работать с ним с помощью системного менеджера и добавить в автозагрузку.
Разберёмся на примере нашего вымышленного нового модуля, который проверяет состояние виртуальных серверов, заказанных на timeweb.cloud, — tmwb.service.
Сначала создадим юнит:
sudo nano /etc/systemd/system/tmwb.service
В описании укажем следующие строки:
[Unit]
Description=Timeweb uptime checker
[Service]
Type=simple
ExecStart=/bin/bash /var/sc/check-uptime.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Теперь нужно применить изменения и запустить службу
sudo systemctl daemon-reload
sudo systemctl start tmwb.service
Проверим статус и убедимся, что всё работает корректно:
sudo systemctl status tmwb.service
В этой статье нас интересуют только модули, которые имеют суффикс .service, то есть службы.
Благодаря утилите systemctl список сервисов легко получить:
systemctl list-units --type=service
Для работы с большинством служб мы можем не использовать суффикс .service
, потому что диспетчер systemd сам понимает, что вы хотите работать именно со службой, когда не указываете специфический юнит.
Чтобы запустить службу используйте команду start
. Например, для запуска apache2 выполним:
sudo systemctl start apache2.sevice
или
sudo systemctl start apache2
Для установки службы нужно использовать команду stop
. На примере apache2:
sudo systemctl stop apache2.service
Для того, чтобы перезапустить службу, используйте команду restart
. Например, мы внесли изменения в конфигурацию веб-сервера и теперь нам нужно перезапустить apache2, нужно выполнить:
sudo systemctl restart apache2.service
Некоторые приложения поддерживают перезагрузку файлов конфигурации без перезапуска всей службы. В таком случае вы можете использовать команду reload. Например, если вы работаете c nginx в качестве веб-сервера, после изменения конфигурационных файлов можно выполнить reload
:
sudo systemctl reload nginx.service
Но если вы не уверены, умеет ли служба перезагружать конфигурацию, воспользуйтесь командой reload-or-restart
. В таком случае systemd перезагрузит конфигурацию или всю службу:
sudo systemctl reload-or-restart apache2.service
Основное предназначение диспетчера systemd — запускать службы при загрузке системы. Но все команды, перечисленные выше, относились к работе только во время текущего сеанса.
Чтобы включить автозагрузку приложения, воспользуйтесь командой enable
. После этого systemd создаст символическую ссылку из служебного файла — /etc/systemd/system
— в место, где диспетчер ищет приложения для автозапуска.
sudo systemctl enable apache2.service
Чтобы отключить автозапуск, используйте disable
. При этом символическая ссылка будет удалена.
sudo systemctl disable apache2.service
Обратите внимание, что ни включение, ни отключение автозагрузки приложения не повлияют на работу службы в текущем сеансе.
Чтобы проверить статус службы в системе, нужно использовать команду status
.
Например, команда sudo systemctl status apache2.service
отобразит статус, процессы в иерархии контрольных групп и фрагмент журнала.
Этого достаточно для того, чтобы проверить, корректно ли работает служба и устранить проблемы, если они возникают.
Помимо развёрнутого отчёта о статусе службы диспетчер systemd также предоставляет методы для проверки конкретных статусов. Это позволяет обернуть множество проверок в скрипты и проще работать с результатом.
С помощью команды systemctl мы также можем получить более конкретную информацию о юнитах systemd. Чтобы прочитать файл модуля, нужно использовать команду cat
. Проверим, на примере службы sshd:
sudo systemctl cat sshd.service
В результате увидим файл модуля, с которым работает systemd.
Один модуль может вызывать работу других, поэтому важно контролировать эти зависимости. Systemctl предоставляет удобный иерархический вид для просмотра зависимостей модуля.
Вы также можете проверить все модули, которые зависят от указанного юнита, с помощью флага --reverse
.
Для того, чтобы просмотреть свойства на более низком уровне, чем это предоставляет cat
, нужно выполнить команду show
. Список свойств юнита будет выведен в формате ключ — значение.
sudo systemctl show apache2.service
Если нужно показать только одно свойство, передайте его название с флагом -p
. Команда sudo systemctl show apache2.service -p Description
отобразит сообщение Description=The Apache HTTP Server
.
Помимо простого отключения автозагрузки приложения systemd позволяет полностью удалить возможность включать модуль — это называется маскировкой юнита. Её можно выполнить с помощью команды:
sudo systemctl mask apache2.service
После этого при попытке запустить службу вы увидите сообщение об ошибке: Failed to start apache2.service: Unit apache2.service is masked
.
Чтобы снять маскировку и снова сделать модуль доступным для включения, воспользуйтесь командой unmask
:
sudo systemctl unmask apache2.service
Цели — специальные файлы модулей, которые описывают состояние системы. Они определяются по суффиксу .target
. В основном эти файлы используются для группировки других юнитов. Например, в системе существует цель swap.target
, которая указывает, что файл подкачки готов к использованию. Модули, которым нужен этот файл могут указывать его в своей спецификации.
Диспетчер systemd позволяет изолировать цели — то есть запустить все юниты, связанные с этой целью, и остановить все остальные. Чтобы случайно не остановить важные для системы процессы, сначала посмотрите на зависимости цели, которую изолируете, с помощью команды list-dependencies
:
sudo systemctl list-dependencies multi-user.target
Если все перечисленные модули можно завершить, цель можно изолировать:
sudo systemctl isolate multi-user.target
Существуют цели, которые используются для важных событий, например, перезагрузки системы. Для того, чтобы пользователю было проще оперировать этими событиями, созданы ярлыки systemctl:
Выгодные тарифы на VDS/VPS в Timeweb Cloud
В статье мы рассмотрели базовые принципы работы с диспетчером systemd, а именно — утилиту systemctl для управления службами, как включать и выключать службы, перезагружать конфиги, добавлять и удалять приложения из автозагрузки. Кроме этого мы разобрались со структурой конфигурационных файлов модулей и попробовали создать свой простой демон.
Знание основ работы с диспетчером systemd значительно упрощает взаимодействие с системой Linux и позволяет гибко конфигурировать службы.