// 06 из 08
systemd
6.1 История init систем
1969 — Unix: простой /etc/rc скрипт 1983 — SysV init: runlevels, последовательный запуск 2006 — Upstart (Ubuntu): событийно-ориентированный 2010 — systemd: параллельный запуск, cgroups 2015 — systemd стал стандартом большинства дистрибутивов
6.2 Почему systemd быстрее SysV
SysV init (последовательно): syslog ████████ network ████████████ ssh ████ cron ██ Итого: ~30 сек systemd (параллельно): syslog ████████ network ████████████ ssh ████ cron ██ dbus ████████ Итого: ~5 сек
6.3 Цели (targets)
poweroff.target ← выключение (аналог runlevel 0) rescue.target ← однопользователь. (аналог runlevel 1) multi-user.target ← многопользователь. (аналог runlevel 3) graphical.target ← графический режим (аналог runlevel 5) reboot.target ← перезагрузка (аналог runlevel 6)
6.4 Дерево зависимостей
graphical.target
└── display-manager.service (GDM/SDDM)
└── multi-user.target
├── NetworkManager.service
│ └── dbus.service
├── sshd.service
│ └── network.target
└── cron.service
└── basic.target
└── sysinit.target
└── local-fs.target
6.5 Пример unit-файла
# /etc/systemd/system/nginx.service [Unit] Description=Nginx Web Server After=network.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID [Install] WantedBy=multi-user.target
6.6 Типы Unit-файлов
.service — сервис (демон, программа) .target — группа сервисов .socket — сокет (запуск сервиса по запросу) .timer — задача по расписанию (аналог cron) .mount — точка монтирования .device — устройство .path — мониторинг файлов/папок .slice — группа процессов (cgroups)
6.7 Расположение unit-файлов
/lib/systemd/system/ ← файлы из пакетов (не трогать!) /etc/systemd/system/ ← пользовательские настройки /run/systemd/system/ ← временные Приоритет: /etc/ > /run/ > /lib/
6.8 Cgroups — контроль ресурсов
systemd
├── system.slice
│ ├── nginx.service [CPUQuota=50%, MemoryMax=1G]
│ └── mysql.service [CPUQuota=30%, MemoryMax=2G]
└── user.slice
└── user-1000.slice
└── bash, firefox...
6.9 Журналирование (journald)
journalctl # весь журнал journalctl -b # текущая загрузка journalctl -b -1 # прошлая загрузка journalctl -u nginx # только nginx journalctl --since "1 hour ago" journalctl -p err # только ошибки journalctl -f # в реальном времени