Що таке 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?

  1. Швидкий старт: завдяки паралельному запуску служб, твоя система завантажується значно швидше.
  2. Легке керування: всі служби в одному місці, тому ти можеш керувати ними з єдиного інтерфейсу.
  3. Покращене логування: інтегрована система журналювання забезпечує зручніше управління логами.
  4. Гнучкість: хочеш додати нові можливості або налаштувати систему під свої потреби? Обмежень немає, роби що завгодно.

Мінуси використання 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

Важливо — переконайся, що твоя система має активовану відповідну службу:

  1. NetworkManager: systemctl enable NetworkManager-wait-online.service
  2. netctl: systemctl enable netctl-wait-online.service
  3. systemd-networkd: systemctl enable systemd-networkd-wait-online.service

Корисні посилання

  1. Офіційна документація
  2. Відповіді на часті питання про systemd
  3. Поради та хитрощі для юзерів systemd 
  4. Рейтинг 5 дистрибутивів Linux
  5. Каталог курсів Linux, де підтягнеш свої навички

Підіб’ємо підсумки

Systemd може здатись складним, але щойно розберешся з юнітами, таргетами та systemctl, відчуєш, що взяв під контроль не тільки сервіси, а й свій технічний дзен.

А якщо захочеш дізнатись більше про якісь технології чи інструменти на Linux — пиши коментар в наш Telegram-канал. Ми швидко відреагуємо і підготуємо цікавий матеріал.

Залишити відповідь

Дякуємо, що поділились