Система инициализации 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» завершена.
Скажите пожалуйста, а чем то отличаются настройки скрипты для демона?
Я так понимаю для разных служб инициализации и скрипты работают по разному? Могли бы если есть разница показать примеры для сравнения?
Заранее благодарю.
Для каждой систем инициализации, служат свои скрипты. Для SysInit/InitD я собирался рассказать немного позже. Имеется черновик по данной теме. Опубликую при первой возможности.