Ответ
Таргеты (цели) в 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 вешает всю свою логику запуска. Освоишь — будешь чувствовать себя повелителем загрузки, а не тем самым бздуном, который перезагружает сервер в надежде, что «само заработает».