如何在 Windows Subsystem for Linux (WSL) 上运行 Linux GUI 软件

前言

由于学校机房基本都是 Linux 系统,经常要使用 SSH 远程登陆到学校主机上做作业,而且又不是特别喜欢 PuTTY,所以一直靠虚拟机作为解决方案。但虚拟机的性能有限,在虚拟机和 Windows 之间一直来回切换也很令人恼火。所以在 WSL 的基本功能成熟后,打算试用一下。
预计基本的应用场景为:

  • 使用 SSH 的 -X 转发功能,在 Windows 下远程运行主机上的 GUI 程序做作业
  • 用 WSL 替换掉 Git Bash
  • 其他 Linux 和 Windows 可以相互配合的场景。

Windows Subsystem for Linux (WSL) 简介

Windows Subsystem for Linux(简称 WSL)是一个为在 Windows 10 上能够原生运行 Linux 二进制可执行文件(ELF 格式)的兼容层。它是由微软与 Canonical 公司合作开发,目标是使纯正的 Ubuntu 14.04 “Trusty Tahr” 映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。

WSL 又称 Bash on Ubuntu on Windows,使得 Ubuntu 用户可以在 Windows 上直接使用 Linux, 并可以与 Windows 的设备和文件互通。遗憾的是,该子系统官方并不支持运行带图形用户界面 (GUI) 的程序,不过我们可以通过 X 窗口系统 X-Server 达到这一目的。

WSL 安装

参照 WSL 的 官方介绍, 安装步骤如下:

  • 首先确定 Windows 的版本, 版本号在 build 14393 之后(包括 14393)的 64-bit 系统均可安装。版本号确定的方式如下:打开 设置 > 系统 > 关于,查看 OS 版本系统类型两项

    查看系统版本

  • 打开 开发人员模式,打开 设置 > 更新和安全 > 对开发人员,右侧选择 开发人员模式

    开发人员模式

  • 在开始菜单中搜索并打开 启用或关闭 Windows 功能,勾选 适用于 Linux 的 Windows 子系统 (Beta)

    启用或关闭 Windows 功能

  • 在 CMD 中或直接在搜索栏中输入 bash 即可开始安装 , 并根据提示设定 UNIX 的用户和密码

    创建用户

WSL 指令简介

根据 WSL 命令参考, Windows 通过两个重要的指令与 WSL 交互,即 bash.exelxrun.exe

  • bash.exe 启动 Bash 并运行 /bin/bash
  • lxrun.exe 用于管理 WSL,这个命令可以用来安装或者卸载 Ubuntu 镜像
命令 描述
bash 在当前目录启动 Bash,如果 Bash 尚未安装就自动运行 lxrun /install
bash ~ 启动 Bash 并且进入 Ubuntu 用户目录, 类似于运行 cd ~
bash -c "<command>" 运行指令,打印输出,并返回至 Windows 命令行。 例:bash -c "ls"
命令 描述
lxrun lxrun 命令用于管理 WSL 实例
lxrun /install 开始下载安装程序; /y 选项可以用于自动应答安装过程的确认提示,并设置默认用户的 root 权限
lxrun /uninstall 删除 Ubuntu 镜像,默认不删除用户的 Ubuntu 主目录; /y 选项用于自动应答安装过程的确认提示; /full 选项会卸载并删除用户的 Ubuntu 主目录
lxrun /setdefaultuser <userName> 设置 默认的 Bash 用户 ;/y 选项可以用于自动应答确认,创建无密码用户
lxrun /update 更新子系统的安装包索引

WSL 的优势与不足

  • 与虚拟机相比,WSL 需要更少的资源 (CPU,内存,存储空间)。
  • 在运行 Windows 的同时,可以运行 Linux 命令行工具,并且能够访问 Windows 文件系统,实现两者交互
  • 目前只支持使用 Ubuntu, 未来会提供更多 Linux 发行版
  • 不支持 GUI 桌面程序和应用(比如 Gnome, KDE 等)

借助 X Server 在 WSL 上使用桌面程序

X 窗口系统 (X Window System) 简介

X 窗口系统X Window System,也常称为 X11X)是一种以位图方式显示的软件窗口系统。最初是 1984 年麻省理工学院的研究,之后变成 UNIX、类 UNIX、以及 OpenVMS 等操作系统所一致适用的标准化软件工具包及显示架构的运作协议。X 窗口系统通过软件工具及架构协议来创建操作系统所用的图形用户界面,此后则逐渐扩展适用到各形各色的其他操作系统上。现在几乎所有的操作系统都能支持与使用 X。更重要的是,今日知名的桌面环境——GNOME 和 KDE 也都是以 X 窗口系统为基础建构成的。

X Window System 主要由 X ServerX Client 两部分组成。其中 X Server 负责接受对图形输出 (窗口) 的请求并反馈用户输入,而 X Client 则是使用图形界面的应用程序。由于 WSL 本身不支持图形界面,我们需要额外安装 X Server 并指定图形输出位置,使得带有 GUI 的桌面程序可以被显示和运行。

X Server 的选择

Windows 上常用的 X Server 有:Xmanager, Xming, VcXsrv 等,简单比较一下:

  • Xmanager 是商业软件,需要付费
  • Xming 虽然是开源软件,但是从从 2007 年最后一个免费版本 (6.9.0.31) 之后,就需要捐助才能下载。不过免费版本虽然老旧,但由于 X Windows System 近年来变化不大,免费版还是基本够用
  • VcXsrv 为开源免费软件,使用方式及界面与 Xming 极为相近,还在不断更新,因此我最终选择此软件

VcXsrv 的安装和启动

下载 VcXsrv 并进行安装后,运行 XLaunch,一直点 Next 至启动完成。

XLaunch

WSL 设置

启动 X Server 后,需要在 WSL 中输入如下两条指令,重启 Bash,即可运行带有图形界面的 Linux 程序了

1
2
echo export DISPLAY=:0.0>>~/.bashrc
sudo sed -i 's$<listen>.*</listen>$<listen>tcp:host=localhost,port=0</listen>$' /etc/dbus-1/session.conf

这里对这两条指令简单解释一下:

第一条指令

该指令将export DISPLAY=:0.0 指令添加进 ~/.bashrc 中,使得每次开启新的 Bash 时,自动指定图形程序显示的位置。
也可直接输入以下指令运行程序,无需export,但作用效果只有一次,再运行其他程序时,还要重新输入指令。

1
DISPLAY=:0.0 gvim & //gvim 为你想要打开的程序

tips:

  • gvim 后的 & 不是必须要加,它表示程序以后台启动的方式运行,这样在图形界面运行时,命令行窗口还可以继续使用。要是忘记加 &, 也可以在程序运行时按ctrl+z, 将程序进程挂起,并输入bg,使其在后台运行

第二条指令

第一条输入,重启 Bash 后 , 理论上就可以运行 Linux 程序了,但程序一般不会运行很久就挂掉了,并会提示 D-Bus异常,该异常会使得许多 Linux 的图形程序无法很好地运行。 这是因为 D-Bus 需要使用socket来通信,但 WSL 目前并不支持 socket。
Reddit 上对此的解决方案为:用 tcp 代替 sockets 来使 D-Bus 运行。
具体实现为:在 /etc/dbus-1/session.conf 中(需要 Root 权限),将<listen>unix:tmpdir=/tmp</listen>字段替换为 <listen>tcp:host=localhost,port=0</listen>,简单写就是第二条指令了。

进入 WSL 环境的多种方法

到目前为止,我们就可以在 WSL 上使用 Linux 的图形界面了,甚至可以运行 Ubuntu 桌面。WSL 可以作为生产力工具与 Windows 交互使用,大大减少了使用虚拟机的机会。 虽然 WSL 相对来说还是略有不稳定,命令行窗口有时会突然无响应,会有些莫名其妙的异常出现,但总体还算满意。
在平时使用场景中进入 WSL 环境,有多种方案,这里简单介绍两种:

直接运行 Bash

直接运行 Bash 是最省事的,在搜索栏或者 CMD 输入 bash 就可进入 Bash 控制台。这种方式占用资源较低,运行最快,但是体验也很差。Bash 中无法输入中文,中文显示也不是特别好,只有 16 色,可定制性差,很不舒服。

使用 wsl-terminal

wsl-terminal 是专门为 WSL 准备的终端模拟器,主体是 mintty,另外整合了一些工具,使用起来非常方便,也是目前用户体验最好的,大小也只有 1M 多,推荐使用。使用方法见 官方主页

使用方法亦可参考 更好地使用 Windows Subsystem for Linux (或者叫 Bash on Ubuntu on Windows)终端环境, 这个终端模拟工具十分好用,体积小巧,支持中文,配色丰富。尽管感觉比直接运行 Bash 要慢一些,但总体还可以接受。

小结

相对于预期的应用场景,很遗憾不知道为什么虽然本地可以运行桌面程序,却无法 SSH -X 运行远程的桌面程序, 最终 SSH 的 X 映射还是选择了 MobaXterm 的免费版,启动略慢,但功能十分强大,界面也非常漂亮,如下图:

MobaXterm

同时配合 wsl-terminal 在当前目录打开终端的功能,WSL 可以完全取代 Git Bash。

参考