Васильев Андрей Михайлович, 2024
Версии презентации
Существует несколько стандартов для реализации систем загрузки
Решают общие задачи:
Задачей загрузчика ОС является поиск ядра ОС с дальнейшей передачей ему управления
Современные загрузчики:
Ядро ОС обеспечивает эффективное использование технического обеспечения множеством конкурирующих друг с другом процессов
Операционная система помимо ядра предоставляет набор системных приложений
В GNU/Linux для загрузки ОС применяется связка из
Оба компонента поставляются файлами, лежащими на ФС
В рамках initrd поставляются:
Модули могут поставляться отдельно от ядра:
В рамках загрузки ядра ОС происходит поиск всего оборудования и его инициализация
После того как всё оборудование инициализировано, ядро запускает процесс-инициализации init
Существует множество систем инициализации: SysVinit, systemd, openrc, runit, initware
Система инициализации может также выполнять действия других системных служб
При запуске системы обычно рассматриваются следующие стадии:
Также система инициализации должна выполнять корректное выключение системы, т.е. выключать службы в правильном порядке и сохранить данные на ПЗУ в случаях:
Система инициализации позволяет переходить между стадиями, выбирать разные стадии при запуске
| SysV Runlevel | systemd Target (Цель) | Записки | 
|---|---|---|
| 0 | poweroff.target, runlevel0.target | Выключить систему. | 
| 1, s, single | rescue.target, runlevel1.target | Режим одного пользователя. | 
| 2, 4 | multi-user.target, runlevel2.target, runlevel4.target | Определённые пользователем (системой). По умолчанию 3 | 
| 3 | multi-user.target, runlevel3.target | Многопользовательская инициализация, не графическая. Пользователи могут входить по сети или через терминалы. | 
| 5 | graphical.target, runlevel5.target | Многопользовательская с поддержкой графического интерфейса. | 
| 6 | reboot.target, runlevel6.target | Перезагрузка. | 
| emergency | emergency.target | Экстренный доступ для суперпользователя. | 
Служба обычно представляет собой некоторое приложение, которое постоянно запущено и которое предоставляет полезные услуги пользователю или другим приложениям
Службы также могут представлять собой действия, выполняющиеся с некоторой регулярностью, например по расписанию
Точное указание зависимостей позволяет ускорить загрузку системы, избежать проблем при запуске служб
Вопрос запуска службы помимо момента запуска достаточно сложный:
Помимо запуска есть много вопросов поддержки работы:
Задача настройки параметров запуска службы достаточно сложная, разработчиками SysVInit решена не была, поэтому процесс запуска служб делегировали Shell-скриптам
Каждый из последних потребуют написания своей конфигурации
Для описания всех компонентов systemd используются файлы модулей (unit), в которых описывается поведение конкретного компонента. В настоящий момент systemd поддерживает следующие виды модулей:
| Тип модуля | Описание | 
|---|---|
| Target | Синхронизационная точка для ряда модулей. Используется во время загрузки системы в определённом состоянии. | 
| Service | Модуль, который запускает, останавливает, перезапускает, даёт команду на обновление конфигурации различных служб, например Веб-сервер. | 
| Timer | Модуль данного типа активирует или деактивирует указанную службу по времени наступления таймера или истечения времени. | 
| 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. | 
Список можно посмотреть в 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 являются текстовыми файлами в формате INI
systemd.unit, systemd.service, systemd.timer и т.д[Unit]
Description=Start n service
After=default.target
[Service]
Type=simple
ExecStart=/usr/bin/n
[Install]
WantedBy=default.targetUnit описывает общую информацию о службе, часть unit-файлов
Description — краткое описание назначения службеAfter — указание зависимости одной службы от другойInstall описывает параметры автоматического запуска службы при старте системы, часть unit-файлов
Type — поведение приложения после запускаWantedBy — указание зависимости от цели запускаService описывает детали запуска службы
ExecStart — команда для запуска приложения, должна включать полный путь к исполняемому файлу, может включать аргументыТребований к параметрам работы служб много — скорее всего на настоящий момент в systemd есть поддержка для решения данной задачи
Если не указать пользователя, то приложение будет работать с правами суперпользователя, что является проблемой для большинства служб
В секции Service необходимо указать пользователя с помощью параметра User
Служба не всегда ведёт себя как следует и может упасть. Политика перезапуска определяется в секции Service с помощью параметра Restart
on-failure — перезапускать в случае паденияalways — перезапускать даже когда хорошо завершилось/etc/systemd/system
.serviceexample.service[Unit], указав описание и зависимости[Service], указав параметры запуска приложения[Install], указав параметры автоматического запускаsystemctl daemon-reloadsystemctl start example или целиком systemctl start example.servicesystemctl status exampleДля остановки службы используйте команду systemctl stop example
Команды start и stop приложения systemctl пытаются запустить или остановить процесс, который находится под управлением systemd
Для настройки автоматического запуска необходимо:
[Install] внутри конфигурационного файлаsystemctl enable example.serviceПоследняя команда настраивает запуск службы при старте ОС, не запускает её сейчас
start--now: systemctl enable --now example.start. В этом случае будет настроен автоматический запуск при старте и будет выполнена попытка запуска службы сейчасДля выключения автоматического systemctl disable example или systemctl disable --now example
Анализ поведения системы
| Дейтвие | Команда | 
|---|---|
| Отобразить состояние 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 | 
Ряд служб могут быть приложениями, которые выполняют поставленную задачу:
Они не работают постоянно, а выполнив свою задачу, отключаются
Для управления такого рода службами можно добавить таймеры, которые будут выполнять запуск службы согласно некоторому расписанию
systemd поддерживает следующие таймеры:
.service-файлами службы.timersystemd.timerПредположим, что мы описали службу с помощью файла system-n.service
Создадим таймер, который будет запускать эту службу каждую ночь
[Unit]
Description=Запускаем службу каждую ночь
[Timer]
OnCalendar=01:00
[Install]
WantedBy=timers.targetДля проверки параметров запуска по календарю удобно воспользоваться приложением systemd-analyze calendar 01:00
После добавления конфигурационного файла таймера его также, как и службу необходимо:
systemctl startsystemctl enableТаймеры сами по себе не предоставляют какую-либо дополнительную функциональность в отличие от служб, поэтому их надо связывать с целью timers.target.