Управление службами в GNU/Linux #

Васильев Андрей Михайлович, 2023

Версии презентации

Загрузка системы #

flowchart TB power("Подача питания") bios["Загрузка микрокода материнской платы"] hw_init["Инициализация ключевых компонентов"] loader_search["Поиск загрузчика"] loader_init["Передача управления загрузчику"] os_init["Загрузка ядра ОС"] power --> bios bios --> hw_init --> loader_search --> loader_init --> os_init

Существует несколько стандартов для реализации систем загрузки

  • BIOS, Basic Input Output System
  • UEFI, Unified Extensible Firmware Interface
  • EFI, Extensible Firmware Interface
  • Множество закрытых решений

Загрузчик ОС #

Задачей загрузчика ОС является поиск ядра ОС с дальнейшей передачей ядру управления. Загрузчик может иметь интерактивный интерфейс для выбора вариантов ОС для загрузки

В GNU/Linux для загрузки ОС применяется связка из

  • ядра ОС, являющегося бинарным исполняемым файлом
  • initrd, Initial RAM Disk, образа временной файловой системы, необходимой ядру для дальнейшей загрузки системы

В рамках initrd поставляются:

  • Модули ядра ОС, необходимые для работы с оборудованием на данном компьютере
  • Служебные приложения, нужные для загрузки модулей и настройки системы

Загрузка ОС #

В рамках загрузки ядра ОС происходит поиск всего оборудования и его инициализация

После того как всё оборудование готово к работе, ядро запускает процесс-инициализации init

Существует множество систем инициализации:

  • SysVinit
  • systemd
  • openrc
  • runit
  • initware

Сравнение разных систем предоставляет проект Gentoo

Задачи системы инициализации #

  • Запуск служб
    • При запуске системы
    • По запросу функций службы
  • Перезапуск служб в случае их падения

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

  • Подключение файловых систем (обычно да)
  • Настройка сетевых интерфейсов (обычно нет)
  • Запуск задач по расписанию (обычно нет)
  • Журналирование работы служб (обычно нет)
  • Управление входом пользователей в систему (обычно нет)
  • Создание виртуальных файлов для устройств (обычно нет)
  • Управление временем системы (обычно нет)

Стадии загрузки ОС #

При запуске системы обычно рассматриваются следующие стадии

  • Настройка ключевых служб, поддержка работы сессии суперпользователя
  • Поддержка работы множества пользователе
  • Поддержка работы с графическим пользовательским интерфейсом

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

  • Завершение работы
  • Перезагрузка системы

Варианты реализации стадий #

SysV Runlevel systemd Target Notes
0 poweroff.target, runlevel0.target Halt the system.
1, s, single rescue.target, runlevel1.target Single user mode.
2, 4 multi-user.target, runlevel2.target, runlevel4.target User-defined/Site-specific runlevels. By default, identical to 3.
3 multi-user.target, runlevel3.target Multi-user, non-graphical. Users can usually login via multiple consoles or via the network.
5 graphical.target, runlevel5.target Multi-user, graphical. Usually has all the services of runlevel 3 plus a graphical login.
6 reboot.target, runlevel6.target Reboot
emergency emergency.target Emergency shell

Службы #

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

  • Приложение реагирует на некоторые сигналы и выполняет некоторые действия
    • Сигнал от ядра ОС о добавлении нового устройства
    • Сигнал по шине взаимодействия, запрос на выполнение операции
    • Сигнал по сетевому интерфейсу, выполнение действия
  • Приложению для работы необходимо, чтобы все его зависимости были доступны на момент запуска
    • Файловая система с файлами службы уже доступна на момент запуска службы
    • Сетевой интерфейс уже настроен и готов обрабатывать запросы
    • Служба базы данных запущена и готова обрабатывать запросы

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

Настройка systemd #

Для описания всех компонентов systemd используются файлы модулей (unit), в которых описывается поведение конкретного компонента. В настоящий момент systemd поддерживает следующие виды модулей:

Тип модуля Описание
Target A group of units that defines a synchronization point. The synchronization point is used at boot time to start the system in a particular state.
Service A unit of this type starts, stops, restarts or reloads a service daemon such as Apache webserver.
Timer A unit of this type activates/deactivates specified service based on a timer or when the set time is elapsed.
Socket A unit of this type activates a service when the service receives incoming traffic on a listening socket.
Device A unit of this type implements device-based activation such as a device driver.
Тип модуля Описание
Mount A unit of this type controls the file-system mount point.
Automount A unit of this type provides and controls on-demand mounting of file systems.
Swap A unit of this type encapsulates/activates/deactivates swap partition.
Path A unit of this type monitors files/directories and activates/deactivates a service if the specified file or directory is accessed.
Snapshot A unit that creates and saves the current state of all running units. This state can be used to restore the system later.
Slice A group of units that manages system resources such as CPU, and memory.
Scope A unit that organizes and manages foreign processes.
busname A unit that controls DBus system.

Каталоги конфигурации systemd #

Список можно посмотреть в man-руководстве systemd.unit

  • Пути для поиска модулей системного уровня
    • /etc/systemd/system.control/*
    • /run/systemd/system.control/*
    • /etc/systemd/system/* — Файлы, созданные администратором
    • /run/systemd/system/*
    • /lib/systemd/system/* — Файлы, установленные вместе с пакетом приложения
  • Пути для поиска модулей пользовательского уровня
    • ~/.config/systemd/user.control/*
    • ~/.config/systemd/user/*
    • $XDG_CONFIG_DIRS/systemd/user/*
    • /etc/systemd/user/*
    • $XDG_RUNTIME_DIR/systemd/user/*
    • /run/systemd/user/*

Управление службами systemd #

Анализ поведения системы

Дейтвие Команда
Отобразить состояние systemd systemctl status
Отобразить список запущенных модулей systemctl или systemctl list-units
Отобразить список упавших модулей systemctl --failed
Отобразить список конфигурационных файлов модулей systemctl list-unit-files
Отобразить статус модуля по PID процесса systemctl status PID

Анализ поведения службы

Дейтвие Команда Комментарий
Отобразить страницу руководства, ассоциированную с данной службой systemctl help UNIT если указана в конфигурации модуля
Отобразить статус модуля systemctl status UNIT показывает запущен или остановлен модуль
Проверить включён ли модуль systemctl is-enabled UNIT

Управление состоянием службы. Все в данном разделе требуют прав суперпользователя

Дейтвие Команда
Запустить модуль systemctl start UNIT
Остановить работу модуля systemctl stop UNIT
Перезапустить модуль systemctl restart UNIT
Дать команду службе перечитать конфигурацию systemctl reload UNIT
Перечитать конфигурацию systemd systemctl daemon-reload
Настроить автоматический запуск модуля при старте системы systemctl enable UNIT
Настроить автоматический запуск модуля при старте системы и сразу запустить его systemctl enable --now UNIT
Отключить автоматический запуск модуля при старте системы systemctl disable UNIT
Отключить и настроить автоматический запуск модуля systemctl reenable UNIT

Управление состоянием системы #

Данные действия надо выполнять от имени суперпользователя

Дейтвие Команда
Выключить ОС и перезагрузить компьютер systemctl reboot
Выключить ОС и обесточить компьютер systemctl poweroff
Приостановить работу ОС с сохранением данных в оперативной памяти systemctl suspend
Приостановить работу ОС с сохранением данных в разделе подкачки systemctl hibernate
Приостановить работу ОС с гибридным сохранением состояния systemctl hybrid-sleep

Указание зависимостей #

  • В классическом SysVInit необходимо было следить за включением службы в нужный уровень выполнения
  • В рамках systemd каждая служба указывает список зависимостей
    • Явные зависимости от других служб
    • Неявные зависимости через включение в конкретную цель