systemd и systemctl

Oct, 24, 2025

systemd и systemctl

🧠 systemd — это современная система инициализации и управления службами (init system) в Linux, пришедшая на смену классическому SysVinit.
Её основная задача — инициализация пользовательского пространства после загрузки ядра и управление состояниями сервисов, сокетов, таймеров и других компонентов системы.


🧩 Роль systemd в процессе загрузки Linux

После загрузки ядра Linux (vmlinuz) и монтирования корневой файловой системы ядро передаёт управление первому процессу в пространстве пользователяsystemd (PID 1).
Этот процесс является центральным координатором запуска системы и выполняет следующие этапы:

  1. Загрузка конфигурации:

    • systemd считывает unit-файлы из каталогов /etc/systemd/system/, /run/systemd/system/ и /lib/systemd/system/.
    • Объединяет их в общую иерархию зависимостей.
  2. Определение цели загрузки:

    • Считывает символьную ссылку /etc/systemd/system/default.target, которая определяет конечное состояние системы.
    • Обычно это multi-user.target (консольный режим) или graphical.target (графическая среда).
  3. Запуск базовых системных служб:

    • systemd активирует службы низкого уровня, необходимые для работы системы:
      • systemd-udevd.service — управление устройствами;
      • systemd-journald.service — сбор логов;
      • systemd-logind.service — управление сессиями;
      • systemd-networkd.service и systemd-resolved.service — сетевые компоненты.
  4. Параллельная инициализация:

    • systemd анализирует зависимости (After=, Requires=, Wants=) между unit'ами и запускает службы в параллельном режиме, минимизируя задержки.
    • Например, сетевые сервисы могут запускаться одновременно с монтированием файловых систем.
  5. Монтирование и точка восстановления:

    • Активируются .mount и .swap unit’ы для монтирования файловых систем и подкачки.
    • Если загрузка не может быть завершена, systemd переходит в rescue.target — однопользовательский режим восстановления.
  6. Переход в целевое состояние:

    • После завершения инициализации systemd активирует целевую группу сервисов (например, graphical.target), предоставляя пользователю готовое окружение.

⚙️ 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

📖 man systemd (man7.org)
📖 man systemctl (man7.org)

systemd и systemctl | Aleksandr Suprun