Почему Уэстон рекомендует запускать почти пустой файл .target на системном сервисе?

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

Введение

Я пытаюсь запустить Weston при запуске. На данный момент мне удалось открыть Weston только с помощью пользователя root. Я следовал этому руководству: https://wayland.pages.freedesktop.org/weston/toc/running-weston.html#running-weston-from-a-systemd-service

Метод

Я создал файл под названием /etc/systemd/user/weston.socket

И внутри этого файла я вставил

[Unit]
Description=Weston, compositor Wayland
Documentation=man:weston(1) man:weston.ini(5)
Documentation=https://wayland.freedesktop.org/

[Socket]
ListenStream=%t/wayland-0

Затем я также создал файл под названием /etc/systemd/user/weston.service

[Unit]
Description=Weston, compositor Wayland, как служба пользователя
Documentation=man:weston(1) man:weston.ini(5)
Documentation=https://wayland.freedesktop.org/

# Активировать с использованием сокета systemd
Requires=weston.socket
After=weston.socket

# Поскольку мы являемся частью графической сессии, убедитесь, что мы запускаемся перед
Before=graphical-session.target

[Service]
Type=notify
TimeoutStartSec=60
WatchdogSec=20
# По умолчанию для журнала
#StandardOutput=journal
StandardError=journal

# добавьте ~/.config/weston.ini и weston его подхватит
ExecStart=/usr/bin/weston --modules=systemd-notify.so

[Install]
WantedBy=graphical-session.target

Я перезагрузил systemd

systemctl --user daemon-reload

И запустил его. Он работает только с пользователем root.

systemctl --user start weston

Чтобы сделать его рабочим, например, на tty7, я создал системную службу под названием /etc/systemd/system/mysession.service. Я также создал пользователя под названием user с помощью команды adduser user.

[Unit]
Description=Моя графическая сессия

# Убедитесь, что мы запускаемся после того, как разрешены входы в систему.
After=systemd-user-sessions.service

# если хотите, вы можете сделать это частью графической сессии
#Before=graphical.target

# не обязательно, но на всякий случай
#ConditionPathExists=/dev/tty7

[Service]
Type=simple
Environment=XDG_SESSION_TYPE=wayland
ExecStart=/usr/bin/systemctl --wait --user start mysession.target

# Пользователь, под которым будет запущена сессия. Выберите одного!
User=user
Group=user

# Настроить полную пользовательскую сессию для пользователя, требуемую Weston.
PAMName=login

# Нужен виртуальный терминал.
TTYPath=/dev/tty7
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes

# Не удается запуститься, если не управляет tty.
StandardInput=tty-fail

# По умолчанию для журнала, в случае если он не отрегулирует его соответствующим образом
#StandardOutput=journal
StandardError=journal

# Запишите этого пользователя в utmp, чтобы он отображался с командами 'w' и 'who'.
UtmpIdentifier=tty7
UtmpMode=user

[Install]
WantedBy=graphical.target

Затем я создал файл под названием /etc/systemd/user/mysession.target

[Unit]
Description=Моя сессия

BindsTo=mysession.target
Before=mysession.target

Я запускаю свою системную службу mysession. Ничего особенного не происходит.

systemctl start mysession

Я проверяю, есть ли у меня tty7 онлайн. Да, есть!

loginctl

Затем я запускаю weston

systemctl --user start weston

Вопросы:

  1. Я хочу, чтобы weston запускался пользователем user в tty7. Как я могу это сделать?

  2. Почему мне нужно запускать службу пользователя mysession.target? Это почти пустой файл!? Ничего не происходит, когда я запускаю mysession.target, вызывая системную службу mysession.service.

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

Для запуска Weston в графической сессии на TTY7 с помощью системного сервиса вы столкнулись с рядом проблем. Одна из ключевых тем вашего запроса касается причины, по которой требуется запускать почти пустой файл .target, а именно mysession.target.

Зачем нужен .target файл в systemd?

Файлы .target в системе systemd служат для группировки и управления состояниями других юнитов. Они создают логические точки синхронизации, которые позволяют управлять множеством связанных сервисов и других юнитов как единым целым. В вашем случае, файл mysession.target фактически обозначает некий "целевой" юнит, который объединит ваше графическое окружение и служит отправной точкой для других служб, таких как weston.

Как работает мой файл mysession.target?

Ваш файл mysession.target может показаться почти пустым, но его наличие важно по нескольким причинам:

  1. Синхронизация и зависимостями: Даже если файл mysession.target не содержит конкретных инструкций (например, BindsTo, Requires для каких-то юнитов), он всё равно является точкой, к которой другие юниты могут привязываться. Например, если в будущем вы захотите запустить дополнительные задачи или сервисы в рамках вашей графической сессии, вы сможете это сделать, добавив их зависимости к вашему mysession.target.

  2. Структурное разделение: Он позволяет ясно структурировать ваши сервисы и дает систему логического управления теми юнитами, которые должны быть активны или которые надо отключить, когда вы работаете в графической сессии. Пользуясь big picture, вы можете легче управлять состояниями сессии.

  3. Простая диагностика: Если у вас возникнут проблемы с запуском или управлением сессиями, наличие .target файла может помочь в диагностике, так как он четко отражает структуру вашей конфигурации.

Как правильно запустить Weston для пользователя на TTY7?

Чтобы запустить Weston от имени пользователя на TTY7, вам нужно удостовериться, что ваш mysession.service действительно связывается с mysession.target. Вам также стоит проверить следующие моменты:

  1. Активируйте нужную конфигурацию:
    Убедитесь, что и weston.socket, и weston.service работают как предполагается и что пользовательская сессия правильно настроена для работы с Wayland. Используйте команды вроде:

    systemctl --user status weston.socket
    systemctl --user status weston.service
  2. Запуск через loginctl:
    Убедитесь, что вы используете loginctl для входа в TTY7 как user, прежде чем запускать weston. Это важно для создания правильной сессии, которая может затем управляться systemd.

  3. Запуск mysession:
    Убедитесь, что вы правильно запускаете свой целевой сервис:

    systemctl --user start mysession.target

    Если выполнение этой команды не приводит к никаким изменениям, проверьте ошибки в журнале:

    journalctl --user -xe

403:
Подробнее изучив приведенные точки и исправив недочеты, вы сможете установить Weston в пользовательской сессии на TTY7. Наличие .target файла, хоть и может казаться избыточным, обеспечивает структурную целостность системы и последовательное управление ее состояниями.

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

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