拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Win10 WSL2 Ubuntu 22.04 图形桌面搭建:xrdp方案

Win10 WSL2 Ubuntu 22.04 图形桌面搭建:xrdp方案

1. 先想清楚:为什么要在Win10上给WSL2配图形桌面

老实讲,我第一次听到“WSL2跑图形桌面”这个需求时,脑子里第一反应是:这不是脱裤子放屁吗?Windows本身就有桌面,为啥非要在Linux子系统里再套一层图形界面?后来真接手了一个跨平台开发的活儿,才发现这事儿有它的刚需场景。

简单说,这套组合就是在Windows 10里通过WSL2运行一个Ubuntu 22.04,并且给它配上可视化的桌面环境,让你不用装双系统、不用开笨重的虚拟机,就能在Windows里直接操作一个带窗口、带任务栏、能拖拽文件的Linux桌面。它能解决什么问题?比如你要调试Linux下的GUI程序、要跑一些只在Linux图形环境下才能测试的工具链、要学ROS(机器人操作系统,它对图形化环境依赖很重),或者单纯就是想在一个窗口里同时用Linux桌面和Windows桌面,来回切换不折腾。

适合谁来参考?三类人:一是刚接触Linux、被命令行吓到的新手,有个图形界面过渡会友好很多;二是做嵌入式、算法、机器人方向、需要Linux GUI工具链的开发者;三是喜欢折腾、想搞明白WSL2底层机制的技术爱好者。如果你只是想跑个命令行脚本、跑Python,那说实话不配图形桌面也够用,别为了配而配。

我自己前后装过至少五六个不同配置的环境,踩过的坑能写一页纸。这篇文章就把整个链路从“Win10前提检查”到“桌面能正常用”完完整整走一遍,参数为什么这么选、哪一步容易挂、挂了怎么救,我都按实际经历讲。

2. 动手前的硬性前提:Win10版本、虚拟化与磁盘

2.1 确认你的Win10版本够不够格

WSL2不是随便什么Win10都能跑的。我见过太多人卡在第一步——命令敲下去报错说版本不支持。硬性门槛是这样的:

项目最低要求推荐配置
Windows版本Win10 2004(内部版本19041)Win10 21H2 及以上 / LTSC 2021
CPU架构x86_64支持虚拟化的多核
内存4GB8GB 以上
磁盘可用空间20GB40GB 以上(SSD)
虚拟化BIOS中开启Intel VT-x / AMD-V 均开

查看方法很简单,按Win + R,输入winver回车,弹出的窗口会告诉你版本号和内部版本。如果内部版本低于19041,那就得先升级系统,否则后面wsl --install会直接给你甩脸色。

提示:LTSC 2021 这个长期服务版是很多开发者的心头好,它自带较少的后台应用,装WSL2完全没问题,但要注意它默认可能没开一些可选功能,需要手动在“启用或关闭Windows功能”里勾上。

2.2 虚拟化没开,一切都白搭

这是新手最容易翻车的地方。WSL2本质上是跑在一个轻量级虚拟机上的,所以它强依赖CPU虚拟化。如果你在BIOS里没开虚拟化,运行时会提示“因为此计算机上未启用虚拟化。请确保计算机固件设置中‘虚拟机平台’已启用”,这类报错我见过不下十次。

任务管理器 → 性能 → CPU,右下角有一行“虚拟化:已启用/已禁用”。如果是“已禁用”,那就得重启进BIOS(或UEFI),找到Intel Virtualization Technology、Intel VT-x、SVM Mode(AMD)这类选项,把它改成Enabled。不同主板叫法不一样,华硕一般在 Advanced → CPU Configuration,联想笔记本一般在 Configuration 里。

顺手把Windows功能也开一下:控制面板 → 程序和功能 → 启用或关闭Windows功能,勾选“适用于Linux的Windows子系统”和“虚拟机平台”,然后重启。新版Win10其实用一条命令就能自动搞定,但手动确认一遍更保险。

2.3 别忽略磁盘和内存的账

WSL2有个“坏习惯”——它默认会吃掉系统盘一半的内存做虚拟机内存上限,还可能把虚拟磁盘文件(ext4.vhdx)撑到几十个G。我有个朋友C盘只剩5G就开始装,结果装到一半系统卡死,这种亏吃一次就够。

安装前建议:C盘至少留出30G,最好用SSD(机械盘跑WSL2的IO体验会让你怀疑人生)。另外,如果你的C盘本来就紧张,可以后面通过.wslconfig控制内存和交换分区,也可以把WSL2的发行版安装到其他盘(这个后面第6节细讲)。

3. WSL2安装:两条路,选对省半天

3.1 一键安装法(适合新手)

如果你系统版本够新,微软现在提供了一条龙命令。以管理员身份打开PowerShell或CMD,输入:

wsl --install

它会自动开启所需功能、下载内核、并把默认的Ubuntu发行版装上。想指定Ubuntu 22.04,可以:

wsl --install -d Ubuntu-22.04

执行完重启电脑,开机后会自动弹出Ubuntu终端让你设置用户名和密码。这条路最省事,缺点是可视化进度少,网络不好时下载慢你还看不见具体卡在哪。

3.2 手动安装法(适合网络不稳、想掌控全局)

我更常用手动的方式,因为能看到每一步。

第一步,开启功能:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

第二步,下载并安装WSL2 Linux内核更新包(微软官网搜“WSL2 Linux 内核更新包”就有msi),装完重启。

第三步,把默认版本设为2:

wsl --set-default-version 2

第四步,装发行版。可以从微软商店搜“Ubuntu 22.04”点安装,也可以用离线包。离线包的好处是不依赖商店,导入命令是:

wsl --import Ubuntu-22.04 D:\wsl\ubuntu2204 D:\download\ubuntu2204.tar --version 2

这条命令的意思是:把名为Ubuntu-22.04的发行版,安装到D:\wsl\ubuntu2204目录,源文件是那个tar包。这样装在D盘,C盘就不会被撑爆,是我强烈推荐的姿势。

3.3 一次性的初始化配置

装完后先确认状态:

wsl -l -v

输出的STATE要是Running或Stopped,VERSION列必须显示2。如果是1,用wsl --set-version Ubuntu-22.04 2转过来。

进入系统:

wsl -d Ubuntu-22.04

第一次进去,先换国内镜像源(可选但强烈建议,否则apt慢到哭),再更新:

sudo apt update && sudo apt upgrade -y sudo apt install -y curl wget git vim

注意:新装的Ubuntu 22.04默认没有systemd,很多服务(比如后面要用的xrdp)没法用systemctl管理。想开systemd,后面第6节专门说。

4. 图形化方案选型:X Server还是远程桌面

这一步是整个配置的核心分水岭,选错了你会觉得“图形桌面怎么这么难用”,选对了会觉得很顺。我先说清楚市面上主流的三种路子,再告诉你各自适合谁。

方案原理体验适合场景
X Server转发(VcXsrv等)只把单个GUI程序的窗口转发到Windows程序窗口独立,无完整桌面只跑个别GUI工具
远程桌面(xrdp+Windows RDP)在WSL2里跑完整桌面,通过RDP连接完整桌面体验,接近虚拟机想要真·Linux桌面
WSLg(仅Win11/新版)系统原生集成最丝滑系统支持的幸运儿

Win10的用户注意了:WSLg是Win11/22H2之后才有的原生方案,Win10系统上官方不支持,所以咱们就得走前两条路。我个人的经验是:如果你只是偶尔开个GUI程序,X Server方案足够轻;如果你要的是“一个完整的Linux桌面”,那就老老实实上xrdp。

4.1 X Server方案:VcXsrv的配置细节

VcXsrv是一个Windows端的X Server,免费开源。去官网下载安装包,一路下一步。

启动时它会弹配置向导,关键选项我按顺序说,这些参数我当时反复试过:

  • Display settings:选Multiple windows,Display number 填0。
  • Client startup:选Start no client(先别让它自动启动程序)。
  • Extra settings:这一步最重要,勾上Disable access control,否则Ubuntu连过来会被拒。另外把Clipboard相关选项勾上,方便复制粘贴。

配置界面可以点“Save configuration”存成.xlaunch文件,下次双击直接按这套配置启动,不用再一步步点。

Ubuntu侧需要设置DISPLAY环境变量,告诉GUI程序“把窗口画到哪去”。WSL2的IP会变化,所以要用动态解析:

export DISPLAY=$(grep nameserver /etc/resolv.conf | awk '{print $2}'):0

把这条写进~/.bashrc末尾,每次开终端自动生效。测试一下:

sudo apt install -y x11-apps xeyes

如果Windows上弹出一双跟着鼠标转的眼睛,恭喜,X转发通了。没弹出来,九成是VcXsrv没开、或者Disable access control没勾。

实操心得:X Server方案下,每个GUI程序是独立窗口,没有任务栏、没有桌面图标。想看文件管理器就thunar &,想开浏览器就firefox &。它本质上是“远程渲染窗口”,不是完整桌面,别指望有开始菜单。

4.2 xrdp方案:在WSL2里搭一个完整桌面

这是我更推荐的方案,因为体验最接近一台真Linux机器。思路是:在Ubuntu里装一个轻量桌面(XFCE4),再装xrdp服务,最后用Windows自带的“远程桌面连接”(mstsc)连上去。

先装桌面:

sudo apt install -y xfce4 xfce4-goodies

XFCE4比GNOME轻得多,资源占用低,WSL2里跑起来不卡。装的过程中会问你选默认显示管理器,随便选lightdm或gdm3都行,反正我们不用它。

然后装xrdp:

sudo apt install -y xrdp

这里有个大坑:xrdp默认监听3389端口,而Windows的远程桌面也可能占着3389,会冲突。所以改端口:

sudo vim /etc/xrdp/xrdp.ini

找到port=3389,改成port=3390,保存。这样Windows连3390,互不打架。

接着要告诉xrdp“连上来之后启动XFCE”:

echo "xfce4-session" > ~/.xsession

但光这样有时候会黑屏,因为xrdp的启动脚本可能优先调用lightdm。稳妥的做法是改/etc/xrdp/startwm.sh,在文件里test -x /etc/X11/Xsession之前加两行:

unset DBUS_SESSION_BUS_ADDRESS unset XDG_RUNTIME_DIR

这两行是解决“连上去黑屏、只有鼠标”的经典配方,我试了无数次,加完基本就好了。

启动服务:

sudo service xrdp start

如果系统开了systemd,也可以sudo systemctl start xrdp。想让开机自启,systemd环境下sudo systemctl enable xrdp。

最后,Windows上按Win + R输入mstsc,地址栏填localhost:3390,用户名密码就是你在Ubuntu里设的那个。第一次会弹证书警告,点“是”就行。

4.3 两种方案到底怎么选

说点实在的:如果你要的是跑一个ROS的可视化节点、看个rviz,X Server方案更省资源;如果你想要一个能开文件管理器、能截图、能用浏览器的完整桌面,果断xrdp。

我自己现在是两个都留着。平常写代码用终端,需要看GUI就用xrdp连一下完整桌面;偶尔单独开个小工具,就用VcXsrv转发单个窗口。两者可以共存,互不影响。

5. 系统级细节调优:输入法、字体与分辨率

5.1 中文显示和输入法

默认装完,Ubuntu里中文大概率是方块乱码,因为你没装中文字体。

sudo apt install -y fonts-noto-cjk fonts-wqy-zenhei sudo apt install -y language-pack-zh-hans

刷新字体缓存:

fc-cache -fv

输入法推荐fcitx5,比fcitx更现代:

sudo apt install -y fcitx5 fcitx5-chinese-addons fcitx5-frontend-gtk3

装完在XFCE的“设置 → 输入法”里把fcitx5设为默认,重启桌面环境。在xrdp连接里,输入法框架偶尔会有候选框不显示的问题,一般重启一下fcitx5服务(fcitx5 -r -d)就能缓解。

避坑:别用默认的ibus,在xrdp环境里ibus和XFCE的兼容性一言难尽,候选框位置乱飘是常事。fcitx5稳得多。

5.2 分辨率和缩放

通过xrdp连接时,默认分辨率可能很别扭,字小得看不清。在mstsc连接前点“显示选项 → 显示”,把分辨率调到跟你的显示器一致,比如1920×1080。如果字体还是小,在XFCE里调DPI:

设置 → 外观 → 字体,把DPI从96改成120左右,字就大一圈。

5.3 声音转发(可选)

xrdp默认不带声音。想在Ubuntu桌面里听到声音,需要在/etc/xrdp/xrdp.ini里启用音频模块,并配合Windows端配置。这个属于进阶需求,日常开发大多用不上,我一般直接跳过,省得增加不稳定因素。

6. 性能与稳定性:内存、磁盘、systemd三件套

6.1 用.wslconfig管住内存

WSL2默认最多能吃掉你一半物理内存。8G的机器,它可能占4G,Windows那边就卡了。解决办法是在Windows用户目录下建一个.wslconfig文件(路径:C:\Users\你的用户名\.wslconfig),内容:

[wsl2] memory=6GB processors=4 swap=2GB localhostForwarding=true

参数说明:memory限制虚拟机内存上限;processors限制CPU核数;swap是交换分区大小;localhostForwarding让WSL2里的服务能被Windows的localhost访问(很关键,xrdp就靠它)。

改完执行:

wsl --shutdown

彻底关掉再重启生效。这个操作我可以拍胸口说,是提升WSL2体验最立竿见影的一步。

6.2 把发行版挪出C盘

前面提过用--import安装到D盘。如果已经装在C盘了,也能迁移:

wsl --export Ubuntu-22.04 D:\ubuntu2204.tar wsl --unregister Ubuntu-22.04 wsl --import Ubuntu-22.04 D:\wsl\ubuntu2204 D:\ubuntu2204.tar --version 2

注意--unregister会清空原发行版的所有数据,所以导出一定要先确认成功。迁移后默认登录用户会变回root,需要改回你的用户:

ubuntu2204 config --default-user 你的用户名

6.3 开启systemd

Ubuntu 22.04的WSL默认不带systemd。想用systemctl,编辑/etc/wsl.conf:

[boot] systemd=true

保存后在Windows执行wsl --shutdown,重新进来systemctl status能输出东西就说明成了。开了systemd后,xrdp、fcitx5都能用systemctl管理,省心很多。

注意:systemd开启后启动会稍慢一点点,但换来的是服务管理的便利,我建议长期用的话一定要开。

7. 常见报错和排查:我踩过的坑都在这

7.1 报错速查表

报错信息原因解决办法
因为此计算机上未启用虚拟化BIOS虚拟化没开进BIOS开VT-x/SVM
WSL2无法启动,参考错误代码内核包没装重装WSL2内核更新包
连xrdp黑屏只有鼠标启动脚本问题改startwm.sh,unset两个变量
xeyes不弹窗DISPLAY或VcXsrv问题检查DISPLAY变量、勾选访问控制
apt更新极慢源在国外换国内镜像源
中文显示方块无中文字体装fonts-noto-cjk
端口3389被占用与Windows RDP冲突xrdp改3390
磁盘越用越大vhdx不自动收缩手动compact

7.2 那些“玄学”问题的排查思路

“连上去桌面闪一下就断”:多半是xrdp会话冲突,杀掉已有会话再连。命令是sudo pkill -u 你的用户名,或者干脆sudo service xrdp restart。

“分辨率怎么调都不对”:xrdp的分辨率由客户端决定,在mstsc里改,不是在Ubuntu里改。这个我当初绕了好久才明白。

“明明装了桌面,连上去是空白的”:检查~/.xsession和/etc/xrdp/startwm.sh两个文件,哪个配置生效取决于你的版本。我的做法是两个都配上XFCE,双保险。

7.3 vhdx磁盘瘦身

WSL2用的虚拟磁盘是“只增不减”的,删了文件它也不会自动缩小。想瘦身,在PowerShell里:

wsl --shutdown diskpart # 进diskpart后 select vdisk file="D:\wsl\ubuntu2204\ext4.vhdx" attach vdisk readonly compact vdisk detach vdisk exit

这套操作能把虚高的vhdx压回真实大小,我一般几个月做一次。

8. 我个人的使用心得与几点建议

折腾了这么多轮,有几个体会想直说。第一,别追求一步到位。有人一上来就想把桌面、输入法、声音、systemd全配齐,结果到处报错,最后怀疑人生。我的做法是先让xrdp能连上,看到桌面,再加输入法,再管性能,一步步来。

第二,Win10的用户真的不用羡慕Win11的WSLg。xrdp方案虽然要多配几步,但胜在可控、可定制、能吃住各种老硬件。我现在这台Win10 + WSL2 + XFCE的组合,日常跑数据可视化和一些Linux GUI工具,稳定得很,一年下来没重装过。

第三,.wslconfig一定要配。这是我从“抱怨WSL2卡”到“觉得WSL2挺流畅”的转折点,限制内存之后,Windows和Linux两边都舒服。

最后分享一个小技巧:如果你嫌每次export DISPLAY麻烦,又不想每次重启都重新找IP,其实较新版本的WSL2在.wslconfig里配上networkingMode=mirrored(镜像网络模式)后,可以直接用localhost当DISPLAY地址,省掉那串动态解析的命令。这个模式对老版本内核不一定支持,试之前先备份配置,能通则通,不通就用回原来那条。配置这东西,能跑通、够稳定就是好方案,别被参数主义绑架。

返回列表