systemd Часть 1: Понимание systemd, типы юнитов и целевые юниты
Systemd - это новый сервис в Red Hat Enterprise Linux 7, который отвечает за запуск всех видов вещей. Systemd выходит далеко за рамки запуска сервисов; другие элементы также запускаются из systemd.
В этой статье раскроем сам systemd и юнит-файлы.
Помимо сервисов, существуют другие типы юнитов, такие как сокеты, монтирование и другие.
Чтобы отобразить список всех доступных юнитов, введите systemctl -t help
Основное преимущество работы с systemd по сравнению с предыдущими методами, используемыми для управления сервисами, заключается в том, что он обеспечивает единый интерфейс для запуска юнитов. Этот интерфейс определен в файле юнита.
Юнит-файлы пользовательских юнитов по аналогии хранятся в директориях /etc/systemd/<имя пользователя>, /run/sustemd/<имя пользователя> и /usr/lib/systemd/<имя пользователя>.
Юнит-файл на примере vsftpd:
Из этого примера юнит-файла видно, что его относительно легко понять. Любой файл сервисного юнита systemd состоит из трех секций. (В других файл-юнитах могут быть другие секции, но эти три присутствуют во всех юнит-файлах.)
Посмотрим теперь другой файл-юнит типа mount:
Файл tmp.unit показывает некоторую интересную дополнительную информацию. В секции [Unit] мы видим оператор Conflicts. Этот оператор говорит о том, что что этот юнит не может использоваться совместно с юнитом umount.target.
Далее идёт секция [Mount], которая определяет, что и где надо монтировать. В этой секции четко видно, что будет выполнена команда mount, которую вы обычно вводите в терминале.
Наконец, есть оператор WantedBy, который определяет, где должен быть запущен юнит.
Пример файла сокета показывает, как это происходит для virtlockd, системного сокета, который отслеживает активность для виртуальных машин.
При работе с файл-юнитами systemd вы рискуете оказаться перегруженными опциями.
Каждый файл-юнит может быть настроен с различными параметрами. Чтобы выяснить, какие параметры доступны для конкретного юнита, используйте команду systemctl show. Например, команда systemctl show sshd показывает все параметры systemd, которые можно настроить в юните sshd.service, включая их текущие значения по умолчанию.
Уровень запуска - это набор сервисов, необходимых для запуска сервера в многопользовательском или графическом режиме. Хорошей отправной точкой для понимания юнитов целей является их видение как группы юнитов.
Вы можете видеть, что сам по себе целевой юнит не содержит много определений. Он просто определяет, что ему требуется, и с какими сервисами целями он не может сосуществовать. Он также определяет порядок загрузки с помощью оператора After в разделе Unit. И вы можете видеть, что в разделе «Install» он определен как default.target, поэтому ваш сервер запускается по умолчанию. Целевой файл-юнит не содержит никакой информации о юнитах, которые должны быть включены; это находится в отдельных файлах юнита и секции Wants.
Даже если цель systemd немного похожа на старые уровни запуска, это нечто большее. Цель - это группа юнитов, и существует несколько различных целей. Некоторые цели, такие как multi-user.target и graphical.target, определяют конкретное состояние, в которое должна войти система. Другие цели просто объединяют группу юнитов, например, nfs.target и printer.target. Эти цели включены из других целей, таких как многопользовательские или графические цели.
Во второй части статьи о systemd разберемся, как управлять юнитами, зависимостями и целями.
В этой статье раскроем сам systemd и юнит-файлы.
Понимание systemd
Чтобы описать systemd в общих чертах, то это система управления юнитами. Юнитами могут быть много вещей. Одним из наиболее важных типов юнитов является сервис. Как правило, сервисы - это процессы, которые предоставляют определенные функциональные возможности и позволяют подключаться внешним клиентам.Помимо сервисов, существуют другие типы юнитов, такие как сокеты, монтирование и другие.
Чтобы отобразить список всех доступных юнитов, введите systemctl -t help
[root@server2 ~]# systemctl -t help
Available unit types:
service
socket
busname
target
snapshot
device
mount
automount
swap
timer
path
slice
scope
Основное преимущество работы с systemd по сравнению с предыдущими методами, используемыми для управления сервисами, заключается в том, что он обеспечивает единый интерфейс для запуска юнитов. Этот интерфейс определен в файле юнита.
/usr/lib/systemd/system
Системные юнит-файлы. Это юниты из установленных пакетов RPM — всякие nginx, apache, mysql и прочее. /etc/systemd/system
Юниты, созданные нами, то есть админами. Переопределяют значения юнит-файлов по умолчанию. Юнит-файлы по умолчанию описаны выше./run/systemd/system
runtime-юниты, которые генерируются автоматически.Юнит-файлы пользовательских юнитов по аналогии хранятся в директориях /etc/systemd/<имя пользователя>, /run/sustemd/<имя пользователя> и /usr/lib/systemd/<имя пользователя>.
Юнит-файл на примере vsftpd:
[Unit]
Description=Vsftpd ftp daemon
After=network.target
[Service]
Type=forking
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
[Install]
WantedBy=multi-user.target
Из этого примера юнит-файла видно, что его относительно легко понять. Любой файл сервисного юнита systemd состоит из трех секций. (В других файл-юнитах могут быть другие секции, но эти три присутствуют во всех юнит-файлах.)
[Unit] Описывает юнит и определяет зависимости. Эта секция также содержит важный оператор After и, опционально, оператор Before. Эти операторы определяют зависимости между различными юнитами. В данном случае After=network.target говорит о том, что этот файл-юнит надо запустить только после того, как запустится файл-юнит network.target. [Service] Эта секция описывает как запустить и остановить сервис и запросить статус установки.
|
Посмотрим теперь другой файл-юнит типа mount:
[Unit]
Description=Temporary Directory
Documentation=man:hier(7)
Documentation=http://www.freedesktop.org/wiki/Software/systemd/
APIFileSystems
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime
# Make 'systemctl enable tmp.mount' work:
[Install]
WantedBy=local-fs.target
Файл tmp.unit показывает некоторую интересную дополнительную информацию. В секции [Unit] мы видим оператор Conflicts. Этот оператор говорит о том, что что этот юнит не может использоваться совместно с юнитом umount.target.
Далее идёт секция [Mount], которая определяет, что и где надо монтировать. В этой секции четко видно, что будет выполнена команда mount, которую вы обычно вводите в терминале.
Наконец, есть оператор WantedBy, который определяет, где должен быть запущен юнит.
Юнит socket
Сокет создает метод для приложений, чтобы общаться друг с другом. Некоторые сервисы создают свои собственные сокеты при запуске, в то время как другим сервисам нужен файл-юнит сокетов для создания сокетов для них. И наоборот: каждому сокету нужен соответствующий служебный файл.Пример файла сокета показывает, как это происходит для virtlockd, системного сокета, который отслеживает активность для виртуальных машин.
[root@server202 system]# cat virtlockd.socket
[Unit]
Description=Virtual machine lock manager socket
[Socket]
ListenStream=/var/run/libvirt/virtlockd-sock
[Install]
WantedBy=multi-user.target
При работе с файл-юнитами systemd вы рискуете оказаться перегруженными опциями.
Каждый файл-юнит может быть настроен с различными параметрами. Чтобы выяснить, какие параметры доступны для конкретного юнита, используйте команду systemctl show. Например, команда systemctl show sshd показывает все параметры systemd, которые можно настроить в юните sshd.service, включая их текущие значения по умолчанию.
Id=sshd.service
Names=sshd.service
Requires=basic.target
Wants=sshd-keygen.service system.slice
WantedBy=multi-user.target
ConsistsOf=sshd-keygen.service
Conflicts=shutdown.target
ConflictedBy=sshd.socket
Before=shutdown.target multi-user.target
After=network.target sshd-keygen.service systemd-journald.socket
basic.target system.slice
Description=OpenSSH server daemon
LoadState=loaded
ActiveState=active
SubState=running
FragmentPath=/usr/lib/systemd/system/sshd.service
UnitFileState=enabled
InactiveExitTimestamp=Sat 2015-05-02 11:06:02 EDT
InactiveExitTimestampMonotonic=2596332166
ActiveEnterTimestamp=Sat 2015-05-02 11:06:02 EDT
ActiveEnterTimestampMonotonic=2596332166
ActiveExitTimestamp=Sat 2015-05-02 11:05:22 EDT
ActiveExitTimestampMonotonic=2559916100
InactiveEnterTimestamp=Sat 2015-05-02 11:06:02 EDT
InactiveEnterTimestampMonotonic=2596331238
CanStart=yes
CanStop=yes
CanReload=yes
CanIsolate=no
StopWhenUnneeded=no
RefuseManualStart=no
RefuseManualStop=no
AllowIsolate=no
DefaultDependencies=yes
OnFailureIsolate=no
IgnoreOnIsolate=no
Понимание целевых юнитов
Юнит-файлы используются для создания функциональности, необходимой на вашем сервере. Чтобы можно было загружать их в правильном порядке и в нужный момент, используется определенный тип юнитов: целевой юнит. Простое определение целевого юнита- это «группа юнитов». Некоторые цели используются как эквиваленты старых уровней выполнения, которые в более ранних версиях RHEL использовались для определения состояния, в котором должен запускаться сервер.Уровень запуска - это набор сервисов, необходимых для запуска сервера в многопользовательском или графическом режиме. Хорошей отправной точкой для понимания юнитов целей является их видение как группы юнитов.
[root@server2 system]# cat multi-user.target
# 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=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
Вы можете видеть, что сам по себе целевой юнит не содержит много определений. Он просто определяет, что ему требуется, и с какими сервисами целями он не может сосуществовать. Он также определяет порядок загрузки с помощью оператора After в разделе Unit. И вы можете видеть, что в разделе «Install» он определен как default.target, поэтому ваш сервер запускается по умолчанию. Целевой файл-юнит не содержит никакой информации о юнитах, которые должны быть включены; это находится в отдельных файлах юнита и секции Wants.
Даже если цель systemd немного похожа на старые уровни запуска, это нечто большее. Цель - это группа юнитов, и существует несколько различных целей. Некоторые цели, такие как multi-user.target и graphical.target, определяют конкретное состояние, в которое должна войти система. Другие цели просто объединяют группу юнитов, например, nfs.target и printer.target. Эти цели включены из других целей, таких как многопользовательские или графические цели.
Понимание Wants
Чтобы понять концепцию желания (Want), давайте начнем смотреть на глагол потребности, как в «Я хочу печенье». Want в systemd определяет, какие единицы systemd он хочет при запуске определенной цели. Want создаются, когда юниты включены в systemd, и это происходит путем создания символической ссылки в каталоге /etc/systemd/system. В этом каталоге вы найдете подкаталог для каждой цели, содержащий в качестве символических ссылок ссылки на конкретные сервисы, которые должны быть запущены.Во второй части статьи о systemd разберемся, как управлять юнитами, зависимостями и целями.