Управление службами в GNU/Linux #
Васильев Андрей Михайлович, 2023
Версии презентации
Загрузка системы #
Существует несколько стандартов для реализации систем загрузки
- 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 каждая служба указывает список зависимостей
- Явные зависимости от других служб
- Неявные зависимости через включение в конкретную цель