wsl2下Ubuntu获得完整桌面体验(WSLg+KDE)
wsl2下Ubuntu获得完整桌面体验(WSLg+KDE)
不使用Xvnc或Xorg,本教程参考
Full desktop shell in WSL2 using WSLg (XWayland)-github
无需安装其他软件,全程在wsl2中实现


环境
windows10专业版22H2
wsl:2.6.3.0
Ubuntu:24.04.3 LTS
KDE:5(XWayland只支持这个)
前言
很久以前就在想要是能同时操作Windows和Linux而不用双系统就好了,现在通过WSL2实现了体验不错的双桌面系统,至少在我的笔记本上,wsl的体验要比在VBox或者VM强,还有显卡直通,要舒服的多。
参考了Github上的教程,但是他只做了GNOME桌面的教程,由于我的电脑分辨率是非整数倍缩放,而GNOME对于非整数倍缩放的支持异常糟糕,而且打开设置竟然要10秒以上,太臃肿了,所以我换成了KDE,写下这篇文章。
需要注意的是一旦使用了这个教程,WSLg将全权被桌面接管,无法体验Windows与linux那种无缝交互的感觉,即应用直接投影到桌面,但我觉得用任务试图分开Windows和linux也不错。
这个教程是基于XWayland(X11)的,而不是Wayland,会有一些BUG,比如非整数倍缩放时,kde的任务栏不会缩放,但是其他界面正常缩放。分辨率可能会有问题,但可以修复。
另,无法共用剪切板,因为wslg被桌面拦截导致无法拉起剪切板服务,你可能需要一些软件来实现这个功能,比如KDE Connect。可能会在26.04或者下一个wsl版本修复。
又或者你可以选择不将wslg应用拦截在系统桌面,这样体验不完整,不像是一个桌面系统,部分应用,比如在kde中打开火狐会通过wslg投影到windows而非运行在kde,体验差。
WSLg 可能无法如预期般工作,因为 Wayland 套接字对一切程序都禁用了,而且并非所有应用都能支持。但如果你想原生使用 Wayland 应用,可以用命令
exportXDG_RUNTIME_DIR=$HOME/runtime-dir 启动你的 WSLg 应用。
注意:
KDE登陆器SDDM无法唤起,只有纯Wayland环境下能唤起会话窗口,故本教程更换为lightDM。
纯Wayland教程,Github作者也写了,有一些无法实现的功能,比如无法全屏,没有登陆器,不支持从 Windows 复制粘贴剪贴板
第一步:安装 KDE Plasma + LightDM
sudoaptinstall kubuntu-desktop xwayland lightdm -y
选择lightDM
第二步:修复 WSLg 的 X11 Unix Socket
WSLg 将 X11 socket 挂载在 /mnt/wslg/.X11-unix/X0,但该路径在 /tmp/.X11-unix/ 下为只读链接。需通过 systemd 服务修复:
sudo systemctl edit --full--force wslg-fix.service [Unit]After=wslg.service [Service]Type=oneshot ExecStart=-/usr/bin/umount /tmp/.X11-unix ExecStart=/usr/bin/rm -rf /tmp/.X11-unix ExecStart=/usr/bin/mkdir -m1777 /tmp/.X11-unix ExecStart=/usr/bin/ln -s /mnt/wslg/.X11-unix/X0 /tmp/.X11-unix/X0 ExecStart=/usr/bin/chmod 0666 /mnt/wslg/runtime-dir/wayland-0.lock [Install]WantedBy=multi-user.target sudo systemctl enable--now wslg-fix.service 我们还需要移除所有对 Wayland 的引用,否则一些应用(比如 gnome 终端 )会在桌面壳层外打开(投影到windows中):
sudoln-s /dev/null /etc/systemd/user/wslg-session.service 第三步:替换 Xorg 为 XWayland 启动脚本
让显示管理器调用 Xwayland 而非传统 Xorg
sudonano /usr/bin/Xorg.Xwayland #!/bin/bashfor arg doshiftcase$argin# Xwayland doesn't support vtxx argument. So we convert to ttyxx instead vt*)set -- "$@""${arg//vt/tty}";;# -keeptty is not supported at all by Xwayland -keeptty);;# -novtswitch is not supported at all by Xwayland -novtswitch);;# other arguments are kept intact *)set -- "$@""$arg";;esacdone# Check if the runtime dir is present, and create it if notif[!-d$HOME/runtime-dir ]thenmkdir$HOME/runtime-dir ln-s /mnt/wslg/runtime-dir/wayland-0 /mnt/wslg/runtime-dir/wayland-0.lock $HOME/runtime-dir/ fi# Point the XDG_RUNTIME_DIR variable to $HOME/runtime-direxportXDG_RUNTIME_DIR=$HOME/runtime-dir # Find an available display numberfordisplayNumberin$(seq1100)do[!-e /tmp/.X11-unix/X$displayNumber]&&breakdone# Here you can change or add options to fit your needscommand=("/usr/bin/Xwayland"":${displayNumber}""-geometry""2560x1600""-fullscreen""$@") systemd-cat -t /usr/bin/Xorg echo"Starting Xwayland:""${command[@]}"exec"${command[@]}"注意分辨率设置

设置权限并激活替代方案
sudochmod +x /usr/bin/Xorg.Xwayland sudo dpkg-divert --local--add--rename /usr/bin/Xorg sudo update-alternatives --install /usr/bin/Xorg Xorg /usr/bin/Xorg.Xwayland 100X11 环境:一键写入 .xprofile 固定分辨率
nano ~/.xprofile 写入保存
xrandr --output XWAYLAND0 --mode 2560x1600 --rate59.99--primarychmod +x ~/.xprofile source ~/.xprofile 第四步:配置 LightDM自动登录(可选)
因为wslg默认读取最大分辨率,会显得登录界面小的看不清,lightDM还不和kde绑定读取统一配置文件,倒不如设置成自动登录。如果你喜欢的话可以自己设置美化。
sudonano /etc/lightdm/lightdm.conf [Seat:*] autologin-user=your_username user-session=plasma 第五步:设置默认启动目标
不设置的话,开启wsl一瞬间就会启动登陆器
sudo systemctl set-default multi-user.target 第六步:启动 KDE Plasma 桌面
sudo systemctl start graphical.target 
需要自行设置缩放,缩放除了对任务栏不生效,其它均生效(x11应用),运行起来虽然锁定60帧,但流畅程度比虚拟机强太多了,至少我按下键盘他能立马回应我,完全没有迟滞感。
第七步:关闭会话
sudo systemctl stop lightdm 第八步:修复音频
先清理无效缓存和链接
pulseaudio -k2>/dev/null rm-rf$HOME/runtime-dir/pulse rm-rf ~/.config/pulse 创建 PulseAudio 客户端配置,指向 WSLg 自带音频服务器
mkdir-p ~/.config/pulse nano ~/.config/pulse/client.conf default-server = unix:/mnt/wslg/PulseServer autospawn =yes enable-shm =false daemon-binary = /bin/true 保存
接下来完善xprofile
nano ~/.xprofile 新增
exportPULSE_SERVER=unix:/mnt/wslg/PulseServer exportPULSE_COOKIE=/mnt/wslg/PulseCookie chmod666 /mnt/wslg/runtime-dir/pulse/native 2>/dev/null 
保存退出,确保 .xprofile 执行权限正常
chmod +x ~/.xprofile 喇叭无红线,没像上面的截图一样被划掉就说明成功了
选择喇叭,勾选显示虚拟设备即可
嫌声音小可勾选提高最大音量,非常流畅舒适。

额外:显卡直通
手动创建合法的 NVIDIA 环境变量脚本
nano ~/.nvidia-env 粘贴以下内容
#!/bin/bash# NVIDIA 驱动核心环境变量(固定格式,无需修改)exportNVIDIA_DRIVER_CAPABILITIES=all exportNVIDIA_VISIBLE_DEVICES=all # 修复 PATH 环境变量(优先包含系统默认路径和 WSL NVIDIA 相关路径)exportPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:$PATH# 修复 库文件路径(NVIDIA 驱动库文件所在目录)exportLD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH给脚本添加执行权限
chmod +x ~/.nvidia-env 修正 .xprofile 文件
nano ~/.xprofile xrandr --output XWAYLAND0 --mode 2560x1600 --rate59.99--primary# 加载 NVIDIA 环境变量source ~/.nvidia-env # 修复 XDG_RUNTIME_DIR 权限(如果自定义了该目录)if[-d$HOME/runtime-dir ];thenchmod700$HOME/runtime-dir # 链接到系统默认的运行时目录(可选)ln-sf$HOME/runtime-dir /run/user/$UIDfichmod +x ~/.xprofile 重启

结语
本质上仍是RDP投影,但体验比远程桌面强太多了,至少能稳60帧。
微软越来越强了,放在一年前不用远程桌面软件,仅靠wslg是绝对实现不了的,现如今竟然有一套可行的方案,在windows上提供一个不错的完整桌面的体验,如今各种发行版也提供了wsl2版本的,我甚至看到了有人实现了arch+niri,虽然只有60帧,但有了显卡直通能做不少事,有了完整的桌面环境也比wslg的投影强了不少,虽然本教程的方向可能不太对,但总归是能从中体会到乐趣吧。
各种问题
1.剪切板互通
暂时只能用第三方软件实现,本质是桌面系统全拦截导致wslg的剪切板服务也被拦了,除非放弃完整桌面体验,否则只能等大佬修复。
这个问题可能是kde独占,因为klipper存在,不能被底层clipper拦截,我在装gnome时候没有尝试剪切板,因为他太臃肿了。
所有GTK的桌面可能都没有kde这种QT在wslg下体验好,毕竟是rdp协议,全量重绘还是不适合。希望微软能换一个协议。
2.快捷键优先被windows拦截
- 修改注册表,降低windows的优先级。
- AutoHotkey设置在wslg窗口Win 键交给 KDE,在其他 Windows
窗口中时,Win 键保留 Windows 功能 - 修改快捷键,不与windows冲突即可。
3.音频问题
已修复,可能存在其它修复方式。
4.桌面如果有文件或者图片,进入后桌面会卡顿一会儿,但不耽误其它程序运行
可能是由图标缓存引起,毕竟是虚拟盘。
也可能是Baloo 索引服务引起的,每次重启都扫描重建。
未修复
待补充