使用 WSLg 的 vGPU 硬件加速新特性创建重度混合生产环境

一、不同版本的WSL

Windows Subsystem for Linux(简称WSL)是一个在 Windows 10\11 上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。

到目前为止 WSL 可分为 WSL1 和 WSL2 两代,其中 WSL1 代类似 Cygwin,是使用Windows 的 API 重写了一份 Linux 的 API,没有关机概念,无法使用 systemd、docker 等运行常驻服务;而 WSL2 是基于 Hyper-V 的完整虚拟机,支持 systemd、docker 等在内的常驻服务运行;最新的 WSLg 是 Windows Subsystem for Linux GUI 的缩写,该项目的目的是支持在 Windows 上以完全集成的桌面体验运行 Linux GUI 应用程序(X11 和 Wayland)。

WSLg 的 Firefox 和 Windows 下的 Firefox

简单的来说 WSLg 可以让你直接在 Windows 的桌面环境下直接运行 Linux 下的 GUI 应用,共享 Windows 的桌面,只到这一步的话,WSL 系可能还是偏向玩具+轻量级的混合生产环境,但是,最最最最新的更新,WSLg(WSL2)已支持 vGPU,可以直接调用物理宿主机的显卡。这下性质真的变了,你可以在主操作系统为 Windows 的情况下,使用 WSL2 来跑 Linux 下的重度生产环境。属实是工作生活双平衡了(bushi)。

二、WSL2 安装 + 桌面环境部署

WSL2 的安装方法和 WSL1 一致,使用 控制面板→程序和功能→启用或关闭 Windows 功能,按下图勾选 Hyper-V、适用于 Linux 的 Windows 子系统、虚拟机平台 三个选项(Hyper-V 在列表上方图没截进去)。

安装 WSL

安装完毕后按要求进行重启,之后先以管理员身份运行以下命令:

# 设定WSL版本为WSL2
wsl --set-default-version 2
# 升级WSL组件
wsl --update
# 安装 Ubuntu-20.04 发行版
wsl --install -d Ubuntu-20.04

至此 WSL2 已安装完毕,在开始菜单中找到 Ubuntu20 启动或者在任何 CMD、Powershell中键入 bash 命令即可进入 WSL2 的 Ubuntu20 环境。接下来使用以下命令安装 Ubuntu 的桌面环境:

sudo apt-get update
sudo apt-get install ubuntu-desktop

安装完毕后会发现开始菜单中多了很多图标带有 Linux 小企鹅标志的的程序快捷方式,名字也带有 “(Ubuntu 20)” 的标记,这些就是 WSLg 的启动方式了。

WSLg 快捷方式

三、vGPU 的使用

其实在 WSLg 之前,可以使用 Hyper-V 的 DDA 功能将物理机的 GPU 直接分配给虚拟机使用,来实现虚拟化的生产环境。但是使用 DDA 也存在几个问题:

  1. 无论是通过 DDA 挂载还是释放,都需要非常复杂的纯命令行设置,需要手动计算、分配内存的可用大小
  2. 通过 DDA 分配给虚拟机时,宿主机必须断开与 GPU 的访问,即宿主机和虚拟机无法同时访问 GPU

而现在可就方便多了,首先确定 Windows 10/11 的系统版本已为最新,同时安装最新的显卡驱动,vGPU 的配置就已经自动完成了。在 Linux 的环境下可以直接使用 nvidia-smi 命令来查看 GPU 状态,非常丝滑和离谱。CUDA is Ready!

在 WSL 中查看 GPU 状态

实测此时直接使用 Firefox 等浏览器还无法直接播放视频,但是使用 sudo apt-get install vlc 命令安装完 vlc 播放器和相关的解码依赖后,就可以愉快地直接在 Firefox 中使用硬件解码来播放4K视频了。

使用 WSLg 的Firefox 播放 4K 视频

至此相关配置全部完成,按照正常的 Linux 环境来用即可。当然,也许有人要问,那我直接用 Linux 不就好啦。但是实际生产过程中,总是会遇到 “如果我用的是 Windows/Linux 系统就好了” 这种情况。混合生产环境的最大优势就是在于,可以同时使用 Windows 和 Linux 系统下最好的工具,互相配合,甚至可以在 Windows 环境下通过先调用 cmd 再启动 bash 然后通过标准输入输出来整合两个环境的工具,形成工作流。

个人觉得,很多时候,决定工具上限的不是工具本身,而是使用者的技术上限和技术边界。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注