Система инициализации Systemd

Система инициализации Systemd

Systemd (system daemon) —  система инициализации которая заменяет init (initialization) в некоторых ОС. Данная система разработана для улучшения работы зависимостей между службами. Позволяет делать больше одновременной работы при загрузки системы, тем самым уменьшает время загрузки.

Хочу в своей статье «Система инициализации Systemd» рассказать немного о системе инициализации SystemD и на наглядных примерах показать как с ней работать.

Так же, можете ознакомится с другой системой инициализации:

Система инициализации SysVinit

Система инициализации Systemd

Данная система состоит из юнитов (units) и ниже рассмотрим пример того как устроен юнит.

PS:  Хочу заметить что каждый юнит может взаимодействовать между собой (между другими юнитами).

Виды units:

  • service — Выполняет запуск, остановку и перезагрузку демонов, также он может запускать SysV скрипты.
  • socket — Сокет файл с конфигурациями и который соединен с конкретным сервисом (service).
  • device — Файл конфигурации  который содержит правило udev  и служит для обработки дерева устройств.
  • mount — Служит для монтирования файловой системы (ФС). Также можно показать инфу о ФС из файла /etc/fstab.
  • automount — Дает возможность смонтировать ФС в автоматическом режиме.
  • target — Так званые — цели которые ссылаются на другие юниты и служат они для запуска или активации устройств . Например, bluetooth.target — запустит службу когда активируется устройство Bluetooth.
  • snapshot — Создает снапшот (образ) — так званные ссылки на другие юниты и дает возможность восстанавливать списки ранее запущенных служб.
  • timer — Аналогицен службе сron, и служит запуском юнитов по таймеру.
  • swap — Служит для управления файлами подкачки.
  • path — Активация других служб на основе inotify.

Чтобы убедится что на вашем сервере используется systemd, выполните:

┌(linux-notes.org)─(✓)─(08:49 AM Mon Jun 06)
└─(~)─(5 files, 558Mb)─> pstree
systemd─┬─2*[agetty]
        ├─atd
        ├─avahi-daemon───avahi-daemon
        ├─crond
        ├─dbus-daemon
        ├─fail2ban-server───12*[{fail2ban-server}]
        ├─kthreadd/7070───khelper/7070
        ├─memcached───5*[{memcached}]
        ├─mysqld_safe───mysqld───42*[{mysqld}]
        ├─nginx───5*[nginx]
        ├─php-fpm───25*[php-fpm]
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        └─systemd-udevd

Команды для Systemd

Чтобы показать список всех запущенных юнитов, служит команда:

# systemctl

Или:

# systemctl list-units

Чтобы показать список юнитов которые завершились неудачей, служит команда:

# systemctl --failed

Чтобы показать список юнитов которые активны, служит команда:

# systemctl list-units -t service

Чтобы просмотреть все доступные юниты, выполните:

# systemctl list-unit-files

Запуск служб:

# systemctl start dummy.service

Остановка служб:

# systemctl stop dummy.service

Выполнить перезапуск службы:

# systemctl restart dummy.service

Перезагрузить (перечитать конфиг) служб:

# systemctl reload dummy.service

Проверить статус службы:

# systemctl status dummy.service

Перезапустить службу если она работает:

# systemctl condrestart dummy.service

Добавить службу в автозагрузку ОС:

# systemctl enable dummy.service

Убрать службу с автозагрузки ОС:

# systemctl disable dummy.service

Проверить, включена (добавлена) ли услуга в автозапуск ОС:

# systemctl is-enabled dummy.service

Создайте новый конфигурационный файл службы или изменить имеющийся:

# systemctl daemon-reload

System halt:

# systemctl halt

Выключить сервер:

# systemctl poweroff

Перезагрузить ОС:

# systemctl reboot

Выполнить суспенд (Suspend):

# systemctl suspend

Отправить сервер в гибернейт режим (Hibernate):

# systemctl hibernate

Гибридный сон (suspend-to-both)

# systemctl hybrid-sleep

Runlevels Systemd

System halt:

# runlevel0.target, poweroff.target

Однопользовательский режим (Single user mode):

# runlevel1.target, rescue.target

Много пользовательский (Multi user) режим:

# runlevel2.target, multi-user.target

Много пользовательский (Multi user) режим c доступной сетью (Multi user with Network):

# runlevel3.target, multi-user.target

Экспериментальный (Experimental):

# runlevel4.target, multi-user.target

Много пользовательский (Multi user) режим c доступной сетью и с графическим интерфейсом (Multi user, with network, graphical mode):

# runlevel5.target, graphical.target

Перезапуск:

# runlevel6.target, reboot.target

Аварийная оболочка shell (Emergency Shell):

# emergency.target

Изменение режима на многопользовательский уровень (runlevel/target):

# systemctl isolate multi-user.target

Или:

# systemctl isolate runlevel3.target

Установить многопользовательский режим при следующей загрузке ОС:

# ln -sf /lib/systemd/system/multiuser.target /etc/systemd/system/default.target

Проверите текущий уровень ( runlevel):

# systemctl get-default

Изменить на стандартный ( по умолчанию) уровень (runlevel):

# systemctl set-default multi-user.target

Использование log-ов (использование и чтение)

Чтобы указать размер файла для логов, откроем:

# vim /etc/systemd/journald.conf

Находим параметр что ниже и меняем на свой:

SystemMaxUse=100M

PS: По умолчанию, размер этого лог-файла ограничивается в 10% от размера ФС где он расположен (/var/log/journal)

ЧТобы прочитать все логов, служит команда:

# journalctl

Посмотреть логи которые велись с момента запуска ОС:

# journalctl -b

Если был крах системы, можно ввести параметр -1 и посмотреть логи с предыдущего запуска системы (-2 с двух предыдущих и.т.д):

# journalctl -b -1

Показать вывод последних записей (все что пишется в данный момент):

# journalctl -f

Так же, можно посмотреть весь вывод определенной утилиты, например systemd:

# journalctl /usr/lib/systemd/systemd

Есть возможность посмотреть лог-файл (вывод) для определенного процесса:

# journalctl _PID=666

Показать весь вывод для конкретного юнита:

# journalctl -u netcfg

Новые команды в Systemd

Выполнить системную команду на удаленном хосте:

# systemctl dummy.service start -H your_user@your_host

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

# systemd-analyze

Или

# systemd-analyze time

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

# systemd-analyze blame

Убить все процессы службы:

# systemctl kill dummy

Получить log-и за сегодня:

# journalctl --since=today

Показать hostname и другую информацию связанную с хостом:

# hostnamectl

Показать дата и время системы, временную зону и другую информацию:

# timedatectl

Управлением питанием ACPI

Имеется возможность управлять питанием. Например, можно установить некоторые действия при закрытой крышки для вашего ноутбука. Для этого, отредактируем:

# vim /etc/systemd/logind.conf

В данном файле имеется:

  • HandlePowerKey: Эти действия служат при нажатии на кнопку питания.
  • HandleSuspendKey: Эти действия служат при нажатии на кнопку спящего режима.
  • HandleHibernateKey:  Эти действия служат при нажатии на кнопку ждущего режима.
  • HandleLidSwitch:  Эти действия при закрытии крышки вашего ноутбука.

Эти переменные могут принимать следующие значения:

  • ignore (Игнорировать).
  • poweroff (Выключить питание).
  • reboot (Выполнить перезагрузку).
  • halt (Служит для завершения работы).
  • suspend (Спящий режим).
  • hibernate (Ждущий режим).
  • hybrid-sleep (Гибридный сон).
  • lock (Блокировка).
  • kexec (Оперативное переключение между ядрами).

По умолчанию systemd использует следующие значения:

  • HandlePowerKey=poweroff
  • HandleSuspendKey=suspend
  • HandleHibernateKey=hibernate
  • HandleLidSwitch=suspend

Для вступления изменений в силу, выполним команду:

# systemctl restart systemd-logind

Вот и все, тема «Система инициализации Systemd» завершена.

2 thoughts on “Система инициализации Systemd

  1. Скажите пожалуйста, а чем то отличаются настройки скрипты для демона?
    Я так понимаю для разных служб инициализации и скрипты работают по разному? Могли бы если есть разница показать примеры для сравнения?

    Заранее благодарю.

    • Для каждой систем инициализации, служат свои скрипты. Для SysInit/InitD я собирался рассказать немного позже. Имеется черновик по данной теме. Опубликую при первой возможности.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.