← Back to notes

systemd и
systemctl

2025-10-24


systemd

Система инициализации (PID 1) и менеджер сервисов на большинстве дистрибутивов Linux. Управляет unit'ами: services, sockets, timers, mounts, slices, scopes, targets, devices, paths, swap.

См. systemd(1), systemd.unit(5), systemctl(1).


Роль при загрузке

После раннего userspace (initramfs) управление обычно передаётся /sbin/init; на systemd-системах это symlink или wrapper на systemd. PID 1:

  1. Чтение unit-файлов в порядке приоритета:

    • /etc/systemd/system/ (локальная конфигурация, наивысший приоритет)
    • /run/systemd/system/ (runtime)
    • /usr/lib/systemd/system/ (vendor; на части дистрибутивов также /lib/systemd/system/) Полный список — в systemd.unit(5).
  2. Определение default target через symlink /etc/systemd/system/default.target → обычно multi-user.target или graphical.target.

  3. Параллельная активация unit'ов с учётом зависимостей (Requires=, Wants=, Requisite=, BindsTo=, After=, Before=).

  4. Базовые сервисы: systemd-udevd.service, systemd-journald.service, systemd-logind.service; сетевые компоненты — по конфигурации (systemd-networkd, NetworkManager, systemd-resolved).

  5. Монтирование через .mount и .swap unit'ы (генерируются из /etc/fstab юнит-генератором systemd-fstab-generator).

  6. Переход к default.target.

При сбое — emergency.target (только корень в RO + sulogin) или rescue.target (корень смонтирован, базовые сервисы запущены, sulogin).


Управление ресурсами

systemd размещает services/scopes/slices в cgroup-иерархии и через неё управляет CPU, memory, IO и PIDs (systemd.resource-control(5)). На современных дистрибутивах часто используется cgroup v2, но режим зависит от сборки, ядра и параметров загрузки. Также поддерживает socket activation, automount и restart-политики.


Типы unit'ов


systemctl: основные команды

sudo systemctl start nginx.service
sudo systemctl stop nginx.service
sudo systemctl restart nginx.service
sudo systemctl reload nginx.service          # SIGHUP/ExecReload
sudo systemctl reload-or-restart nginx.service

systemctl status nginx.service
systemctl is-active nginx.service
systemctl is-enabled nginx.service
systemctl is-failed nginx.service

sudo systemctl enable nginx.service
sudo systemctl disable nginx.service
sudo systemctl enable --now nginx.service    # enable + start

sudo systemctl mask nginx.service            # запретить запуск
sudo systemctl unmask nginx.service

sudo systemctl daemon-reload                 # перечитать unit-файлы

Targets

  • multi-user.target — многопользовательский CLI;
  • graphical.target — графика поверх multi-user.target;
  • rescue.target — однопользовательский режим (sulogin, минимум сервисов);
  • emergency.target — только sulogin на корне в RO;
  • default.target — symlink на цель по умолчанию;
  • network-online.target, sysinit.target, basic.target — этапы загрузки.
systemctl list-units --type=target
systemctl get-default
sudo systemctl set-default multi-user.target
sudo systemctl isolate rescue.target          # переключить в target

journald

journalctl -u nginx.service                   # логи юнита
journalctl -b                                 # текущая загрузка
journalctl -b -1                              # предыдущая
journalctl --since "1 hour ago"
journalctl -p err                             # уровень >= err (priority как в syslog 0..7)
journalctl -f                                 # tail -f

Постоянное хранение требует Storage=persistent в /etc/systemd/journald.conf и каталога /var/log/journal/.


Пример unit-файла

/etc/systemd/system/hello.service:

[Unit]
Description=Example service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/hello.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now hello.service

Диагностика

systemctl --failed
systemctl list-dependencies nginx.service
systemctl cat nginx.service                   # эффективный unit с drop-in'ами
systemctl show nginx.service                  # все свойства

systemd-analyze                               # время загрузки
systemd-analyze blame                         # сервисы по времени старта
systemd-analyze critical-chain
systemd-analyze verify /etc/systemd/system/hello.service

Ссылки

systemd и systemctl | Aleksandr Suprun