статус индиректного юнита systemd

Вопрос или проблема

Интересно, как я могу проверить, какая единица активирует другую с состоянием “indirect”?

Я использую Arch с Gnome и сервер Debian. На моей машине с Debian вывод команды systemctl list-unit-files --type=target --state=enabled показывает, как и ожидалось:

default.target    enabled
multi-user.target enabled

Но на десктопе Arch, к моему удивлению, этого нет, хотя обе: multi-user.target и graphical.target (по умолчанию в Arch) активны.
Когда я проверяю статус этих юнитов, они оба: indirect. Когда я перечисляю зависимости для graphical.target, он показывает gdm.service и multi-user.target. В файле юнита gdm я не вижу Also= в разделе [Install]. Так что же именно активирует graphical.target?

Какова причина этого “indirect” решения?

Из man systemd.special:

graphical.target

       Специальная целевая единица для настройки графического экрана входа.
       Это включает в себя multi-user.target.

       Юниты, необходимые для графических входов, должны добавлять зависимости Wants= для своих юнитов к этому юниту (или multi-user.target) во время установки.
       Это лучше всего настраивается через WantedBy=graphical.target в разделе [Install] юнита.

Таким образом, содержимое вашего gdm.service объяснит ситуацию более подробно…


Ниже приведены сведения об этих двух службах на моей системе, обратите внимание на их “статический” статус…

$ systemctl status multi-user.target graphical.target

● multi-user.target - Мультипользовательская система
     Загрузка: загружено (/lib/systemd/system/multi-user.target; static)
     Активно: активно с Пн 2023-09-04 09:34:27 +03; 11 ч назад
      До: Пн 2023-09-04 09:34:27 +03; 11 ч назад
       Документы: man:systemd.special(7)

04 сентября 09:34:27 kubuntu systemd[1]: Достигнута цель multi-user.target - Мультипользовательская система.

● graphical.target - Графический интерфейс
     Загрузка: загружено (/lib/systemd/system/graphical.target; static)
     Активно: активно с Пн 2023-09-04 09:34:27 +03; 11 ч назад
      До: Пн 2023-09-04 09:34:27 +03; 11 ч назад
       Документы: man:systemd.special(7)

04 сентября 09:34:27 kubuntu systemd[1]: Достигнута цель graphical.target - Графический интерфейс.
$ systemctl cat multi-user.target graphical.target

# /lib/systemd/system/multi-user.target
#  SPDX-License-Identifier: LGPL-2.1-or-later
#
#  Этот файл является частью systemd.
#
#  systemd является свободным программным обеспечением; вы можете перераспределять и/или модифицировать его
#  в соответствии с условиями GNU Lesser General Public License, опубликованной
#  Free Software Foundation; либо версии 2.1 Лицензии, либо
#  (по вашему выбору) любой более поздней версии.

[Unit]
Description=Мультипользовательская система
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

# /lib/systemd/system/graphical.target
#  SPDX-License-Identifier: LGPL-2.1-or-later
#
#  Этот файл является частью systemd.
#
#  systemd является свободным программным обеспечением; вы можете перераспределять и/или модифицировать его
#  в соответствии с условиями GNU Lesser General Public License, опубликованной
#  Free Software Foundation; либо версии 2.1 Лицензии, либо
#  (по вашему выбору) любой более поздней версии.

[Unit]
Description=Графический интерфейс
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
$ ls -la /lib/systemd/system/{multi-user,graphical}.target
-rw-r--r-- 1 root root 606 26 янв 2023 /lib/systemd/system/graphical.target
-rw-r--r-- 1 root root 540 26 янв 2023 /lib/systemd/system/multi-user.target

Ответ или решение

Понимание Статуса Индиректных Юнитов в systemd

Введение

Вопрос о том, как проверить, какой юнит активирует другой с состоянием "indirect" в systemd, вызывает интерес у многих системных администраторов и пользователей Linux. В данном ответе мы подробно рассмотрим эту тему, особенно в контексте ваших систем, работающих на Arch с GNOME и Debian.

Понятие состояния "indirect"

Статус "indirect" в systemd означает, что юнит активируется не напрямую другим юнитом, а через зависимость. Этот статус обычно наблюдается для целевых юнитов (targets), которые используются для агрегирования других юнитов. Например, graphical.target включает в себя multi-user.target, однако graphical.target сам по себе не может быть включен прямо.

Сравнение системы Debian и Arch

Вы правильно отметили, что на вашем Debian сервере юниты multi-user.target и default.target видны как "enabled", в то время как на Arch это так не работает, хотя оба десктопа активны. Чтобы понять, почему это так, давайте рассмотрим ваши команды и их вывод:

  1. Проверка юнитов:

    systemctl list-unit-files --type=target --state=enabled

    На Debian вы видите ожидаемые юниты, тогда как на Arch — нет.

  2. Статус целевых юнитов:

    systemctl status multi-user.target graphical.target

    Оба юнита на Arch показывают статус "static", что указывает на то, что они не могут быть активированы напрямую.

Как работает активация в systemd?

Как указано в мануале man systemd.special, graphical.target служит специальным целевым юнитом для настройки графического экрана входа. Он активирует multi-user.target и требует наличия графического менеджера. То, что вы можете наблюдать в конфигурациях, — это зависимости:

  • Wants=display-manager.service в graphical.target указывает на то, что при активации графического интерфейса должен быть активирован менеджер дисплеев.
  • multi-user.target по умолчанию требует basic.target, что делает его взаимозависимым.

Как узнать, какой юнит активирует другой?

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

systemctl list-dependencies graphical.target

Эта команда покажет вам, какие юниты зависят от graphical.target. В вашем случае вы видите, что gdm.service и multi-user.target являются зависимыми юнитами.

Если в юните gdm.service отсутствуют директивы Also=, это не означает, что он не может быть активирован; это просто значит, что он не добавляет прямых зависимостей к другим целевым юнитам. Важно понимать, что наличие Wants= и Requires= в секции [Unit] в конфигурации юнетов управляет автозагрузкой.

Причины использования "indirect"

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

Заключение

Основная причина, по которой вы видите разницу в активации юнитов на системах Debian и Arch, — это конфигурация и организация юнитов в systemd. Использование состояний "indirect" играет ключевую роль в управлении услугами в Linux, позволяя создать эффективную и организованную иерархию зависимостей юнитов. В дальнейшем, для большей ясности, всегда полезно проверять описания юнитов и их зависимости через systemctl cat <unit-name> и systemctl list-dependencies <unit-name>.

Понимание этой системы поможет вам лучше управлять службами в ваших дистрибутивах Linux.

Оцените материал
Добавить комментарий

Капча загружается...