Вопрос или проблема
Интересно, как я могу проверить, какая единица активирует другую с состоянием “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 это так не работает, хотя оба десктопа активны. Чтобы понять, почему это так, давайте рассмотрим ваши команды и их вывод:
-
Проверка юнитов:
systemctl list-unit-files --type=target --state=enabled
На Debian вы видите ожидаемые юниты, тогда как на Arch — нет.
-
Статус целевых юнитов:
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.