wsl2下Ubuntu获得完整桌面体验(WSLg+KDE)

wsl2下Ubuntu获得完整桌面体验(WSLg+KDE)

wsl2下Ubuntu获得完整桌面体验(WSLg+KDE)

不使用Xvnc或Xorg,本教程参考
Full desktop shell in WSL2 using WSLg (XWayland)-github
无需安装其他软件,全程在wsl2中实现

kde
证明

环境

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 100

X11 环境:一键写入 .xprofile 固定分辨率

nano ~/.xprofile 

写入保存

xrandr --output XWAYLAND0 --mode 2560x1600 --rate59.99--primary
chmod +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/$UIDfi
chmod +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 索引服务引起的,每次重启都扫描重建。
未修复

待补充

Read more

动态规划 路径类 DP 入门:3 道经典例题(最小路径和 + 迷雾森林 + 过河卒)全解析

动态规划 路径类 DP 入门:3 道经典例题(最小路径和 + 迷雾森林 + 过河卒)全解析

文章目录 * 矩阵的最小路径和 * 迷雾森林 * 过河卒 路径类 dp 是线性 dp 的⼀种,它是在⼀个 n × m 的矩阵中设置⼀个⾏⾛规则,研究从起点⾛到终点的 ⽅案数、最⼩路径和或者最⼤路径和等等的问题。 ⼊⻔阶段的《数字三⻆形》其实就是路径类 dp。 矩阵的最小路径和 题目描述 题目解析 1、状态表示 dp[i][j]表示从[1 1]格子走到[i j]格子时,所有方案下的最小路径和。 2、状态转移方程 我们还是以最后一步来推导状态转移方程,走到最后一个格子dp[n][m]

By Ne0inhk
数据结构—顺序表超经典算法

数据结构—顺序表超经典算法

数据结构—顺序表链表经常用到的算法 * 所有题目链接 * 顺序表算法题(双指针法) * 移除元素 * 删除有序数组中的重复项 * 合并两个有序数组 * 链表算法题(快慢指针,三指针法,创建新链表法) * 移除链表元素 * 反转链表 * 链表的中间节点 * 合并两个有序链表 * 链表分割 * 链表的回文结构 * 相交链表 * 环形链表(快慢指针) * 环形链表I * 环形链表II * 代码仓库 所有题目链接 移除元素 删除有序数组中的重复项 合并两个有序数组 移除链表元素 反转链表 链表的中间节点 合并两个有序链表 链表分割 链表的回文结构 相交链表 环形链表I 环形链表II 顺序表算法题(双指针法) 移除元素 题目链接↓ 移除元素 题目讲解↓ 思路:双指针法,创建两个变量dst,src如果src指向的数据是val,src++如果src指向的数据不是val,赋值(

By Ne0inhk

深度优先搜索(DFS)详解及C++实现

深度优先搜索(DFS)详解及C++实现 一、什么是深度优先搜索(DFS)? 深度优先搜索(Depth-First Search,简称DFS)是一种用于遍历或搜索树或图的算法。其核心思想是:尽可能深地搜索图的分支,当某条分支搜索到尽头无法继续前进时,回溯到上一个节点,再选择另一条未探索的分支继续搜索,直到所有节点都被访问完毕。 可以用一个生动的比喻理解DFS:想象你走进一个迷宫,每次遇到岔路时,随机选择一条路一直走,直到走到死胡同(无法继续前进),然后沿原路返回上一个岔路,选择另一条未走过的路继续探索,直到找到出口或遍历完整个迷宫。 DFS的实现通常依赖栈(Stack)这种数据结构(手动实现时),或者直接利用递归函数调用栈(更简洁,也是最常用的方式)。递归实现的本质是将每次的节点访问和回溯过程交给函数栈来管理,无需手动维护栈结构。 二、DFS的核心特性与适用场景 1. 核心特性 * 不撞南墙不回头:优先深入探索当前分支,而非横向遍历同级节点; * 回溯思想:探索到尽头后,返回上一节点继续探索其他分支,需要记录节点访问状态(避免重复访问); * 空间复杂度:取决于

By Ne0inhk
《算法题讲解指南:优选算法-滑动窗口》--13 水果成篮

《算法题讲解指南:优选算法-滑动窗口》--13 水果成篮

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 13 水果成篮 题目链接: 编辑 题目示例: 解法(滑动窗口): 算法思路: 算法流程: C++代码演示:方法一(使用容器) C++代码演示:方法二(用数组模拟哈希表) 算法总结及流程解析: 结束语 13 水果成篮 题目链接: 题目示例: 解法(滑动窗口): 算法思路:       研究的对象是一段连续的区间,可以使用【滑动窗口】思想来解决问题。       让滑动窗口满足:窗口内水果的种类只有两种。       做法:右端水果进入窗口的时候,

By Ne0inhk