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

用 WSL 快速部署 Docker:Windows 下的轻量容器环境搭建指南

目录 为什么要使用Docker 部署 Docker 前置条件 一,使用wsl 搭建Docker需要的基础环境 一 ,开启 WSL 2 二,指定发行版安装 编辑 三,手动指定发行版安装  四,补充,搭建Docker环境,会遇到的问题,及其解决办法 五,验证安装  六,更换国内源(解决 Ubuntu 下载软件慢的问题) 一,为防止意外,提前备份 源文件 二,更新系统软件包 三,验证 WSL 版本(确认是 WSL2) 二,下载 docker安装包 一,下载 docker安装包 二,更新 wsl

By Ne0inhk
RabbitMQ: 全面安装与运维指南之从基础部署到高级配置

RabbitMQ: 全面安装与运维指南之从基础部署到高级配置

RabbitMQ 安装指南(Windows/macOS/Linux) 1 ) 核心注意事项: 1. 跨平台支持: RabbitMQ 基于 Erlang/OTP 开发,支持 Windows、Linux、macOS 系统,无需为开发环境额外配置 Linux 虚拟机或服务器。 2. 生产环境规范: 生产环境推荐使用 Linux 系统,Windows/macOS 仅适用于开发调试。 3. 官方渠道下载: 必须通过官网下载安装包,避免后门风险(例:Xcode 编译器木马事件导致 iOS 应用安全漏洞)。 2 ) 安装步骤: 1. 安装 Erlang/OTP(依赖环境): * 访问 Erlang 官网 下载对应系统版本(

By Ne0inhk
Linux 进程创建与终止全解析:fork 原理 + 退出机制实战

Linux 进程创建与终止全解析:fork 原理 + 退出机制实战

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 进程创建:fork 函数的底层逻辑与实战 * 1.1 fork 函数基础用法 * 1.2 fork 的底层工作流程 * 1.3 写时拷贝技术:父子进程的 “分离术” * 1.4 fork 的常见用法与失败场景 * 二. 进程终止:资源释放与退出机制 * 2.1 进程退出的三种场景 * 2.2 进程终止的三种方法 * 2.3 退出码:进程的 “执行结果报告” * 结尾: 前言:

By Ne0inhk

OpenClaw 系统架构分析

带你深入了解OpenClaw的架构和核心流程。 1. 架构概述 OpenClaw 采用插件化的 Gateway 控制平面架构,结合多渠道消息系统和跨平台客户端应用,构建了一个完整的个人 AI 助手生态系统。 核心架构特征 1. Gateway 控制平面: 单一 WebSocket 服务器管理所有会话、渠道和事件 2. 多渠道消息系统: 统一抽象层支持 15+ 消息平台 3. 插件化扩展: Monorepo 架构下的独立插件包 4. 跨平台客户端: CLI + macOS App + iOS/Android 节点 5. AI 代理引擎: 基于 Pi Agent 的 RPC 模式代理 6. 本地优先设计: 数据和会话本地存储,隐私可控 2.

By Ne0inhk