在 Windows 上使用 Linux 开发环境,最好的做法是使用 WSL2。在 WSL 和早期的 WSL2 版本中,并不支持图形用户界面。因此如果想要使用 GUI 程序,需要自行解决。具体方法可以参考之前的一篇博客 Win10 系统安装 Linux 子系统教程(WSL2 + Ubuntu 20.04 + Gnome 桌面 )
好消息是在新版的 WSL2 中,支持在 Windows 上运行 Linux GUI 应用程序(X11 和 Wayland),提供了完全集成的桌面体验,从而使得 Linux GUI 应用程序在 Windows 上使用起来原生且自然。
先决条件:
- Linux GUI 应用仅受 WSL 2 支持
- 需要使用 Windows 10 版本 19044+ 或 Windows 11 才能使用此功能。
- 已安装适用于 vGPU 的驱动程序
全新安装 - 以前没有安装 WSL
如果电脑上还未安装过 WSL 或 WSL2,则安装过程非常简单,需要一行命令:
> wsl --install
按照提示安装完成之后,就可开始在 WSL 上使用 Linux GUI 应用了。
现有 WSL 安装
如果已在计算机上安装 WSL,可以运行更新命令来更新到包含 Linux GUI 支持的最新版本。
(1)打开 windows terminal 或 PowerShell
(2)输入 WSL 更新命令:
> wsl --update
(3)关闭并重启 WSL,更新才能生效
> wsl --shutdown
卸载 ubuntu-wsl2-systemd-script
如果电脑上已经安装了 WSL2,且通过 ubuntu-wsl2-systemd-script 方法支持了 GUI 应用,则可以卸载该脚本,转为使用新版 WSL2 中自带的 WSLg 图形用户界面。
卸载方法:
(1)运行下面的卸载脚本
#!/bin/bash
#sudo apt update -yqqqq
echo "Uninstalling ubuntu-wsl2-systemd-hack"
sudo rm -f /usr/sbin/start-systemd-namespace
sudo rm -f /usr/sbin/enter-systemd-namespace
sudo sed -i "s/#\ Start\ or\ enter\ a\ PID\ namespace\ in\ WSL2\nsource\ \/usr\/sbin\/start-systemd-namespace\n//g" /etc/bash.bashrc
sudo sed -i "s/#\ Start\ or\ enter\ a\ PID\ namespace\ in\ WSL2\nsource\ \/usr\/sbin\/start-systemd-namespace\n//g" /etc/zsh/zsh.zshrc
(2)注释或删掉 /etc/bash.bashrc
和/etc/zsh/zsh.zshrc
(如果安装了zsh)中的这行内容
# Start or enter a PID namespace in WSL2
# source /usr/sbin/start-systemd-namespace
(3)更新 WSL2
> wsl --update
更新完之后的版本,类似如下
> wsl --version
WSL 版本: 2.2.4.0
内核版本: 5.15.153.1-2
WSLg 版本: 1.0.61
MSRDC 版本: 1.2.5326
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.26091.1-240325-1447.ge-release
Windows 版本: 10.0.22635.3785
(4)sudo vim /etc/wsl.conf
,将该文件中的下面两行内容取消注释
[boot]
systemd=true
这样就会在 WSL2 启动时自动开启 systemd,这是运行 GUI 所必需的。
ubuntu-wsl2-systemd-script 脚本所做的事情就是为了开启 systemd,而在新版的 WSL2 中,只需要修改配置文件中的这两行就可以了。
(5)关闭并重启 WSL2
> wsl --shutdown
(6)测试 systemd 命令
在 WSL2 终端中输入 systemctl
命令,你会发现是可用的
> systemctl
UNIT
dev-fuse.device
sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-381af4ce\x2deca0\x2d4d03\x2dad5e\x2dcfbd8dca0e70-net-eth0.de>
sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-8fd241fc\x2db084\x2d4f91\x2db7b6\x2d1d45e5200e20-pcib084:00->
sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-8fd241fc\x2db084\x2d4f91\x2db7b6\x2d1d45e5200e20-pcib084:00->
sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-fd1d2cbd\x2dce7c\x2d535c\x2d966b\x2deb5f811c95f0-host0-targe>
sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-fd1d2cbd\x2dce7c\x2d535c\x2d966b\x2deb5f811c95f0-host0-targe>
sys-devices-LNXSYSTM:00-LNXSYBUS:00-ACPI0004:00-VMBUS:00-fd1d2cbd\x2dce7c\x2d535c\x2d966b\x2deb5f811c95f0-host0-targe>
sys-devices-platform-serial8250-tty-ttyS0.device
sys-devices-platform-serial8250-tty-ttyS1.device
sys-devices-platform-serial8250-tty-ttyS2.device
sys-devices-platform-serial8250-tty-ttyS3.device
...
使用 Linux GUI
现在,在 WSL2 中可以直接使用 GUI 程序了。例如,在终端中输入
> gedit
会直接打开 gedit
文本编辑器。
如果输出警告
(gedit:1488): GLib-GIO-CRITICAL **: 11:17:48.552: g_dbus_proxy_new: assertion 'G_IS_DBUS_CONNECTION (connection)' failed
,可以通过sudo apt-get purge fcitx-module-dbus
命令来解决。
其它所有 GUI 程序(包括 OpenGL)都可以用这种方法直接打开。
参考链接
在适用于 Linux 的 Windows 子系统上运行 Linux GUI 应用
Is there a way to undo this? #87