Система инициализации 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 для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.