Что такое systemd?

«Что такое systemd?» — вопрос из категории Linux, который задают на 33% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

systemd — это современная система инициализации и менеджер служб для Linux, ставшая стандартом в большинстве дистрибутивов (RHEL/CentOS 7+, Ubuntu 16.04+, Debian 8+). Она заменяет старые системы SysVinit и Upstart.

Основные функции и компоненты в контексте DevOps:

  • Управление службами (демонами): Основная задача — запуск, остановка, перезагрузка и наблюдение за системными службами.
  • Параллельный запуск: Запускает службы параллельно, где это возможно, что значительно ускоряет загрузку системы.
  • Управление зависимостями: Службы объявляют свои зависимости (через Requires=, Wants=, After=), и systemd строит граф запуска.
  • Журналирование: Компонент journald собирает логи ядра, системных служб и приложений в централизованный структурированный журнал.
  • Управление точками монтирования, сокетами, таймерами: Позволяет активировать службы по событию (например, по подключению к сокету или по таймеру).

Основные команды для управления службами:

# Проверить статус службы (например, Nginx или Docker)
systemctl status nginx

# Запустить, остановить, перезапустить службу
systemctl start nginx
systemctl stop nginx
systemctl restart nginx

# Включить/отключить автозапуск службы при загрузке
systemctl enable nginx
systemctl disable nginx

# Просмотр логов службы в реальном времени (очень часто используется)
journalctl -u nginx -f

# Перезагрузить конфигурацию systemd после изменения файлов служб
systemctl daemon-reload

Пример файла службы для собственного приложения (/etc/systemd/system/myapp.service):

[Unit]
Description=My Python API Service
After=network.target
Requires=docker.service # Пример зависимости от Docker

[Service]
Type=simple
# В DevOps часто запускаем контейнеры
ExecStart=/usr/bin/docker run --name myapp-api my-registry.com/myapp:latest
ExecStop=/usr/bin/docker stop myapp-api
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target