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 终端,先确保系统为最新状态:
sudoaptupdatesudoaptupgrade1.2 安装 GNOME 桌面环境
安装轻量版桌面(加--no-install-recommends可获得精简版desktop):
sudoaptinstallubuntu-desktop安装 Snap Store(应用商店):
sudosnapinstallsnap-store1.3 安装 mutter devkit(关键)
这是 26.04 下的关键包——提供--devkit模式,替代旧版的--nested。
为什么必须安装它?
因为 GNOME 49+ 已经彻底移除了
--nested参数,而mutter-dev-bin正是提供--devkit模式的核心包。如果不安装,后续第二步配置的gnome-shell --devkit --no-x11命令将无法识别--devkit参数,导致桌面启动失败。所以这一步是整个方案能否跑通的前提。
sudoaptinstallmutter-dev-bin第二步:配置 systemd 用户服务覆盖
2.1 创建 override 目录
sudomkdir-p/etc/systemd/user/org.gnome.Shell@.service.d/2.2 编写 override.conf
sudonano/etc/systemd/user/org.gnome.Shell@.service.d/override.conf粘贴以下内容:
[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 中执行:
wsl.exe--shutdown第三步:启动 GNOME 桌面
重新打开 Ubuntu 终端,执行:
XDG_CURRENT_DESKTOP=ubuntu:GNOME\XDG_SESSION_TYPE=wayland\gnome-session首次启动可能需要等待几十秒到一分钟,WSLg 窗口会弹出完整的 GNOME 桌面。
gnome-control-center(ubuntu 设置)
gnome-control-center13:45:30.6650 Adwaita[9265]: WARNING: The resource style-dark.css is deprecated and shouldn't be used anymore. Use style.css with media queries instead. 13:45:30.6651 Adwaita[ 9265]: WARNING: The resource style-hc.css is deprecated and shouldn't be used anymore. Use style.css with media queries instead.13:45:55.7088 cc-wwan-panel[9265]: WARNING: Error connecting to ModemManager: Error calling StartServiceByNamefororg.freedesktop.ModemManager1: Failed to activateservice'org.freedesktop.ModemManager1':timed out(service_start_timeout=25000ms)libEGL warning: failed to get driver nameforfd-1libEGL warning: MESA-LOADER: failed to retrieve device information libEGL warning: failed to get driver nameforfd-1MESA: error: ZINK: failed to choose pdev libEGL warning: egl: failed to create dri2screen打开会出现错误及timeout, 需要关闭 SIM / 蜂窝模块(因为没有这两个模块)
sudosystemctl disable--nowModemManager.servicesudosystemctl mask ModemManager.service#不应开启等待sudosystemctl unmask ModemManager.service3.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中追加环境变量:
echo'export GSK_RENDERER=cairo'>>~/.bashrc然后重新加载配置:
source~/.bashrc之后重新启动 GNOME 桌面,GTK4 应用即可正常打开。
GSK_RENDERER=cairo
GSK_RENDERER=gl
修改gl 需要权限
ls-lhrenderD128 crw-rw----1root render226,128Oct1621:11 renderD128sudousermod-aGrender"$USER"(不推荐修改)第四步:启用图形加速(出了问题修改)
添加GALLIUM_DRIVER=d3d12环境变量可以启用 D3D12 后端渲染,改善桌面动画效果。但需要注意:启用后 Snap Store(App Center)可能无法启动。
解决方案:为 Snap Store 单独去掉该变量
mkdir-p~/.local/share/applicationscp/var/lib/snapd/desktop/applications/snap-store_snap-store.desktop\~/.local/share/applications/snap-store_snap-store.desktopsed-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,会出现问题
XDG_CURRENT_DESKTOP=ubuntu:GNOME\XDG_SESSION_TYPE=wayland\GALLIUM_DRIVER=d3d12\gnome-session设置中Remote Login unlock点击无反应
因为 Polkit 在远程会话(RDP、WSL 桌面等)下对管理员操作有额外限制,认证弹窗无法正常弹出
sudotee/etc/polkit-1/rules.d/50-allow-remote-admin.rules<<'EOF' polkit.addRule(function(action, subject) { if (subject.isInGroup("sudo")) { return polkit.Result.AUTH_ADMIN_KEEP; } }); EOF#重启 polkitsudosystemctl restart polkit#更彻底(推荐)wsl--shutdown