Введение в Systemd

Systemd это относительно новый (на Enterprise Linux) системный и сервисный менеджер, однако Redhat разрабатывает его на платформе Fedora начиная с 2010 года. Он был создан разработчиками Redhat — Lennart Poettering и Kay Sievers для обеспечения контроля какие программы запускаются при загрузке системы Linux.

Что такое systemd?

Как и sysVinit, systemd это системный и сервисный менеджер который контролирует, как запускаются и останавливаются разные службы во время загрузки и выключения системы, соответственно. Так же он контролирует как сервисы (обычно службы на основе демона) добавляются в систему и затем управляются. Systemd также заменяет концепцию уровней запуска (runlevels), которая была частью sysVinit, с целями, которые вы увидите в этой статье чуть позже.

Как работает systemd?

Во-первых systemd заменяет процесс init как процесс с PID 1. это можно проверить воспользовавшись командой top:

Systemd делает загрузку сервера быстрее, потому что использует меньше скриптов и пытается запускать больше задач параллельно, Systemd называет их юниты (units). В systemd сервисы задаются в так называемых юнит файлах (unit files) которые являются текстовыми файлами содержащими всю необходимую для запуска сервиса информацию, включая зависимости. Целевые юниты (target units) представляют собой уровни запуска (run levels) и сервис юниты (service units) представляют собой сервисы. Юнит файлы с расширением .target представляют собой целевые объекты загрузки, а юнит файлы с расширением .service представляют собой юниты для сервисов. Все процессы, запущенные сервисным модулем, отмечены одной и той же группой. Таким образом, когда служба отключается, упрощается обеспечение того, чтобы все связанные процессы также были отключены. Сервисные модули могут быть активированы при других событиях, таких как обнаружение оборудования, а не только при переходе на другой уровень запуска. Управление ресурсами контролируется и ограничено через группу, созданную для каждой службы. Поэтому контрольные группы предоставляют способ, с помощью которого связанные задачи или процессы могут быть агрегированы или разделены для управления. Сервис юниты запускаются параллельно. У нас могут быть зависимости между различными службами.

Как мы упоминали ранее, при запуске системы параллельных сервисов systemds система загружается очень быстро.
Фактически мы можем проверить время, необходимое для загрузки системы, используя следующую команду:

Так же мы можем узнать время необходимое для запуска каждого сервиса используя команду systemd-analyze blame:

Целевые юниты Systemd

Цели в systemd коррелируют с тем, что мы называем уровнями запуска в sysVinit. Можно использовать выражения уровень запуска и цели, так как пор сути они означают одно и то же. Например, poweroff.target это эквивалент run level 0. На рисунке ниже приведено соответствие названия целей systemd уровням запуска в sysVinit.

При загрузке через grub мы можем по-прежнему использовать числа для загрузки на определенный уровень запуска, а также для systemd target.

Вместо того, чтобы использовать файл /etc/inittab для установки уровня запуска по умолчанию, мы можем установить его из командной строки.
Чтобы указать текущий уровень запуска по умолчанию, установленный в системе, используйте следующую команду:

Цель multi-user.target соответствует run level 3 применяемом в системах с sysVinit. Это можно проверить запустив команду runlevel и узнав текущий уровень запуска:

Как видим, результат — run level 3.

Для изменения уровня запуска по умолчанию в системе мы можем использовать команду systemctl с подкомандой set-default и указав затем нужную цель.

Для изменения текущего уровня запуска используем команду systemctl isolate и указав требуемое имя цели.
Например, чтобы изящно перезапустить систему, мы используем следующую команду:

Команда приведенная выше будет иметь такой же эффект как и “init 6” на операционных системах управляемых sysVinit.

Сервисные юниты Systemd

Сервисные юниты предоставляют сервисные скрипты в systemd. Команда systemctl объединяет функции, предоставляемые службами и командами chkconfig, в одну утилиту. Мы используем systemctl для включения / отключения сервисов при загрузке системы, а также для запуска, остановки, перезагрузки или перезапуске служб вручную.

Чтобы включить сервис:

На примере сервиса crond:

Для отключения сервиса:

На примере сервиса crond:

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

Остановка сервиса:

Старт сервиса:

Так же можно использовать команду systemctl status для просмотра текущего статуса сервиса. На примере сервиса crond:

Наряду с командой systemctl status мы можем использовать команду systemctl show для просмотра некоторых атрибутов службы. Мы продемонстрируем, используя его в службе sshd.

Обратите внимание, что не нужно писать crond.service, чтобы команды systemctl работали. Это связано с тем, что когда мы используем команды systemctl с под-командами enable / disable / stop / start / status, это подразумевает, что мы выполняем команду в сервисном юните. Сценарии, соответствующие сервисным юнитам, находятся в каталоге /lib/systemd/system. Эти скрипты добавляются менеджером пакетов при установке приложений, которые предоставляют конкретную услугу. Мы можем вносить изменения в рабочую систему путем изменения содержимого каталога /etc/systemd/system. Когда мы изменили цель по умолчанию в нашей системе, в этом месте была создана софт ссылка.

Экосистема systemd из команд *ctl

Наряду с основным инструментом systemctl для управления целевыми и сервисными юнитами systemd предоставляет кучу других полезных утилит, о которых мы сейчас поговорим.
Команда timedatecl
Эта команда предоставляет удобный интерфейс для изменения информации о дате и часовом поясе для системы.

Команда hostnamectl
Эта команда позволяет нам постоянно изменять имя хоста системы без необходимости редактировать какие-либо файлы.

Команда localectl
Позволяет менять системный настройки локали.

Команда loginctl
loginctl можно использовать для интроспекции и управления состоянием systemd login manager systemd-logind.service.

Команда journalctl
Используется для запроса содержимого журнала systemd (1), как указано в systemd-journald.service. Journalctl — это мощный инструмент для работы со всеми файлами журнала. Поскольку journald записывает журналы как двоичный файл, вам необходимо, чтобы journalctl взаимодействовал с этими журналами. Вот небольшой фрагмент команды journalctl, выполненный без каких-либо аргументов.

На этом всё. Надеюсь ретроградам вроде меня — так стало более понятно ;)

Автор: Mirivlad

Скромный труженик консоли и окошек.

Комментарии: