Что такое таргеты (targets) в systemd и какова их роль в управлении системой?

Ответ

Таргеты (цели) в systemd — это специальные юниты, которые группируют другие юниты (сервисы, сокеты, монтирования) для достижения определённого состояния системы. Они являются точками синхронизации и заменяют традиционные уровни выполнения (runlevels) из SysVinit.

Основная роль: Организация загрузки и изменения состояния системы через зависимости. При активации таргета systemd запускает все юниты, которые на него ссылаются (WantedBy= или RequiredBy=).

Ключевые таргеты:

  • default.target — символическая ссылка на целевой таргет по умолчанию (аналог runlevel).
  • multi-user.target — состояние многопользовательской системы без графического интерфейса (аналог runlevel 3).
  • graphical.target — состояние с запущенным графическим сервером (аналог runlevel 5).
  • rescue.target — однопользовательский аварийный режим.
  • reboot.target, poweroff.target — цели для перезагрузки и выключения.

Практическое использование:

# Узнать текущий таргет по умолчанию
systemctl get-default

# Установить multi-user.target как цель по умолчанию
sudo systemctl set-default multi-user.target

# Переключить систему в режим без графики (изолировать таргет)
sudo systemctl isolate multi-user.target

# Просмотреть все юниты, входящие в конкретный таргет
systemctl list-dependencies graphical.target

# Создать кастомный таргет для определённого состояния (например, «деплой»)
# Файл: /etc/systemd/system/deploy.target
[Unit]
Description=Deployment State
Requires=network-online.target docker.service
After=network-online.target docker.service
Wants=my-app.service
AllowIsolate=yes

Для DevOps-инженера таргеты важны при:

  • Настройке автоматического запуска стека сервисов (БД, кеш, приложение) в определённом порядке.
  • Создании собственных состояний системы для этапов пайплайна (например, pre-deploy.target, maintenance.target).
  • Понимании процесса загрузки для диагностики проблем, когда сервис не стартует.

Ответ 18+ 🔞

А, ну это про таргеты в systemd! Ёперный театр, вещь-то на самом деле полезная, хоть и выглядит как очередная мартышлюшка от разработчиков, которые слишком умные. Слушай сюда, сейчас разжую.

Понимаешь, раньше в старом добром SysVinit были эти runlevels — уровни выполнения, ну, типа «многопользовательский без графики» или «с графикой». Так вот, systemd взяла и сказала: «Да похуй, это негибко!». И придумала таргеты. По сути, это просто группы. Как если бы ты собрал в кучу все сервисы, которые должны работать, когда тебе нужна, например, графика, и назвал эту кучу graphical.target. И systemd, когда ты говоришь «хочу графику», просто запускает всю эту овердохуищу зависимостей из этой кучи. Удобно, чё.

Зачем это вообще нужно? Ну, чтобы организовать этот бардак при загрузке. Таргет — это точка синхронизации. Активировал его — и понеслась: systemd начинает впендюривать в память всё, что на этот таргет завязано. Полная замена старым уровням, только с прикрученными настройками.

Самые главные таргеты, которые надо знать, чтобы не выглядеть пидарасом шерстяным:

  • default.target — это просто ссылочка на то, что грузится по умолчанию. Типа, «стартуй в вот этот режим».
  • multi-user.target — классика. Система загружена, сеть есть, консоль есть, а графики — нихуя. Идеально для сервера.
  • graphical.target — тут уже и графический сервер подтянулся. Для десктопа.
  • rescue.target — когда всё накрылось медным тазом, и ты в однопользовательском режиме пытаешься понять, какого хуя.
  • reboot.target и poweroff.target — тут и так понятно, это цели, чтобы послать систему нахуй (перезагрузить или выключить).

А теперь как этим пользоваться, не сломав всё к ебеням:

# Глянуть, во что сейчас упирается загрузка по умолчанию
systemctl get-default

# Сказать системе: «Чувак, с завода грузись без графики, как сервер»
sudo systemctl set-default multi-user.target

# Резко переключиться в консольный режим прямо сейчас (графику убьёт!)
sudo systemctl isolate multi-user.target

# Увидеть всю эту паутину зависимостей для графического режима. Удивление пиздец, сколько всего там!
systemctl list-dependencies graphical.target

# А вот это уже для продвинутых. Допустим, ты деплоишь приложение.
# Создаёшь свой таргет, который говорит: «Всё, деплой готов».
# Файл: /etc/systemd/system/deploy.target
[Unit]
Description=Deployment State
Requires=network-online.target docker.service # Без сети и докера — ни шагу!
After=network-online.target docker.service    # Сначала они, потом мы
Wants=my-app.service                          # Наше приложение должно подтянуться
AllowIsolate=yes                              # Разрешаем на этот таргет переключаться

Зачем это всё тебе, как девопсу? Да элементарно!

  • Настройка стека: Чтоб БД, кеш и приложение стартовали в строгом порядке, а не как попало. Иначе будет хитрая жопа.
  • Свои состояния системы: Можешь сделать pre-deploy.target для подготовки или maintenance.target для техобслуживания. Красота.
  • Диагностика: Когда сервис не стартует, а ты нихуя не понимаешь почему, смотри зависимости таргета. Может, он ждёт какого-то сокета, который вротберунчик. В общем, волнение ебать, но с таргетами разобраться проще.

Короче, не бойся их. Это просто удобные крючки, на которые systemd вешает всю свою логику запуска. Освоишь — будешь чувствовать себя повелителем загрузки, а не тем самым бздуном, который перезагружает сервер в надежде, что «само заработает».