Що таке systemd?

Systemd — це система ініціалізації та менеджер служб, яка стала стандартом у більшості сучасних дистрибутивів Linux (наприклад, Fedora, Ubuntu, Debian, CentOS). Її завдання — запускати процеси, стежити за їхнім станом і надавати зручний інтерфейс для управління всім цим «міксом».
Колись на місці systemd був SysV init з набором послідовних скриптів, де кожна служба стартувала після попередньої.
Сьогодні все інакше: один виконуваний файл /lib/systemd/systemd
бере систему під повний контроль і запускає все паралельно. Принцип простий — тільки потрібне й максимально швидко. Це і була початкова ідея Леннарта Поттерінга та його команди (творці systemd).
Як працює systemd?
Після запуску сервера першим стартує ядро — це перший процес і він отримує ідентифікатор 0.
Далі запускається процес з ідентифікатором 1 — init
. Він відповідає за початкову ініціалізацію системи, орієнтуючись на дані з робочої директорії.
У сучасних дистрибутивах файл /sbin/init
— це не окремий процес, а просто символічне посилання (симлінк) на systemd, який фізично знаходиться в /lib/systemd/systemd
.
Тобто саме systemd фактично виконує роль init
та керує запуском усіх служб у системі. Деякі з них можуть бути описані в каталогах типу /etc/init.d/
, але керування бере на себе вже systemd.
Всі процеси описуються через так звані юніти (unit) — це окремі конфігураційні об’єкти, які описують, як керувати чимось у системі: службою, точкою монтування, таймером, сокетом, навіть віртуальною машиною.
Кілька юнітів можна згрупувати у target — таку собі логічну ціль (аналог runlevel у SysV), що описує певний стан системи. Наприклад, multi-user.target
— звичайний режим роботи системи з мережею, але без GUI.
Конфіги для юнітів зберігаються в /lib/systemd/system/
, а сам systemd запускає їх так, щоби досягти потрібного target.
Основні типи юнітів
- service: описує запуск і контроль сервісу (старт, стоп, рестарт, умови перезапуску).
- timer: планує завдання на зразок
cron
, але з логами та контролем уjournald
. - socket і path: запускають сервіс не одразу, а при першому зверненні (наприклад, docker демон).
- mount / automount: управляють точками монтування, як у
fstab
, але з гнучкішими сценаріями. - target: групують юніти для запуску певного стану системи.
- slice: описують групи процесів, яким треба обмежити ресурси через cgroups.
- scope: підхоплюють процеси, які не запускались через systemd, але теж потребують контролю.
- device: автоматично додаються для пристроїв через
udev
.
Чим зручний Systemd?
- Швидкий старт: завдяки паралельному запуску служб, твоя система завантажується значно швидше.
- Легке керування: всі служби в одному місці, тому ти можеш керувати ними з єдиного інтерфейсу.
- Покращене логування: інтегрована система журналювання забезпечує зручніше управління логами.
- Гнучкість: хочеш додати нові можливості або налаштувати систему під свої потреби? Обмежень немає, роби що завгодно.
Мінуси використання systemd
- Уся логіка та контроль зосереджені в одному великому компоненті. Через це менше модульності.
- Не дотримується стандартів POSIX, що ускладнює сумісність із класичними системами Unix.
- Працює виключно на Linux.
Базові команди systemd
Запускає сервіс:systemctl start ім'я.service
Зупиняє активний сервіс:systemctl stop ім'я.service
Перезапускає сервіс (зручно після змін у конфігах):systemctl restart ім'я.service
Показує поточний стан, лог останніх подій і PID процесу:systemctl status ім'я.service
Додає сервіс до автозавантаження (вмикається при старті системи):systemctl enable ім'я.service
Перевіряє, чи буде сервіс запускатись автоматично:systemctl is-enabled ім'я.service
Повністю блокує запуск сервісу, навіть вручну. Застосовується через симлінк на /dev/null
:systemctl mask ім'я.service
Скасовує блокування запуску:systemctl unmask ім'я.service
Виводить список служб, які не запустились або завершились з помилкою:systemctl --state=failed
Відкриває сторінку посібника з описом усіх можливостей systemctl
:man systemctl
Перезапускає сам systemd, щоби врахувати зміни в конфігураційних файлах. Без перезавантаження всієї системи:systemctl daemon-reexec
Рекомендації для зручнішої роботи з systemd
- Автоматичне ввімкнення юнітів
Arch Linux блокує автоувімкнення юнітів через файл 99-default.preset
.
Якщо потрібно змінити цю поведінку — створи символічне посилання:
ln -s /dev/null /etc/systemd/system-preset/99-default.preset
Це дозволить автоматично вмикати нові юніти після встановлення.
- Сповіщення про падіння сервісів
Увімкни глобальне сповіщення:
[Unit]
OnFailure=failure-notification@%n
Створи юніт-шаблон failure-notification@.service
, що викликає твій скрипт, наприклад:
[Service]
ExecStart=/шлях/до/failure-notification.sh %i
У скрипті можна налаштувати сповіщення на пошту, в месенджер або через API.
- Пісочниця (sandbox) через systemd
Щоб ізолювати застосунок, використовуй параметри типу:
[Service]
CapabilityBoundingSet=~CAP_SYS_ADMIN
Для оцінки безпеки юніта:
systemd-analyze security ім’я.service
- Запуск сервісу після підключення до мережі
У юніт-файлі додай:
[Unit]
Wants=network-online.target
After=network-online.target nss-lookup.target
Важливо — переконайся, що твоя система має активовану відповідну службу:
- NetworkManager:
systemctl enable NetworkManager-wait-online.service
- netctl:
systemctl enable netctl-wait-online.service
- systemd-networkd:
systemctl enable systemd-networkd-wait-online.service
Корисні посилання
- Офіційна документація
- Відповіді на часті питання про systemd
- Поради та хитрощі для юзерів systemd
- Рейтинг 5 дистрибутивів Linux
- Каталог курсів Linux, де підтягнеш свої навички
Підіб’ємо підсумки
Systemd може здатись складним, але щойно розберешся з юнітами, таргетами та systemctl, відчуєш, що взяв під контроль не тільки сервіси, а й свій технічний дзен.
А якщо захочеш дізнатись більше про якісь технології чи інструменти на Linux — пиши коментар в наш Telegram-канал. Ми швидко відреагуємо і підготуємо цікавий матеріал.