WSL2 运行 Ubuntu 26.04 完整 GNOME 桌面(WSLg Wayland 实践)
本文整理自 GitHub Gist - Using full desktop shell in WSL2 using WSLg (Wayland) 中 Ubuntu 26.04 部分,结合实际验证环境整理为中文实践指南。
背景与痛点
Ubuntu 26.04 LTS 搭载的 GNOME 50 已经是 纯 Wayland 会话 ,不再支持 X11/Xorg 嵌套模式。这意味着网上针对 Ubuntu 24.04 的 --nested 方案在 26.04 上直接失效:
- GNOME 49 之后移除了
--nested参数,旧的 override.conf 会报 "Failed to find any matching session" -
- mutter 提供了新的
--devkit模式作为替代,但需要正确的 systemd service 配置
本文将介绍如何在 WSL2 + WSLg 环境下,通过gnome-shell --devkit --no-x11成功启动完整的 GNOME 桌面,并附带 RDP 远程桌面接入方案。
- mutter 提供了新的
验证环境
| 组件 | 版本 |
|---|---|
| WSLg | 1.0.73.2 |
| Ubuntu | 26.04.1 LTS |
| GNOME Shell | 50.1 (Mutter 50.1) |
第一步:安装所需软件包
1.1 更新系统
打开 Ubuntu 26.04 终端,先确保系统为最新状态:
bash
sudo apt update
sudo apt upgrade
1.2 安装 GNOME 桌面环境
安装轻量版桌面(加 --no-install-recommends 可获得精简版desktop):
bash
sudo apt install ubuntu-desktop
安装 Snap Store(应用商店):
bash
sudo snap install snap-store
1.3 安装 mutter devkit(关键)
这是 26.04 下的关键包------提供 --devkit 模式,替代旧版的 --nested。
为什么必须安装它?
因为 GNOME 49+ 已经彻底移除了
--nested参数,而mutter-dev-bin正是提供--devkit模式的核心包。如果不安装,后续第二步配置的gnome-shell --devkit --no-x11命令将无法识别--devkit参数,导致桌面启动失败。所以这一步是整个方案能否跑通的前提。
bash
sudo apt install mutter-dev-bin
第二步:配置 systemd 用户服务覆盖
2.1 创建 override 目录
bash
sudo mkdir -p /etc/systemd/user/org.gnome.Shell@.service.d/
2.2 编写 override.conf
bash
sudo nano /etc/systemd/user/org.gnome.Shell@.service.d/override.conf
粘贴以下内容:
ini
[Service]
ExecStart=
ExecStart=/usr/bin/gnome-shell --devkit --no-x11 --mode=%i
说明 :这里用 --devkit --no-x11 替代了旧方案中的 --nested,因为 GNOME 49+ 已经移除了 --nested 参数。
--no-x11,禁用 Xwayland
--devkit场景区别:
- 物理机原生桌面(正常登录进 GNOME) :不需要 --devkit,原生会话直接访问显卡 DRM/KMS,直接渲染到显示器
- 嵌套会话(在你当前桌面里,弹出一个窗口,窗口里面跑一套完整 GNOME Shell) :必须 --devkit,这就是你这个 override 配置干的事
--devkit做了什么
--devkit会启动独立mutter-devkit进程(需要安装mutter-dev-bin),它用 PipeWire 做渲染,在现有 Wayland 桌面打开一个普通窗口,窗口内部作为虚拟显示器运行一套完整 Mutter+GNOME Shell。这就是 GNOME49 替代旧 --nested 的唯一方案
2.3 重启 WSL
保存退出后,完全关闭 Ubuntu 终端窗口,然后在 Windows PowerShell 中执行:
powershell
wsl.exe --shutdown
第三步:启动 GNOME 桌面
重新打开 Ubuntu 终端,执行:
bash
XDG_CURRENT_DESKTOP=ubuntu:GNOME \
XDG_SESSION_TYPE=wayland \
gnome-session
首次启动可能需要等待几十秒到一分钟,WSLg 窗口会弹出完整的 GNOME 桌面。
3.1 配置 GSK 渲染器(关键,否则 GNOME 应用打不开)
启动桌面后,你会发现 GNOME 自带的 GTK4 应用(如文件管理器、设置、文本编辑器)可能直接打不开或闪退 。这是因为 GTK4 不直接用 Cairo 画界面,中间隔着一层 GSK(GTK Scene Kit)。默认情况下 GSK 会按以下顺序挑选渲染器:
- Vulkan(在 WSL 上经常是 Mesa 的 d3d12 / Dozen)
- OpenGL / GLES (同样经常落到
GALLIUM_DRIVER=d3d12) - Cairo(纯 CPU 绘制,不碰 GPU)
WSLg 上会直接段错误(SIGSEGV) 。常见原因是:WSL 的 D3D12 驱动不是完整的桌面 OpenGL/Vulkan,缺少 GSK 用到的特性(帧缓冲、DMA-BUF、共享内存纹理)。--devkit 嵌套出来的 Wayland 和 WSLg 的 wayland-0 对 EGL/dmabuf 的支持不一样,GTK4 仍按"有 GPU"去初始化,初始化到一半访问空指针就崩溃。Firefox 自带渲染进程,不走 GSK,所以不受影响。
解决办法是强制 GSK 使用纯 CPU 的 Cairo 渲染器,在 ~/.bashrc 中追加环境变量:
bash
echo 'export GSK_RENDERER=cairo' >> ~/.bashrc
然后重新加载配置:
bash
source ~/.bashrc
之后重新启动 GNOME 桌面,GTK4 应用即可正常打开。
GSK_RENDERER=cairo
GSK_RENDERER=gl
修改gl 需要权限
bash
ls -lh renderD128
crw-rw---- 1 root render 226, 128 Oct 16 21:11 renderD128
sudo usermod -aG render "$USER"
(不推荐修改)第四步:启用图形加速(出了问题修改)
添加 GALLIUM_DRIVER=d3d12 环境变量可以启用 D3D12 后端渲染,改善桌面动画效果。但需要注意:启用后 Snap Store(App Center)可能无法启动。
解决方案:为 Snap Store 单独去掉该变量
bash
mkdir -p ~/.local/share/applications
cp /var/lib/snapd/desktop/applications/snap-store_snap-store.desktop \
~/.local/share/applications/snap-store_snap-store.desktop
sed -i 's|^Exec=/snap/bin/snap-store %U|Exec=env -u GALLIUM_DRIVER /snap/bin/snap-store %U|' \
~/.local/share/applications/snap-store_snap-store.desktop
然后在启动 gnome-session 时加上加速变量:
不推荐使用GALLIUM_DRIVER=d3d12,会出现问题
bash
XDG_CURRENT_DESKTOP=ubuntu:GNOME \
XDG_SESSION_TYPE=wayland \
GALLIUM_DRIVER=d3d12 \
gnome-session