- Вопрос или проблема
- Это требует физического доступа с клавиатурой
- Разрешение входа через VT или SSH как обычный пользователь
- Ответ или решение
- Как запустить Weston как пользователя с помощью systemd-сервиса в Debian Bullseye
- Шаг 1: Подготовка системы
- Шаг 2: Создание пользовательского сервиса systemd
- 2.1 Файл сокета для Weston
- 2.2 Файл сервиса для Weston
- Шаг 3: Настройка окружения
- Шаг 4: Перезагрузка и запуск сервиса
- Шаг 5: Устранение неполадок
- Дополнительные шаги
- Заключение
Вопрос или проблема
Я использую Debian Bullseye. Я хотел бы запустить Weston как пользователь из сервисов systemd. Мне нужен стандартный drm бекенд, поэтому я предполагаю, что его нужно запускать от имени root, используя weston-launch. Однако я пробовал несколько конфигураций и не могу заставить его работать. В настоящее время я пытаюсь использовать weston-launch, но получаю следующую ошибку:
Дата: 2023-02-16 CET
[14:32:56.381] weston 9.0.0
https://wayland.freedesktop.org
Сообщения об ошибках отправлять по адресу: https://gitlab.freedesktop.org/wayland/weston/issues/
Сборка: 9.0.0
[14:32:56.381] Командная строка: /usr/bin/weston --log=/tmp/weston.log
[14:32:56.381] ОС: Linux, 5.10.52-gba9ade6851ca-dirty, #1 SMP PREEMPT Чт Фев 16 10:37:31 UTC 2023, aarch64
[14:32:56.381] Используется файл конфигурации '/etc/xdg/weston/weston.ini'
[14:32:56.382] Окно перерисовки вывода максимум 16 мс.
[14:32:56.382] Загрузка модуля '/usr/lib/aarch64-linux-gnu/libweston-9/drm-backend.so'
[14:32:56.388] инициализация drm бекенда
[14:32:56.393] logind: не удается взять управление над сессией 8
[14:32:56.394] logind: не удается настроить вспомогательную программу systemd-logind (-5), используется устаревший резервный вариант
[14:32:56.397] используется /dev/dri/card1
[14:32:56.397] DRM: поддерживает атомарную настройку режимов
[14:32:56.397] DRM: не поддерживает модификаторы GBM
[14:32:56.397] DRM: поддерживает соотношение сторон изображения
[14:32:56.398] Загрузка модуля '/usr/lib/aarch64-linux-gnu/libweston-9/g2d-renderer.so'
/lib/systemd/system/weston.service:
[Unit]
Description=Композитор Weston Wayland (на tty7)
RequiresMountsFor=/run
[email protected] plymouth-quit.service
After=systemd-user-sessions.service [email protected] plymouth-quit-wait.service
[Service]
User=root
PermissionsStartOnly=true
# Вход через PAM, чтобы мы получили нашу среду XDG и
# чтобы с нами обращались как с вошедшими в систему, так что мы можем использовать tty:
PAMName=login
# Захват tty7
UtmpIdentifier=tty7
TTYPath=/dev/tty7
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
# stderr в журнал, чтобы наше логирование не попадало в /dev/null
StandardOutput=tty
StandardInput=tty
StandardError=journal
EnvironmentFile=-/etc/default/weston
# Weston не может успешно изменить VT, и systemd не помещает нас на
# VT, который он только что активировал для нас. Переключаем вручную:
ExecStartPre=/bin/chvt 7
ExecStart=/usr/bin/weston-launch --tty /dev/tty7 --user tavla-run -- --log=/var/log/weston.log $OPTARGS
IgnoreSIGPIPE=no
[Install]
WantedBy=multi-user.target
/etc/profile.d/weston.sh:
if test -z "$XDG_RUNTIME_DIR"; then
export XDG_RUNTIME_DIR=/run/user/`id -u`
if ! test -d "${XDG_RUNTIME_DIR}"; then
mkdir --parents "${XDG_RUNTIME_DIR}"
chmod 0700 "${XDG_RUNTIME_DIR}"
fi
fi
/etc/xdg/weston/weston.ini:
[core]
#gbm-format=argb8888
idle-time=0
use-g2d=1
xwayland=true
#drm-device=card0
repaint-window=16
#enable-overlay-view=1
#[shell]
#size=1920x1080
[libinput]
touchscreen_calibrator=true
#[output]
#name=HDMI-A-1
#mode=1920x1080@60
#transform=rotate-90
#[output]
#name=HDMI-A-2
#mode=off
# WIDTHxHEIGHT Размер разрешения ширина и высота в пикселях
# off Отключает вывод
# preferred Использует предпочтительный режим
# current Использует текущий режим контроллера crt
#transform=rotate-90
[screen-share]
command=@bindir@/weston --backend=rdp-backend.so --shell=fullscreen-shell.so --no-clients-resize
[shell]
background-image=/usr/share/images/desktop-base/default
background-type=scale-crop
Вот краткая ссылка на документацию, описывающую именно то, что вам нужно: https://wayland.pages.freedesktop.org/weston/toc/running-weston.html#running-weston-from-a-systemd-service
Пример из документации
Это требует физического доступа с клавиатурой
Системы Debian используют /etc/systemd/user/
директорию для юнитов systemd пользователя.
/etc/systemd/user/weston.socket
[Unit]
Description=Weston, композитор 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, композитор 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
[Install]
WantedBy=graphical-session.target
После создания файлов вам нужно, чтобы systemd перезагрузил изменения, запустив systemctl --user daemon-reload
Если ничего не создает сеансов входа на машине, вам нужно войти физически, и для запуска weston выполните systemctl --user start weston
Разрешение входа через VT или SSH как обычный пользователь
Этот метод требует запуска службы как обычного юнита системы systemd.
/etc/systemd/system/mysession.service
[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=mym-session.target
Before=mym-session.target
Выполнение некоторых перезагрузок и команд loginctl
# Перезагрузка конфигурации, чтобы systemd увидел это.
systemctl --user daemon-reload
sudo systemctl daemon-reload
# Запуск и тестирование службы.
sudo systemctl start mysession # systemd должен запросить пароль
loginctl # Проверьте, смогла ли mysession войти в сеанс
systemctl --user start weston
Ответ или решение
Как запустить Weston как пользователя с помощью systemd-сервиса в Debian Bullseye
Запуск Weston в виде пользовательского сервиса через systemd требует специфической настройки системы. В этом ответе я подробно изложу, как это сделать на Debian Bullseye, обеспечив корректную работу с окружением Wayland и корректные настройки доступа к устройствам.
Шаг 1: Подготовка системы
Для начала убедитесь, что у вас установлены все необходимые пакеты, такие как Weston и его зависимости. Если вы еще не установили Weston, выполните следующую команду:
sudo apt update
sudo apt install weston
Шаг 2: Создание пользовательского сервиса systemd
Создайте директорию для пользовательских настроек и создайте необходимые файлы, как указано ниже:
2.1 Файл сокета для Weston
Создайте файл /etc/systemd/user/weston.socket
:
[Unit]
Description=Weston, a Wayland compositor
Documentation=man:weston(1) man:weston.ini(5)
Documentation=https://wayland.freedesktop.org/
[Socket]
ListenStream=%t/wayland-0
[Install]
WantedBy=sockets.target
2.2 Файл сервиса для Weston
Создайте файл /etc/systemd/user/weston.service
:
[Unit]
Description=Weston, a Wayland compositor, as a user service
Documentation=man:weston(1) man:weston.ini(5)
Documentation=https://wayland.freedesktop.org/
Requires=weston.socket
After=weston.socket
[Service]
Type=notify
TimeoutStartSec=60
ExecStart=/usr/bin/weston
[Install]
WantedBy=default.target
Шаг 3: Настройка окружения
Важно настроить окружение для правильной работы Weston. Создайте скрипт /etc/profile.d/weston.sh
с содержимым:
if test -z "$XDG_RUNTIME_DIR"; then
export XDG_RUNTIME_DIR=/run/user/$(id -u)
mkdir -p "$XDG_RUNTIME_DIR"
chmod 0700 "$XDG_RUNTIME_DIR"
fi
Этот скрипт гарантирует, что у каждого пользователя будет создана соответствующая директория для выполнения приложения.
Шаг 4: Перезагрузка и запуск сервиса
После создания и настройки всех файлов, необходимо перезагрузить systemd, чтобы он увидел изменения:
systemctl --user daemon-reload
Запустите сокет и сервис Weston:
systemctl --user start weston.socket
systemctl --user start weston.service
Если вы всё сделали правильно, Weston должен начать работать без ошибок. Для проверки вы можете использовать:
loginctl list-sessions
Шаг 5: Устранение неполадок
Если Weston не запускается или возникают ошибки, проверьте логи:
journalctl --user -u weston.service
Это предоставит информацию о том, в чем именно может быть проблема.
Дополнительные шаги
Для автоматического запуска Weston при каждом входе в систему, используйте следующую команду:
systemctl --user enable weston.service
Заключение
Следуя вышеуказанным шагам, вы сможете запустить Weston как пользовательский сервис в Debian Bullseye. Правильные настройки окружения и конфигурации гарантируют стабильную работу системы. Если у вас возникли вопросы или трудности, обратитесь к официальной документации Weston или системным логам для дальнейшей диагностики.