单座位环境下从锁定的KDE6 Wayland会话中以另一用户身份程序化启动带GPU访问的Gamescope/Steam及Sunshine会话的实现方法
单座位环境下从锁定的KDE6 Wayland会话中以另一用户身份程序化启动带GPU访问的Gamescope/Steam及Sunshine会话的实现方法
我之前刚好折腾过类似的单座位隔离流会话场景,结合你的amdgpu驱动、KDE6 Wayland环境,给你梳理一套可落地的方案:
一、先确认前提配置
在动手前,先确保这些基础条件已经满足:
- 目标流用户(比如我习惯叫
stream_user)已经创建,是普通用户且拥有shell权限 - 你的amdgpu驱动已经正常安装,包括用户态组件(比如发行版对应的
mesa-amdgpu-dri类包) - KDE Connect已经配置好设备配对,并且允许在锁定屏幕状态下执行命令(这个在KDE Connect的权限设置里能找到)
二、核心逻辑说明
因为是单座位环境,我们需要通过loginctl让目标用户接管当前被锁定的KDE会话占用的座位,同时确保目标用户能正常访问GPU,最后启动Gamescope+Steam+Sunshine的组合会话——这样既实现了用户隔离,又能满足游戏流的硬件需求。
三、具体实现步骤
1. 配置目标用户的GPU访问权限
amdgpu驱动下,要让普通用户访问GPU,需要把用户加入对应的权限组:
# 加入video组(核心GPU访问权限) sudo usermod -aG video stream_user # 加入render组(Wayland/OpenGL渲染权限) sudo usermod -aG render stream_user
配置完后,切换到stream_user执行glxinfo | grep "OpenGL renderer",能看到amdgpu的设备名称就说明权限配置成功了。
2. 编写会话启动脚本
创建一个可执行脚本,作为KDE Connect的触发入口,路径比如/usr/local/bin/start_stream_session.sh:
#!/bin/bash # 替换成你的目标流用户名 TARGET_USER="stream_user" # 通常单座位环境下座位ID是seat0,可根据实际情况调整 SEAT_ID="seat0" # 1. 获取当前锁定会话的ID(确保操作的是正确的会话) CURRENT_SESSION=$(loginctl list-sessions --seat $SEAT_ID | grep -v "SESSION" | awk '{print $1}') # 2. 再次锁定当前会话(双重保险,避免误操作) loginctl lock-session $CURRENT_SESSION # 3. 清理目标用户的残留会话(防止冲突) loginctl terminate-user $TARGET_USER 2>/dev/null # 4. 启动目标用户的独立会话,加载Gamescope、Steam和Sunshine su - $TARGET_USER -c " export XDG_SEAT=$SEAT_ID export XDG_RUNTIME_DIR=/run/user/$(id -u $TARGET_USER) # 启动全屏Gamescope并加载Steam大模式 gamescope -e -f -- steam -bigpicture & # 延迟启动Sunshine,确保Gamescope会话初始化完成 sleep 7 # 后台启动Sunshine服务 sunshine & "
给脚本添加执行权限:
sudo chmod +x /usr/local/bin/start_stream_session.sh
3. 配置sudo免密权限
因为KDE Connect运行在你的普通用户下,而脚本需要执行loginctl、su这类需要root权限的操作,所以要配置sudo免密:
用visudo编辑sudoers文件(不要直接编辑/etc/sudoers),添加一行:
你的普通用户名 ALL=(ALL) NOPASSWD: /usr/local/bin/start_stream_session.sh
替换你的普通用户名为你日常使用的KDE用户名,保存退出即可。
4. 配置KDE Connect触发命令
打开KDE Connect的设备设置,进入「命令」选项卡,添加一个新命令:
- 名称:启动流会话
- 命令:
sudo /usr/local/bin/start_stream_session.sh - 勾选「允许在锁定屏幕上执行」的选项(不同版本KDE Connect的选项位置可能略有不同,找权限相关的设置即可)
四、关键注意事项
- 座位切换与恢复:目标用户接管座位后,你的KDE会话会被后台挂起(已经锁定,安全有保障)。如果要恢复原会话,只需结束目标用户的Gamescope/Steam会话,或者执行
loginctl activate 你的会话ID(会话ID可以用loginctl list-sessions查看) - Sunshine配置:要在
stream_user下提前配置好Sunshine,比如设置捕获源为Gamescope的输出、开启GPU加速——因为已经配置了GPU权限,Sunshine应该能正常识别amdgpu设备 - 权限排查:如果遇到GPU访问失败,可以检查
/dev/dri下的设备权限,确保video和render组有读写权限;临时测试可以用sudo chmod 666 /dev/dri/card0,但长期建议用用户组的方式 - 脚本调整:脚本里的
sleep 7时间可以根据你的机器性能调整,确保Gamescope和Steam完全启动后再启动Sunshine,避免捕获失败
备注:内容来源于stack exchange,提问作者thermalbit




