wsl2配置使用gui
上一级页面:index-wsl
前言
代码环境放到wsl2里,所有开发环境也放到 wsl2 里,界面通过 x server 传到 win10,让你获得丝滑开发体验。这样的开发方针至今没出过什么幺蛾子(除了输入法麻烦了点)
X Server有多个,我比较建议vcxsrv(名字记忆:vc x server),因为其功能和操作比较简单。
效果图
众所周知,WSL 2开始使用真正的Linux内核,所以理论上来说,我们已经可以在WSL 2运行几乎所有的Linux程序,包括带有GUI的Linux程序。但是目前来说,由于第一方X11 Server的缺失,WSL 2主要还是在命令行中使用。
Build 2020上,微软已经宣称开始做WSL 2的GUI支持,并已经给出了宣传图。
但是,事实上,借助X11 Forwarding,我们现在已经可以做到类似的效果了。
如果你之前折腾过在WSL上跑GNOME等各种桌面环境,则这篇文章的原理和那些文章是一致的,但是由于不需要启动桌面环境,其使用更加方便,各种Linux程序窗口和Windows的集成更加无缝,个人认为实用性比启动一个Linux桌面环境再在里面启动程序更强。
下图为跑在WSL 2上的IDEA、通过IDEA启动的JavaFX程序与Windows计算器共存的截图,注意看到状态栏上的窗口图标的IDEA图标,完美与Windows进行兼容。
什么是X11 Forwarding技术
X Window是目前Linux上使用得最为广泛的窗口系统。虽然它有各种各样的问题(包括不支持多个显示器不同DPI的硬伤),我在使用Linux桌面的时候也经常推荐Wayland作为代替,但是其X11 Forwarding的特性是相当的有用。
在X11系统中,显示GUI的程序(Client,包括各种浏览器、IDE等的程序)和用于真正负责显示、以及捕捉键盘、鼠标等输入的服务器(Server)是分离的,且二者之间通过网络通信的。
对于普通的Linux系统,其Server和Client是跑在一台机器上的。但是,由于二者之间是通过网络进行通信的,所以X11窗口系统不需要Server和Client运行在同一台机器上。
所以,我们可以在其他电脑(甚至不需要是Linux)上跑一个X Server,然后通过配置DISPLAY环境变量,让X Client和位于网络上的X Server相连,就能让在一台电脑上运行的程序的GUI显示在另一台电脑上。
这就是X11 Forwarding,将一台电脑的程序的GUI Forward到另一台电脑上去显示。
WSL2配置X11 Forwarding
X11 Forwarding的配置其实很简单。其分为两个大部分:Server端和Client端
对应关系是:Windows端(Server端)和WSL端(Client端)。
在Windows端需要安装和配置一个X Server。
在wsl端则主要需要:
- 设置DISPLAY变量
- 配置字体等GUI相关的设置
windows端配置
X Server有多个,我比较建议vcxsrv(名字记忆:vc x server),因为其功能和操作比较简单。
可以从上面给的github链接进行安装,也可以通过scoop进行安装,scoop安装命令如下:
scoop install vcxsrv
安装成功后,在开始菜单或者其他启动器启动新安装的XLaunch,会弹出一个向导以配置X Server的属性。在一步选择Multiple windows,第三步选择Disable access control,其他不变。
注:关于Disable access control
- 如果您的 X 服务器可从开放的互联网访问,请不要勾选或使用此选项。它使得任何人都可以观看X会话中发生的事情。
- 如果你有一个内部网,并且你想跨计算机弹出窗口而不打扰身份验证,那么它很有用。
第一步:选择Multiple windows
第二步:什么都不改动,直接点击下一步
第三步:取消勾选Native opengl
,并且勾选Disable access control
第四步:点击save configuration,然后点击确定以启动
最后在状态栏可以看到一个新的图标,鼠标悬浮上去可以看到其地址,其格式是{电脑的hostname}:{地址}
,记住后面这个地址。例如说,下图中,其地址为0.0
。
接下来给出WSL端详细配置过程
wsl端安装所需依赖
因为我们用Windows端做服务器端,我们不需要在wsl2中安装xserver服务器端,(xserver-xorg 和xinit)
wsl2端的xserver-xorg 和xinit安装后也不能正常使用
安装x11-xserver-utils,它包含xhost +、xrdb等常用命令。
xhost用于获取显示的权限(命令为xhost +
)
并且可以通过x11-xserver-utils拉取大部分图形界面所需的依赖
sudo apt install x11-xserver-utils
# screen能够新建一个screen,
# 使用方法:直接在终端输入screen并回车
sudo apt install screen
wsl端配置环境变量
- 设置DISPLAY变量
- 配置字体等GUI相关的设置
使用xclock测试是否能够正常使用
可以安装一个简单的X程序来初始化,并验证X11环境是否已经配置成功:如xclock,
sudo apt install x11-apps #包含xclock
安装之后,在确认DISPLAY变量已经设置后,输入
xclock
若弹出一个时钟窗口,则配置成功。
解决报错
Warning: Missing charsets in String to FontSet conversion
根源
- 不正确的区域设置环境变量。
诊断步骤
- 检查错误日志
- 使用以下命令检查用户的设置:
locale
解决方案:首先设置一个默认LC_ALL 。
如果你使用bash,修改/etc/environment
(bash的环境变量配置文件),添加全局的环境变量
vim /etc/environment
如果你使用zsh,有类似的profile
文件,见zsh的环境变量的加载-zprofile-zlogin-zshrc-zshenv
vim /etc/zsh/zshenv
如果你使用WSLg,应当在一个nologin 全用户生效的配置文件下进行配置
vim /etc/zsh/zshenv
具体内容如下:
export LC_ALL=C
在用户运行时可以手动指定LC_ALL,如果不指定则使用默认设置:
export LC_ALL=C
检查是否解决问题:
locale
使用方式
以后重启电脑后,只需要重新启动系统,然后在WSL中输入命令启动GUI程序即可使用。
一些细节
- x server的剪贴板和Windows剪贴板是同步的,可以自由地双向复制粘贴(这是由Windows端的x server自带的功能,由你选择的xserver 发行版决定)
- vcxsrv适配了高DPI,但在高分屏上使用会模糊
缺陷和解决方案--高分辨率屏上会有文字模糊等
这样的解决方案虽然看上去很完美,但是有一些限制,但是可用性也非常高了:
- 无法隐藏丑陋的标题栏,无解
- 无法直接调用Windows的输入法,需要在Linux下配置linux输入法,解决方案见linux-安装中文输入法
- 有可能仍然遇到字体问题(如在现在的情况下编译JavaFX程序),安装完一整套字体、正确设置
/etc/locale.gen
之后即可修复。解决方案见linux-修改系统默认语言为中文 - 高分辨率屏上会有文字模糊,解决方案见wsl2-解决高分辨率屏的模糊问题
延伸和总结
这套配置也不仅限WSL,任何虚拟机和远端电脑上的Linux应用程序均可以使用SSH和X11 Forwarding进行连接。
使用SSH和X11 Forwarding可以解决很多远程桌面相关的问题。
我们很多时候使用虚拟机安装Linux系统,其实并不是要使用Linux的桌面环境,而是使用Linux的命令行和一些GUI程序。
对于命令行程序,使用SSH完全可以解决;
而对于GUI程序,我们也可以通过这篇文章介绍的X11 Forwarding来解决。
和正常的连接到Linux再进行操作相比,SSH和X11 Forwarding的优势其实很明显:
- 避免进入Linux的GUI环境,而可以在我们熟悉的Windows/macOS环境下使用Linux的各种功能
- 避免配置Virtualbox Guest软件、Hyper-V的Enhanced Session等虚拟机的增强软件
- 由于避开了图形界面的模拟,SSH和X11 Forwarding也通常有更好的性能
对于WSL来说,目前的解决方案仍然有一些限制,但是我们可以发现在Build 2020上的效果图已经没有的标题栏,说明微软也正在解决一些X11和Windows集成的问题。相信当微软的X11集成正式发布时,我们在Windows上使用Linux程序的体验,可能比在Linux上使用Linux程序更好了。
xserver服务器端和用户端是在一台linux主机的,该如何操作?
我们使用Windows端作为服务器端,故在linux端不再需要安装xserver
但原生的linux(非wslg)服务器端和用户端是在一台主机的,
下面给出对应的配置,这些配置在WSL2中不需要设置
apt install xserver-xorg # xserver 服务器端,WSL2不需要这个
安装xorg-xinit,这个是搭配xserver-xorg用的
sudo apt install -y xinit # WSL2不需要这个
xorg-xinit
有一个默认的.xinitrc
文件,它需要你手动cp
一次进行初始化:
cp /etc/X11/xinit/xinitrc ~/.xinitrc
如果你手动cp
一次,进行初始化,下面的内容不需要再加:
编辑~/.xinitrc
,
vim ~/.xinitrc
[ -f ~/.Xresources ](%20-f%20~/.Xresources%20) && xrdb -merge -I$HOME ~/.Xresources
参考、引用、致谢
如何优雅的在Windows 10上装X [Lainme's Blog]