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           # в реальном времени
← initramfs