Вопрос или проблема
Введение
Я пытаюсь запустить 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
Вопросы:
-
Я хочу, чтобы
weston
запускался пользователемuser
вtty7
. Как я могу это сделать? -
Почему мне нужно запускать службу пользователя
mysession.target
? Это почти пустой файл!? Ничего не происходит, когда я запускаюmysession.target
, вызывая системную службуmysession.service
.
Ответ или решение
Для запуска Weston в графической сессии на TTY7 с помощью системного сервиса вы столкнулись с рядом проблем. Одна из ключевых тем вашего запроса касается причины, по которой требуется запускать почти пустой файл .target
, а именно mysession.target
.
Зачем нужен .target
файл в systemd?
Файлы .target
в системе systemd
служат для группировки и управления состояниями других юнитов. Они создают логические точки синхронизации, которые позволяют управлять множеством связанных сервисов и других юнитов как единым целым. В вашем случае, файл mysession.target
фактически обозначает некий "целевой" юнит, который объединит ваше графическое окружение и служит отправной точкой для других служб, таких как weston
.
Как работает мой файл mysession.target
?
Ваш файл mysession.target
может показаться почти пустым, но его наличие важно по нескольким причинам:
-
Синхронизация и зависимостями: Даже если файл
mysession.target
не содержит конкретных инструкций (например,BindsTo
,Requires
для каких-то юнитов), он всё равно является точкой, к которой другие юниты могут привязываться. Например, если в будущем вы захотите запустить дополнительные задачи или сервисы в рамках вашей графической сессии, вы сможете это сделать, добавив их зависимости к вашемуmysession.target
. -
Структурное разделение: Он позволяет ясно структурировать ваши сервисы и дает систему логического управления теми юнитами, которые должны быть активны или которые надо отключить, когда вы работаете в графической сессии. Пользуясь
big picture
, вы можете легче управлять состояниями сессии. -
Простая диагностика: Если у вас возникнут проблемы с запуском или управлением сессиями, наличие
.target
файла может помочь в диагностике, так как он четко отражает структуру вашей конфигурации.
Как правильно запустить Weston для пользователя на TTY7?
Чтобы запустить Weston от имени пользователя на TTY7, вам нужно удостовериться, что ваш mysession.service
действительно связывается с mysession.target
. Вам также стоит проверить следующие моменты:
-
Активируйте нужную конфигурацию:
Убедитесь, что иweston.socket
, иweston.service
работают как предполагается и что пользовательская сессия правильно настроена для работы с Wayland. Используйте команды вроде:systemctl --user status weston.socket systemctl --user status weston.service
-
Запуск через loginctl:
Убедитесь, что вы используетеloginctl
для входа в TTY7 какuser
, прежде чем запускатьweston
. Это важно для создания правильной сессии, которая может затем управлятьсяsystemd
. -
Запуск
mysession
:
Убедитесь, что вы правильно запускаете свой целевой сервис:systemctl --user start mysession.target
Если выполнение этой команды не приводит к никаким изменениям, проверьте ошибки в журнале:
journalctl --user -xe
403:
Подробнее изучив приведенные точки и исправив недочеты, вы сможете установить Weston в пользовательской сессии на TTY7. Наличие .target
файла, хоть и может казаться избыточным, обеспечивает структурную целостность системы и последовательное управление ее состояниями.