WSL2 运行 Ubuntu 26.04 完整 GNOME 桌面(WSLg Wayland)

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 远程桌面接入方案。

验证环境

组件 版本
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场景区别:

  1. 物理机原生桌面(正常登录进 GNOME) :不需要 --devkit,原生会话直接访问显卡 DRM/KMS,直接渲染到显示器
  2. 嵌套会话(在你当前桌面里,弹出一个窗口,窗口里面跑一套完整 GNOME Shell) :必须 --devkit,这就是你这个 override 配置干的事
  3. --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 会按以下顺序挑选渲染器:

  1. Vulkan(在 WSL 上经常是 Mesa 的 d3d12 / Dozen)
  2. OpenGL / GLES (同样经常落到 GALLIUM_DRIVER=d3d12)
  3. 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
相关推荐
暖核1 小时前
从 CentOS 到 Ubuntu24.04 运维迁移手册:命令对照表 + 实操 + 避坑
linux·运维·centos
分布式存储与RustFS1 小时前
训练集放在 RustFS 上,怎么像本地盘一样快?用 Curvine 加一层 POSIX 缓存
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
pride.li1 小时前
第12章 Python 教程-流程控制:循环结构
linux·服务器·python·算法
迷途之人不知返1 小时前
【基础IO】-5-简单理解三个标准流——stdin、stdout、stderr
linux
牛马鸡niumasi1 小时前
【Linux】进程退出
linux
北京中科新远科技1 小时前
高速光链路故障排查实战:从DOM光功率到FEC与BER
运维·服务器·网络
秋名山小白1 小时前
UI自动化-Airtest框架落地实战
运维·ui·自动化
刘胡子大叔2 小时前
Docker 容器名 ping 不通
运维·docker·容器
a5986522 小时前
Docker多开云手机,六边云独立端口隔离访问实战
android·运维·docker·容器·智能手机·云手机