systemd, цели и уровни выполнения [101.3]

Рейтинг: 65.7% · 17 голосов
Полный курс LPIC-1 (экзамены 101-500 и 102-500): архитектура, загрузка, пакеты, команды и текст, ФС и права, шелл-скрипты, пользователи, сервисы, сеть, безопасность. Debian и RHEL.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

systemd, цели и уровни выполнения [101.3]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-1 и как устроен путь администратора
  2. Железо, устройства и модули ядра [101.1]
  3. Загрузка системы: от BIOS до systemd [101.2]
  4. systemd, цели и уровни выполнения [101.3] (вы здесь)
  5. План разметки диска и swap [102.1]
  6. Загрузчик GRUB 2 [102.2]
  7. Разделяемые библиотеки [102.3]
  8. Управление пакетами в Debian: dpkg и apt [102.4]
  9. Управление пакетами RPM, DNF и Zypper [102.5]
  10. Linux как гость виртуализации [102.6]
  11. Командная строка Bash [103.1]
  12. Обработка текста фильтрами [103.2]
  13. Базовое управление файлами [103.3]
  14. Потоки, конвейеры и перенаправление [103.4]
  15. Процессы: создание, мониторинг, сигналы [103.5]
  16. Приоритеты выполнения процессов [103.6]
  17. Регулярные выражения [103.7]
  18. Редактор vi и vim [103.8]
  19. Разделы и создание файловых систем [104.1]
  20. Целостность и обслуживание ФС [104.2]
  21. Монтирование файловых систем [104.3]
  22. Урок 21. Права доступа и владение: rwx, chmod, umask и специальные биты
  23. Жёсткие и символические ссылки
  24. FHS и поиск файлов в системе [104.7]
  25. Окружение и кастомизация оболочки [105.1]
  26. Урок 25. Написание простых bash-скриптов [105.2]
  27. Графика, рабочие столы и доступность
  28. Учётные записи пользователей и групп
  29. Автоматизация задач: cron, at, таймеры [107.2]
  30. Локализация и интернационализация [107.3]
  31. Системное время и синхронизация [108.1]
  32. Системное логирование [108.2]
  33. Основы почтового агента (MTA) [108.3]
  34. Печать и CUPS [108.4]
  35. Основы интернет-протоколов [109.1]
  36. Постоянная конфигурация сети [109.2]
  37. Диагностика сети [109.3]
  38. DNS на стороне клиента [109.4]
  39. Задачи администрирования безопасности [110.1]
  40. Настройка безопасности хоста [110.2]
  41. Шифрование данных: SSH и GnuPG [110.3]
Урок 3. systemd, цели и уровни выполнения [101.3]

Когда машина грузится, кто-то должен решить: какие службы поднять, в каком порядке, что считать признаком готовности системы. На современных Linux этим занимается systemd - первый процесс (PID 1), родитель всего остального. В этом уроке разбираем, как управлять службами через systemctl, что такое юниты и цели (targets), чем они отличаются от старых runlevel, как переключать режимы работы на лету и как корректно гасить и перезагружать систему, не оборвав работу пользователям.

Изображение

Как это работает

systemd описывает все управляемые сущности через юниты (units) - текстовые файлы с расширением, задающим тип. Самые частые: .service (демон или разовая задача), .target (группа-точка синхронизации), .socket (сокет для активации по требованию), .mount и .automount (точки монтирования), .timer (замена cron внутри systemd), .device, .path, .slice. Тип определяет, какие секции в файле осмысленны и как systemd обращается с объектом.

Юниты лежат в трёх слоях, и порядок важен. Пакеты кладут эталонные файлы в /usr/lib/systemd/system. Администратор переопределяет их в /etc/systemd/system - этот слой главнее. Времянка, генерируемая на лету, живёт в /run/systemd/system. Если имя совпадает, выигрывает более приоритетный путь, а через drop-in каталоги вида имя.service.d/override.conf можно менять отдельные параметры, не трогая исходный файл.

Главная идея systemd - не последовательность шагов, а граф зависимостей. Вместо номерных уровней есть цели: точки, в которых собирается нужный набор служб. Связи Wants= и Requires= тянут юниты внутрь цели, а Before= и After= задают порядок запуска. Благодаря этому графу systemd стартует независимые службы параллельно, отчего загрузка ощутимо быстрее старого последовательного SysVinit.

Старые runlevel (0-6) никуда не делись как понятие, но теперь это просто синонимы целей. Для совместимости заведены символические ссылки: runlevel3.target указывает на multi-user.target (текстовый многопользовательский режим), runlevel5.target - на graphical.target (с графической оболочкой), runlevel1.target - на rescue.target. Команды telinit и runlevel ещё работают, но это фасад над systemctl. То, какая цель грузится по умолчанию, задаёт ссылка default.target.

Команды и примеры

Базовое управление службой одинаково в Debian/Ubuntu и RHEL/Fedora - сам systemctl от дистрибутива не зависит, различаются лишь имена пакетов и юнитов (например, ssh.service в Debian/Ubuntu против sshd.service в RHEL/Fedora):

Код: Выделить всё

systemctl status sshd.service     # состояние, последние строки лога, PID
systemctl start sshd              # запустить сейчас
systemctl stop sshd               # остановить сейчас
systemctl restart sshd            # перезапуск
systemctl reload sshd             # перечитать конфиг без полного рестарта
systemctl enable --now sshd       # включить автостарт И сразу запустить
systemctl disable sshd            # убрать из автозагрузки
systemctl is-enabled sshd         # enabled / disabled / static / masked
systemctl is-active sshd          # active / inactive / failed
Разница enable и start принципиальна: start действует только до перезагрузки, enable создаёт ссылку в каталоге .wants нужной цели и действует постоянно, но сам службу не запускает - отсюда удобный ключ --now.

Осмотр системы и работа с целями:

Код: Выделить всё

systemctl list-units --type=service        # активные службы
systemctl list-units --type=service --all  # включая неактивные
systemctl --failed                          # что упало
systemctl get-default                        # текущая цель по умолчанию
systemctl set-default multi-user.target      # грузиться в текст без GUI
systemctl list-dependencies graphical.target # дерево зависимостей цели
Переключение режима на лету делает isolate - он поднимает указанную цель и гасит всё, что в неё не входит:

Код: Выделить всё

systemctl isolate multi-user.target   # уйти из графики в текст без перезагрузки
systemctl isolate graphical.target    # вернуть графику
systemctl rescue                       # = isolate rescue.target, однопользовательский
systemctl emergency                    # минимум: только / в ro, без большинства служб
rescue.target (бывший single-user, runlevel 1) монтирует ФС и запускает базовый набор для ремонта, спрашивает root-пароль и даёт shell. emergency.target - ещё аскетичнее: почти ничего не смонтировано и не запущено, для тяжёлых случаев. В эти режимы можно попасть и из загрузчика, дописав в строку ядра systemd.unit=rescue.target или просто слово single.

Корректное завершение работы. Команды-обёртки и их systemctl-эквиваленты:

Код: Выделить всё

systemctl poweroff      # = shutdown -h now, выключить питание
systemctl reboot        # = shutdown -r now, перезагрузка
systemctl halt          # остановить ЦП без выключения питания
shutdown -h +10 "Перезагрузка через 10 минут, сохраните работу"
shutdown -r 22:30       # перезагрузка в 22:30
shutdown -c             # отменить запланированное завершение
shutdown сам шлёт всем вошедшим пользователям предупреждение на их терминалы; ручное оповещение делает wall:

Код: Выделить всё

wall "Через 5 минут плановый ребут, закройте сессии"
Частые грабли
  • Путают enable и start: включили enable, удивляются, что служба не работает прямо сейчас - до перезагрузки её надо ещё и start (или сразу enable --now).
  • isolate на сетевой машине: если выполнить isolate rescue.target по SSH, сеть и sshd погаснут, и вы потеряете доступ. Делайте такое только с консоли.
  • Маскированная служба (systemctl mask) не запустится ни вручную, ни как зависимость - ссылка ведёт на /dev/null. Пока не сделаете unmask, start будет тихо игнорироваться.
  • Отредактировали юнит в /etc/systemd/system и забыли systemctl daemon-reload - systemd работает по старой версии в памяти и ваших правок не видит.
  • Имя ssh против sshd: команда из RHEL-инструкции не сработает в Debian и наоборот. Сверяйтесь с list-units.
  • reload не у всех юнитов есть; если служба не умеет перечитывать конфиг, нужен restart (или try-restart).
  • halt без -p лишь останавливает систему, не снимая питание - на железе машина продолжит гудеть. Для выключения нужен poweroff или halt -p.
Мини-лаба
  • Посмотрите текущую цель по умолчанию: systemctl get-default.
  • Поставьте текстовый режим: systemctl set-default multi-user.target, затем проверьте get-default.
  • Переключитесь в текст без перезагрузки: systemctl isolate multi-user.target (с локальной консоли, не по SSH), убедитесь, что графика погасла.
  • Запустите учебную службу: systemctl enable --now sshd, проверьте is-enabled и is-active.
  • Замаскируйте её: systemctl mask sshd, попробуйте start и посмотрите, что вывел systemctl status; затем unmask.
  • Изучите дерево цели: systemctl list-dependencies graphical.target.
  • Запланируйте и отмените ребут: shutdown -r +5 "тест", затем shutdown -c; верните default.target обратно в graphical.target.
Контрольные вопросы
  • В чём практическая разница между systemctl enable foo и systemctl start foo?
  • Какой цели соответствуют классические runlevel 3 и 5 и где об этом узнать в системе?
  • Что делает systemctl isolate и чем он опасен на удалённом сервере?
  • Чем emergency.target отличается от rescue.target по набору смонтированных ФС и запущенных служб?
  • Какие три каталога хранят unit-файлы и какой из них имеет приоритет при совпадении имён?
  • Почему после правки unit-файла нужен systemctl daemon-reload и что произойдёт без него?
👍5 ❤️1 🔥 😄 🤔3
Аватара пользователя
Patrickx
Сообщения: 1
Зарегистрирован: 12 май 2026, 20:50

Re: systemd, цели и уровни выполнения [101.3]

Сообщение Patrickx »

А если default.target указывает на graphical, а иксы не ставил - что будет при загрузке? Просто текстовый логин или ошибка?
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
regexaddict
Сообщения: 1
Зарегистрирован: 11 май 2026, 21:29

Re: systemd, цели и уровни выполнения [101.3]

Сообщение regexaddict »

Поймал грабли: правил .service в /etc/systemd/system, рестартил - не подхватывалось. daemon-reload реально обязателен, спасибо что отдельно выделили.
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Загрузка системы: от BIOS до systemd [101.2]
Следующая глава →
План разметки диска и swap [102.1]

Все главы курса «LPIC-1: администратор Linux (101 + 102)»

Поделиться темой: ✈ Telegram VK

Вернуться в «LPIC-1: администратор Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя