Targets и уровни выполнения
Targets systemd — именованные точки синхронизации, объединяющие юниты. multi-user.target — нормальный сервер, graphical.target добавляет рабочий стол. rescue.target и emergency.target — режимы восстановления. systemctl isolate переключает живую систему на другой target.
Сервер ведёт себя странно после обновления — некоторые сервисы сломаны, но полная перезагрузка нежелательна. Ты выполняешь systemctl isolate rescue.target. Система переходит в однопользовательскую оболочку, убивает все несущественные сервисы и оставляет корневую файловую систему смонтированной на чтение-запись. Ты правишь сломанный конфиг, затем systemctl isolate multi-user.target возвращает всё обратно — без перезагрузки.
Вот targets на практике. Это не просто концепция загрузки — это живые переключаемые состояния системы, которые можно использовать для обслуживания, восстановления и диагностики пока машина работает.
После этого урока ты сможешь объяснить что такое systemd target, перечислить ключевые targets и что каждый активирует, изменить target загрузки по умолчанию, использовать systemctl isolate для переключения targets на работающей системе, и сопоставить уровни выполнения SysV с их аналогами в systemd.
Target — это именованная точка синхронизации, а не скрипт и не номер уровня. Юнит .target в systemd — это юнит, единственная задача которого — притягивать зависимости. Когда systemd активирует multi-user.target, он разрешает граф зависимостей всего, что этот target хочет через Wants= или Requires=, запускает всё параллельно и отмечает target активным, когда все обязательные юниты подняты.
# Посмотреть, что multi-user.target притягивает
systemctl show multi-user.target -p Wants,Requires,After
# Список всех активных targets
systemctl list-units --type=targetTargets аддитивны: graphical.target зависит от multi-user.target, который зависит от basic.target, который зависит от sysinit.target. Активация graphical.target активирует всю цепочку.
Ключевые targets, с которыми ты столкнёшься. Каждый представляет отдельное состояние системы:
| Target | Состояние | Типичное использование |
|---|---|---|
emergency.target | Корень только для чтения, минимальная оболочка | Повреждение файловой системы |
rescue.target | Корень на чтение-запись, один пользователь | Ремонт конфига, нет сети |
multi-user.target | Полный многопользовательский режим, без GUI | Серверы, безголовые системы |
graphical.target | Многопользовательский + менеджер дисплея | Рабочие станции |
reboot.target | Последовательность перезагрузки | systemctl reboot активирует это |
poweroff.target | Последовательность выключения | systemctl poweroff |
Разница между emergency и rescue: emergency вообще не запускает нормальную логику монтирования — ты получаешь минимальное окружение ядра с корнем только для чтения. Rescue выполняет нормальное раннее монтирование и даёт root-оболочку с файловой системой на чтение-запись.
Как просматривать и изменять target по умолчанию. Target по умолчанию — то, в чём systemd загружается автоматически. На сервере — multi-user.target; на рабочей станции — graphical.target.
# Посмотреть текущий target по умолчанию
systemctl get-default
# Изменить target по умолчанию (сохраняется между перезагрузками)
sudo systemctl set-default multi-user.target
# Эквивалентно: target по умолчанию — это симлинк
ls -la /etc/systemd/system/default.targetset-default просто обновляет симлинк /etc/systemd/system/default.target на выбранный файл target. Здесь нет ничего скрытого — это можно проверить через ls -la.
systemctl isolate переключает живую систему на другой target. Изоляция target запускает все юниты, необходимые этому target, и останавливает все юниты, которые не нужны ему. Это живой эквивалент перезагрузки в другой уровень выполнения, но без перезагрузки.
# Перейти в rescue-режим (убивает большинство сервисов, оставляет root-оболочку)
sudo systemctl isolate rescue.target
# Вернуться в полный многопользовательский режим
sudo systemctl isolate multi-user.target
# Не все targets можно изолировать — только те, у которых AllowIsolate=yes
systemctl show rescue.target -p AllowIsolateПредупреждение: изоляция до rescue.target на продакшн-системе прервёт все работающие сервисы — сеть, базы данных, всё. Всегда предупреждай пользователей и подтверждай окно обслуживания перед этим на живой машине.
Сопоставление уровней выполнения SysV с targets systemd. Уровни выполнения SysV были числами от 0 до 6. systemd предоставляет совместимые targets, которые отображаются на них, чтобы скрипты, использующие runlevel или /etc/inittab, работали как шимы.
| Уровень SysV | Target systemd | Смысл |
|---|---|---|
| 0 | poweroff.target | Остановка |
| 1 | rescue.target | Один пользователь |
| 2, 3, 4 | multi-user.target | Многопользовательский, без GUI |
| 5 | graphical.target | Многопользовательский + GUI |
| 6 | reboot.target | Перезагрузка |
# Команда runlevel по-прежнему работает (читает из systemd)
runlevel # выводит предыдущий и текущий уровень выполнения как числа
# Старая команда telinit отображается на systemctl isolate
sudo telinit 1 # эквивалентно: systemctl isolate rescue.targetПереключение сломанного рабочего стола в многопользовательский режим без перезагрузки.
Сценарий: Менеджер дисплея (gdm3) рабочей станции падает в цикл после обновления видеодрайвера. GUI недоступен, но машина доступна по SSH.
# Проверяем текущий target по умолчанию (вероятно graphical.target)
systemctl get-default
# Переключаемся на multi-user.target — убивает цикл менеджера дисплея
sudo systemctl isolate multi-user.target
# Теперь исправляем проблему с драйвером
sudo apt remove nvidia-driver-535
sudo apt install nvidia-driver-525
# Меняем target по умолчанию, чтобы при следующей загрузке не было сломанного GUI
sudo systemctl set-default multi-user.target
# Чистая перезагрузка с рабочим драйвером
sudo reboot
# После подтверждения работы восстанавливаем графический target по умолчанию
sudo systemctl set-default graphical.targetКлючевое: isolate позволил исправить проблему без цикла перезагрузок, сократив простой с «перезагрузка → сломанный цикл → перезагрузка» до одной запланированной перезагрузки в конце.
▸Почему это работает
В macOS нет targets systemd или уровней выполнения SysV. Эквивалент — домены launchd (system, user, GUI session), но концепции isolate нет — нельзя переключить работающий Mac в однопользовательский текстовый режим без перезагрузки в Recovery Mode. На Linux живопереключаемая система targets — это реальное операционное преимущество для серверов, которым нужно минимизировать простой.
▸Частая ошибка
Частая путаница: rescue.target vs emergency.target. Если система не может смонтировать корневую файловую систему (например, плохая запись в /etc/fstab), systemd может автоматически перейти в emergency.target — файловая система смонтирована только для чтения. Выполнение mount -o remount,rw / перед редактированием /etc/fstab — первое что нужно сделать. rescue.target достигается только когда корневая файловая система успешно смонтирована — если видишь rescue, диск в порядке; если emergency, подозревай проблему монтирования или файловой системы.
Ты хочешь постоянно настроить сервер на загрузку в multi-user.target вместо graphical.target. Какая команда это делает?
Target systemd — именованная точка синхронизации, объединяющая зависимые юниты. Ключевые серверные targets: emergency.target (ro-корень, минимальная оболочка), rescue.target (rw-корень, один пользователь), multi-user.target (полный сервер), graphical.target (сервер + рабочий стол). systemctl get-default и set-default читают и записывают target загрузки по умолчанию. systemctl isolate переключает живую систему на target — запускает что нужно, останавливает что не нужно. Уровни SysV 1, 3 и 5 отображаются на rescue, multi-user и graphical targets соответственно. emergency vs rescue: если файловая система не смонтировалась — emergency; если смонтировалась — rescue.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.