前言
各位使用 Windows 的佬友们肯定和我一样,在 Windows 里运行 Agent 各种不得劲,用 WSL 运行 Agent 各种图形化工具的体验又很差。此文就和大家分享一下个人使用 WSL GUI 程序的小技巧,让大家蹬得更爽。
环境说明
- Window 11。
- WSL 版本:最新的 Release 或 PreRelease 版均可。
- 子系统:ArchLinux。如下文有在子系统中安装软件包的命令则仅适用于 ArchLinux,用 Ubuntu/Fedora 的佬友请自己找对应的包。
1. X11 程序 RDP 窗口优化
当我们在 WSL 中运行一个 X11 协议的 GUI 程序时,Windows 中会出现一个带白色边框的程序窗口,这个白色边框真的非常讨人厌。我们可以通过修改 WSLG 相关项目的源代码,然后构建自己的 WSLG 镜像,将白色边框消除。
我自己编译了一个可以 直接下载使用的镜像。下载后在 $HOME/.wslconfig 中添加 systemDistro=<mirror_path> 配置 ,重启 WSL 即可生效。
# 配置示例,改成自己的镜像路径
[wsl2]
systemDistro=C:\\wslg_custom\\wslg_v1.0.71_fix1.0.vhd
这个 WSLG 镜像做了如下改动:
- X11 窗口边框调整
- 点击左上角标题栏图标可在浅色/深色间切换,默认为深色。
- 替换了标题栏的图标。
- 消除左、下、右三处的白色边框。
Alt+F12 在"标题栏模式"和"无边框模式"之间切换,默认为"标题栏模式"。
Alt+F11 在窗口化和最大化之间切换。
Alt+鼠标左键 拖动调整窗口大小。
Alt+鼠标右键 拖动移动窗口。
- 支持从 Windows 剪贴板粘贴图片到 WSLg 窗口。
- 修复了 RDP 剪贴板偶尔导致程序崩溃的 bug
如果你想自己修改编译,请查阅项目的 README.md。
2. 硬件加速图形渲染
参考:https://wiki.archlinuxcn.org/wiki/在 WSL 上安装 Arch Linux#硬件加速渲染
前提:
- 独显和核显都支持硬件加速,建议 Windows 尽量安装最新的显卡驱动
- Windows 宿主机已开启 3D 加速,默认都是开了的,可以在
系统>屏幕>显示卡>高级图形设置,开启 硬件加速 GPU 计划
在 WSL 子系统中,安装相关的包:
# ArchLinux
sudo pacman -S mesa-utils vulkan-dzn vulkan-icd-loader
# 要运行 32 位应用程序则还需安装 lib32-vulkan-icd-loader
# Ubuntu
# sudo apt install -y mesa-utils
在 .bashrc 或 /etc/profile 中加入环境变量:
export GALLIUM_DRIVER=d3d12
export LIBVA_DRIVER_NAME=d3d12
验证是否生效,在子系统终端中执行:
glxinfo | grep "OpenGL renderer"
- 若输出包含 OpenGL renderer string: D3D12 等字样,说明硬件图形加速已成功开启。
- 若输出包含 llvmpipe,则是 CPU 软件渲染,启用失败。
若 openGL 在英特尔 GPU 上依然使用 llvmpipe 软件渲染,则需要为 libedit 创建符号链接:
ln -s /usr/lib/libedit.so /usr/lib/libedit.so.2
3. 设置应用的显示协议与缩放率
目前 WSLG 在高分辨率屏幕下使用 Wayland 协议显示的图形界面 bug 还比较多,我更推荐使用 X11 协议。但 Wayland 目前已经是 WSLG 的默认协议了,所以我们在启动程序时需要手动指定 X11 协议。下文介绍各类常见应用程序如何指定 X11 协议运行并设置高分屏缩放率。
3.1 Tauri 程序
以 cc-switch 为例,指定使用 X11 协议、缩放倍率 150%,启动命令如下:
GDK_BACKEND=x11 GDK_DPI_SCALE=1.5 cc-switch
3.2 Chrome/Electron 程序
Chrome 内核提供了 force-device-scale-factor 参数可以指定缩放率,例如:
# codex-desktop
codex-desktop --force-device-scale-factor=1.5
# VSCode
code --force-device-scale-factor=1.5
# 谷歌浏览器
google-chrome-stable --force-device-scale-factor=1.5
可以通过 --ozone-platform=x11/wayland 参数指定协议,但我发现上面这几个应用默认的显示协议表现就挺好的,所以不必指定了。
3.3 GTK 程序
可以用 GDK_SCALE=2 GDK_DPI_SCALE=0.75 程序命令 来启动。
GDK_SCALE 只能整数倍放大
GDK_DPI_SCALE 可以对逻辑 DPI 进行小数倍调整
3.4 其他:JetBrains IDEA
在 IDEA VmOptions 中添加配置
# 强制使用 X11
-Dawt.toolkit.name=XToolkit
# 强制使用 Wayland
#-Dawt.toolkit.name=WLToolkit
然后在 IDEA Settings 中将程序缩放调整至与 Windows 系统一致,例如 150%。
4. 输入法安装
WSL 图形界面是一个 RDP 远程窗口,不能使用 Windows 的输入法,所以需要在子系统中安装一个输入法。以下是在 ArchLinux 中安装 Fcitx5 + 拼音输入法的教程。
4.1 安装输入法
安装 fcitx5 输入法框架与拼音输入法引擎
sudo pacman -S fcitx5-im fcitx5-chinese-addons
# fcitx5-im 包含了 fcitx5 本体、fcitx5-configtool、fcitx5-gtk、fcitx5-qt 四个包,其他系统请自行查找
4.2 添加输入法配置
在 /etc/profile 中添加如下配置
export LC_CTYPE=zh_CN.UTF-8
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export SDL_IM_MODULE=fcitx
export GLFW_IM_MODULE=ibus
# 如果你了解 Linux 系统各种可配置环境变量的文件,你也可以放到你认为合适的文件中。
4.3 配置 fcitx5
使用 fcitx5-configtool 图形界面配置,在左侧输入法中添加【拼音】输入法即可。其他配置自行研究。
fcitx5-configtool
4.4 启动 fcitx5
执行以下命令启动输入法,然后打开某个程序(例如 VSCode),按一下输入法切换快捷键,就可以输入中文了。
nohup fcitx5 --disable=waylandim --disable=wayland -d >/dev/null 2>&1 &
- tips:许多程序启动命令都不会自动转到后台,可以像这条命令一样,用 nohup 让其在后台执行,避免程序因终端关闭退出。
5. 配置中文语言环境
5.1 设置中文语言环境
为避免程序界面中文乱码,建议将语言环境与字体设置为中文:
- 执行
locale 命令查看当前系统语言配置,如果 LANG=zh_CN.UTF-8 就不用继续配置
- 编辑
/etc/locale.gen 文件,将以下配置放开en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
- 执行
sudo locale-gen 生成语言环境缓存
- 执行
echo $LANG 查看是否是 zh_CN.UTF-8,如果不是可以在 $HOME/.bashrc 或 $HOME/.zshrc 等文件中添加 export LANG=zh_CN.UTF-8
5.2 设置默认中文字体
- 通过仓库或离线手动安装字体文件,此处不赘述
- 修改系统默认字体。添加配置文件
~/.config/fontconfig/fonts.conf 或 /etc/fonts/local.conf,内容如下:<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- 设置默认 sans-serif 字体 -->
<match target="pattern">
<test qual="any" name="family"><string>sans-serif</string></test>
<edit name="family" mode="assign" binding="same">
<string>更纱黑体 UI SC</string><!-- 这里设置成自己想要的字体 -->
</edit>
</match>
<!-- 设置默认 serif 字体 -->
<match target="pattern">
<test qual="any" name="family"><string>serif</string></test>
<edit name="family" mode="assign" binding="same">
<string>更纱黑体 UI SC</string><!-- 这里设置成自己想要的字体 -->
</edit>
</match>
<!-- 设置默认 monospace 字体 -->
<match target="pattern">
<test qual="any" name="family"><string>monospace</string></test>
<edit name="family" mode="assign" binding="same">
<string>Maple Mono NF CN</string><!-- 这里设置成自己想要的字体 -->
</edit>
</match>
</fontconfig>
6. 使用 Windows 默认软件打开子系统中的文件目录
在子系统的 $HOME/.bashrc 或 $HOME/.zshrc 中添加如下函数
# 使用 Win start 命令打开路径/文件
function o() {
linuxPath="${1:-.}"
winPath=$(wslpath -w "$linuxPath")
/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Command "start $winPath"
}
然后打开一个新的终端窗口:
- 执行
o 或 o .,就会用 Windows 文件浏览器打开当前目录
- 执行
o <path> ,就会用 Windows 文件浏览器打开指定目录
- 执行
o AGENTS.md,就会使用默认 Markdown 编辑器(例如 Typora)打开文档。o <其他类型文件> 的行为与此类似,打开什么软件取决于 Windows 的文件类型关联。
结尾
本文仅是抛砖引玉,欢迎大家多多指正并分享自己的小技巧。