systemd и systemctl
🧠 systemd — это современная система инициализации и управления службами (init system) в Linux, пришедшая на смену классическому SysVinit.
Её основная задача — инициализация пользовательского пространства после загрузки ядра и управление состояниями сервисов, сокетов, таймеров и других компонентов системы.
🧩 Роль systemd в процессе загрузки Linux
После загрузки ядра Linux (vmlinuz) и монтирования корневой файловой системы ядро передаёт управление первому процессу в пространстве пользователя — systemd (PID 1).
Этот процесс является центральным координатором запуска системы и выполняет следующие этапы:
-
Загрузка конфигурации:
- systemd считывает unit-файлы из каталогов
/etc/systemd/system/,/run/systemd/system/и/lib/systemd/system/. - Объединяет их в общую иерархию зависимостей.
- systemd считывает unit-файлы из каталогов
-
Определение цели загрузки:
- Считывает символьную ссылку
/etc/systemd/system/default.target, которая определяет конечное состояние системы. - Обычно это
multi-user.target(консольный режим) илиgraphical.target(графическая среда).
- Считывает символьную ссылку
-
Запуск базовых системных служб:
- systemd активирует службы низкого уровня, необходимые для работы системы:
systemd-udevd.service— управление устройствами;systemd-journald.service— сбор логов;systemd-logind.service— управление сессиями;systemd-networkd.serviceиsystemd-resolved.service— сетевые компоненты.
- systemd активирует службы низкого уровня, необходимые для работы системы:
-
Параллельная инициализация:
- systemd анализирует зависимости (
After=,Requires=,Wants=) между unit'ами и запускает службы в параллельном режиме, минимизируя задержки. - Например, сетевые сервисы могут запускаться одновременно с монтированием файловых систем.
- systemd анализирует зависимости (
-
Монтирование и точка восстановления:
- Активируются
.mountи.swapunit’ы для монтирования файловых систем и подкачки. - Если загрузка не может быть завершена, systemd переходит в
rescue.target— однопользовательский режим восстановления.
- Активируются
-
Переход в целевое состояние:
- После завершения инициализации systemd активирует целевую группу сервисов (например,
graphical.target), предоставляя пользователю готовое окружение.
- После завершения инициализации systemd активирует целевую группу сервисов (например,
⚙️ systemd как единая точка управления
В отличие от старых систем инициализации (SysVinit, Upstart), systemd поддерживает обратную связь с ядром и процессами:
- Контролирует ресурсы через cgroups (Control Groups).
- Реагирует на сбои и перезапускает службы автоматически.
- Поддерживает socket-based activation — запуск демонов по требованию.
🧾 Типы unit-файлов
Каждый объект, управляемый systemd, описывается в виде unit (единицы). Основные типы:
| Тип | Расширение | Назначение |
|---|---|---|
| Service | .service | Управление демонами и службами. |
| Socket | .socket | Сокет-активация служб. |
| Timer | .timer | Планировщик заданий (аналог cron). |
| Mount | .mount | Управление точками монтирования. |
| Target | .target | Группировка unit'ов по функционалу. |
| Device | .device | Работа с устройствами через udev. |
🔍 Основные команды systemctl
Управление службами:
sudo systemctl start nginx.service # Запуск службы
sudo systemctl stop nginx.service # Остановка
sudo systemctl restart nginx.service # Перезапуск
sudo systemctl reload nginx.service # Перезагрузка конфигурации
Проверка статуса:
systemctl status nginx.service
Управление автозапуском:
sudo systemctl enable nginx.service # Добавить в автозагрузку
sudo systemctl disable nginx.service # Удалить из автозагрузки
sudo systemctl is-enabled nginx.service # Проверить статус
🧠 Цели (Targets)
Цели (.target) — это логические группы unit'ов, определяющие состояние системы.
Примеры:
multi-user.target— многопользовательский режим без графики.graphical.target— графическая оболочка.rescue.target— режим восстановления.default.target— цель, запускаемая по умолчанию при старте.
Просмотр активных целей:
systemctl list-units --type=target
📚 Работа с журналами
systemd включает собственный журнал — journald, который сохраняет структурированные логи.
journalctl -u nginx.service # Логи конкретной службы
journalctl -b # Логи текущей загрузки
journalctl --since "1 hour ago" # За последний час
🧱 Пример собственного unit-файла
Создание службы /etc/systemd/system/hello.service:
[Unit]
Description=Пример пользовательской службы
[Service]
ExecStart=/usr/local/bin/hello.sh
Restart=always
[Install]
WantedBy=multi-user.target
Активируем и запускаем:
sudo systemctl daemon-reload
sudo systemctl enable --now hello.service
🔬 Анализ и диагностика
-
Проверить все неуспешные unit'ы:
systemctl --failed -
Отобразить дерево зависимостей:
systemctl list-dependencies nginx.service -
Проверка загрузочного процесса:
systemd-analyze blame systemd-analyze critical-chain