Цели Systemd: Управление состояниями загрузки и уровнями выполнения

Изучите цели Systemd и их роль в замене традиционных уровней выполнения Linux (runlevels). Это руководство объясняет распространенные цели, такие как `multi-user.target` и `graphical.target`, как их просматривать, изменять и управлять ими с помощью `systemctl`, а также их важность в инициализации и управлении современной системой Linux. Научитесь эффективно контролировать состояния загрузки и режимы работы вашей системы.

28 просмотров

Цели Systemd: Эффективное управление состояниями загрузки и уровнями запуска

Systemd, современный стандарт для инициализации и управления службами в системах Linux, представил более гибкий и надежный механизм управления состояниями системы по сравнению с традиционными уровнями запуска init. Этот механизм известен как цели Systemd (Systemd Targets). Цели — это, по сути, точки синхронизации или состояния, которых может достичь система. Они определяют набор юнитов (службы, сокеты, точки монтирования и т. д.), которые должны быть активны для достижения системой определенного состояния. Понимание целей systemd имеет решающее значение для эффективного управления процессом загрузки вашей системы Linux, зависимостями служб и общим рабочим состоянием.

В этой статье мы раскроем концепцию целей systemd, объяснив, как они заменили старую концепцию уровней запуска, и подробно рассмотрим их структуру, назначение и распространенные сценарии использования. Мы изучим, как просматривать, изменять и даже создавать собственные цели, что позволит вам получить более тонкий контроль над поведением вашей системы.

Эволюция от уровней запуска к целям Systemd

Исторически в системах Linux использовалась концепция уровней запуска (runlevels) для определения рабочего состояния системы во время загрузки и выполнения. Уровень запуска представлял собой числовой идентификатор (0-6), который определял, какие службы были запущены или остановлены. Например, уровень запуска 3 обычно означал многопользовательский текстовый режим, а уровень запуска 5 — графическую многопользовательскую среду. Эта система, хотя и была функциональной, имела ограничения:

  • Жесткость: Уровни запуска часто определялись в некоторой степени фиксировано, что затрудняло настройку точного набора служб, активных для данного состояния.
  • Неявные зависимости: Зависимости между службами часто управлялись косвенно через назначение уровней запуска, что приводило к потенциальным конфликтам или пропущенным службам.
  • Отсутствие детализации: Числовая система не обладала описательной ясностью, что затрудняло понимание предполагаемого состояния системы.

Цели systemd устраняют эти ограничения, предоставляя более явный, управляемый зависимостями и описательный подход. Вместо абстрактных чисел цели имеют осмысленные имена (например, multi-user.target, graphical.target), которые четко указывают на предполагаемое состояние системы. Зависимости явно определяются в файлах юнитов, гарантируя, что все необходимые компоненты запускаются в правильном порядке.

Понимание целей Systemd

Цель systemd сама по себе является типом юнита. Когда цель активируется, systemd пытается активировать все юниты, перечисленные как зависимости в файле юнита этой цели. Это создает каскадный эффект, гарантируя, что все необходимые службы, устройства и другие компоненты будут запущены для достижения желаемого состояния системы.

Ключевые характеристики целей Systemd:

  • Управление зависимостями: Цели определяют, какие другие юниты должны быть активны, чтобы цель считалась достигнутой. Это основа их мощности.
  • Точки синхронизации: Они действуют как точки синхронизации во время процесса загрузки. Система не перейдет к следующему этапу, пока текущая цель не будет полностью инициализирована.
  • Описательные имена: Цели имеют описательные имена, что позволяет легко понять предполагаемое состояние системы (например, rescue.target, poweroff.target).

Распространенные цели Systemd

Systemd поставляется с набором предопределенных целей, предназначенных для охвата распространенных состояний системы. Понимание этих целей является ключом к управлению вашей системой.

multi-user.target

Это одна из самых фундаментальных целей. Она представляет собой полностью функциональную многопользовательскую систему с включенной сетью, но без графического менеджера входа в систему или среды рабочего стола. Обычно это целевая система для серверов.

  • Назначение: Обеспечение стабильной среды для запуска служб и разрешения входа нескольких пользователей через текстовые консоли или SSH.
  • Зависимости: Обычно включает юниты для сети, системных служб и приглашений к входу в консоль.

graphical.target

Эта цель представляет собой полностью функциональную многопользовательскую систему с графической средой рабочего стола, готовой к взаимодействию с пользователем. Обычно она является зависимой от multi-user.target и добавляет необходимые компоненты для графического сеанса.

  • Назначение: Запуск графического менеджера дисплея (например, GDM, LightDM, SDDM) и соответствующей среды рабочего стола.
  • Зависимости: Наследует все зависимости от multi-user.target и добавляет юниты для сервера X или композитора Wayland, менеджера дисплея и сеанса рабочего стола.

rescue.target

Эта цель обеспечивает минимальную однопользовательскую среду. В основном она используется для обслуживания и восстановления системы. Она запускает базовую систему и оболочку root, но обычно не запускает сетевые или многопользовательские службы.

  • Назначение: Предоставление безопасной среды для системных администраторов для выполнения задач обслуживания без помех со стороны других служб.
  • Зависимости: Минимальный набор основных системных компонентов и оболочка root.

emergency.target

Это еще более минималистичная цель, чем rescue.target. Она запускает систему с файловой системой только для чтения и оболочкой root. Она предназначена для критических чрезвычайных ситуаций, когда даже базовые службы могут вызывать проблемы.

  • Назначение: Для критического восстановления системы, когда даже rescue.target может быть нецелесообразным.
  • Зависимости: Только самые необходимые системные компоненты и оболочка root (часто только для чтения).

reboot.target, poweroff.target, halt.target

Это специальные цели, используемые для завершения работы или перезагрузки системы. Когда systemd активирует одну из этих целей, он останавливает все запущенные службы, а затем выполняет указанное действие (перезагрузка, выключение питания или остановка).

  • Назначение: Корректное завершение работы или перезагрузка системы.
  • Зависимости: Обычно они зависят от служб, которые необходимо остановить перед завершением работы системы.

Управление целями Systemd

Systemd предоставляет несколько инструментов командной строки для взаимодействия с целями. Основным инструментом является systemctl.

Просмотр текущих и стандартных целей

Чтобы увидеть, какая цель в данный момент активна в системе, и какая цель используется по умолчанию при загрузке, используйте:

systemctl status

Эта команда предоставляет множество информации, включая активную цель. Чтобы конкретно запросить целевую систему по умолчанию:

systemctl get-default

Чтобы увидеть все доступные цели:

systemctl list-unit-files --type=target

Изменение целевой системы по умолчанию

Если вы хотите, чтобы ваша система загружалась в другую целевую систему по умолчанию (например, с графической на многопользовательскую или наоборот), вы можете использовать systemctl set-default:

Чтобы установить графическую целевую систему по умолчанию (обычно для настольных систем):

sudo systemctl set-default graphical.target

Чтобы установить многопользовательскую целевую систему по умолчанию (обычно для серверов):

sudo systemctl set-default multi-user.target

Важно: Изменение целевой системы по умолчанию вступит в силу только при следующей перезагрузке.

Переключение на целевую систему (без перезагрузки)

Вы можете немедленно переключить систему на другую целевую систему без перезагрузки. Это полезно для тестирования или временного изменения состояния системы. Используйте команду systemctl isolate:

Для переключения на графическую целевую систему:

sudo systemctl isolate graphical.target

Для переключения на многопользовательскую целевую систему:

sudo systemctl isolate multi-user.target

Внимание: systemctl isolate — это мощная команда. Изоляция в целевую систему, такую как rescue.target или emergency.target, остановит большинство запущенных служб. Убедитесь, что вы понимаете последствия перед ее использованием. Вы можете потерять сетевое подключение или графический сеанс.

Связь целей с файлами юнитов

Цели реализуются как файлы юнитов, обычно расположенные в /usr/lib/systemd/system/ или /etc/systemd/system/. Файл юнита цели (например, graphical.target) указывает зависимости от других юнитов, включая другие цели и службы.

Типичный файл юнита graphical.target может выглядеть примерно так (упрощенно):

[Unit]
Description=Graphical multi-user system
Documentation=man:systemd.special(7)
# This target is intended to be a prerequisite for the graphical login manager.
# It's the target that the system will boot into if not otherwise specified.
Wants=display-manager.service
Before=shutdown.target

[Install]
Alias=default.target

Здесь:

  • Wants=display-manager.service: Указывает, что display-manager.service (фактический менеджер входа, такой как GDM или LightDM) должен быть запущен, если это возможно. Это более слабая зависимость, чем Requires=.
  • Before=shutdown.target: Гарантирует, что графическая среда будет остановлена перед тем, как система перейдет в процесс завершения работы.
  • Alias=default.target: Делает graphical.target стандартной, если default.target на нее ссылается (что обычно и бывает для настольных систем).

Создание пользовательских целей

Хотя это и реже используется в повседневной работе, вы можете создавать свои собственные пользовательские цели для определения конкретных состояний системы с уникальным набором служб.

Шаги по созданию пользовательской цели:

  1. Создайте файл юнита .target: Поместите его в /etc/systemd/system/ (например, my-custom.target).
    ```ini
    [Unit]
    Description=My Custom Target

    [Install]
    WantedBy=multi-user.target # Или другая подходящая цель
    2. **Создайте файлы `.service` или другие юниты:** Определите службы и другие юниты, которые должны быть активны для вашей пользовательской цели. 3. **Добавьте зависимости:** В файле юнита вашей пользовательской цели используйте `Requires=` или `Wants=` для указания, какие юниты должны или должны быть запущены.ini
    [Unit]
    Description=My Custom Target
    Wants=service1.service
    Wants=service2.service
    After=service1.service service2.service

    [Install]
    WantedBy=multi-user.target
    4. **Перезагрузите systemd:**bash
    sudo systemctl daemon-reload
    5. **Включите/Запустите вашу цель:**bash
    sudo systemctl start my-custom.target

    Или чтобы сделать ее загружаемой

    sudo systemctl enable my-custom.target
    ```

Сценарий использования: Представьте среду разработки, где вам нужны работающие конкретные серверы баз данных и приложений. Вы можете создать dev-env.target, который запускает эти службы.

Рекомендации и советы

  • Понимайте стандартную цель: Знайте стандартную цель вашей системы (graphical.target или multi-user.target), так как она определяет первоначальный опыт загрузки.
  • Используйте isolate с осторожностью: Будьте внимательны при использовании systemctl isolate, особенно на производственных системах, так как это может нарушить работу запущенных служб.
  • Проверяйте зависимости: Если служба не запускается, изучите зависимости целевой системы, с которой она связана, используя systemctl list-dependencies <target_name>.
  • Сервер против настольного компьютера: На серверах multi-user.target почти всегда предпочтительнее для безопасности и эффективности использования ресурсов. На настольных компьютерах graphical.target является стандартом.
  • Обслуживание системы: Для задач, требующих минимального вмешательства, rescue.target — ваш помощник. Для критического восстановления доступен emergency.target.

Заключение

Цели Systemd представляют собой значительное усовершенствование по сравнению с традиционными уровнями запуска, предлагая более выразительный, гибкий и ориентированный на зависимости способ управления состояниями системы. Понимая распространенные цели, такие как multi-user.target и graphical.target, а также зная, как просматривать и изменять стандартные цели, вы получаете больший контроль над процессом загрузки и рабочим поведением вашей системы Linux. Будь то настройка сервера, управление настольным компьютером или устранение неполадок системы, уверенное владение целями systemd — бесценный навык для любого системного администратора Linux.