Linux|WSLG:微软开源WSL桌面APP增强

Linux|WSLG:微软开源WSL桌面APP增强

文章图片


WSL是个非常棒的系统 , 可以在Windows内核上直接运行Linux镜像 , 避免了通过虚拟机方式运行Linux 。 从而高效搞交互解决windows下运行Linux的问题 。 但是WSL图形交互功能不是很好 , 这对Windows用户来说这个显得略显生疏 。 为了解决这个问题 , 微软今年开源了WSLG系统 (Windows Subsystem for Linux GUI) 的 , 其目的是Windows上以完全集成的桌面体验运行Linux 桌面应用程序 。本文请和虫虫一起来学习一下WSLG系统 。

概述WSLG支持在Windows环境下需要运行在 Linux自己桌面工具或应用程序的开发人员、科学家或爱好者提供友好的交互和高效体验 。
WSLG 致力于让Linux GUI应用程序在Windows上使用起来感觉原生和自然 。 可以任务栏中、剪切/粘贴 , WSLG支持Windows和 Linux桌面应用程序的无缝体验的工作流程 。
系统架构WSLG基于WSL虚拟机 , Linux桌面个原生APP通过Xwayland , Pulse音频服务器 , 继承到Weston系统 , 再通过FreeRDP , WSLDVC Windows插件(mstsc.exe)和Windows交互 , 其架构图如下:

用户发行版用户发行版都在同一个 WSL 虚拟机中针对Linux内核的单个实例运行 。 PC上的不同用户拥有自己的VM和WSL实例 。 其Linux 环境是用户级的是无法与其他 Windows用户共享 。
系统发行版WSLG系统发行版整个架构的核心和交互中心 , 其实质是一个容器化的Linux环境 , 系统发行版基于 Microsoft CBL-Mariner Linux一个最小的Linux环境 , 用于以运行WSLG的各个部分 。 容器中运行WSLG XServer、Wayland 服务器和Pulse音频服务器 。 他们之间以及和用户发行版通过Soket进行通讯交互 。 用户发行版中预设了环境变量 DISPLAY、WAYLAND_DISPLAY 和 PULSE_SERVER用于应用这些组件服务 , 实现WSLG 开箱即用 。
用户可以通过在c:\\users\\MyUser\\.wslconfig中添加以下方法来关闭系统发行版:
[wsl2

guiApplications=false
每个WSL 2用户发行版都与其系统发行版实例配对 。 系统发行版与其配对的用户发行版部分隔离 , 在NS/PID/UTS命名空间中运行 , 但共享其他命名空间 , 例如 IPC允许跨边界共享内存优化 。
系统发行版的每个实例都从其支持的VHD中以只读方式加载 。 当WSL重新启动时 , 对系统发行版的内存实例所做的任何修改(例如安装新包或创建新文件)都会被丢弃 。
WSLGdWSLGd是在init之后启动的第一个进程 。WSLGd启动Weston (使用 XWayland)、 PulseAudio 并通过mstsc.exe主机上以静默模式建立RDP连接 。RDP连接将保持活动状态并准备好显示正在启动的新GUI应用程序 , 没有任何连接建立延迟 。WSLGd以守护进程凡事监听这些进程 , 避免他们由于错误退出 。
WestonWeston 是Wayland项目的参考合成器 , WSL的核心 。 在WSLG中对其扩展libweston 现有RDP后端 , 实现远程应用程序 。 WSLG还在其新增加了多显示器支持、剪切/粘贴、音频输入/输出等功能 。
应用程序集成是通过名为RAIL(本地远程应用程序集成)和VAIL(本地集成虚拟化应用程序)的RDP技术实现的 。 RAIL和VAIL之间的主要区别在于像素如何从RDP服务器传输到 RDP 客户端 。 在RAIL中 , 假设服务器和客户端运行在通过网络通信的不同物理系统上 , 因此需要通过 RDP 传输复制像素 。 在VAIL中 , Server 和Client位于同一个物理系统上 , 可以跨 Guest/Host VM边界共享内存 。
RAIL-Shell
WSLG中还引入了RAIL Shell用于帮助将单个窗口从Linux映射到 Windows , 该 shell 非常简单 , 不涉及任何实际的小部件或shell拥有的像素 。
FreeRDPWeston 利用FreeRDP来实现其后端RDP服务器 。 FreeRDP用于根据RDP协议规范直线RDP 服务器到RDP客户端(Windows 上的 mstsc)的所有通信进行编码 。它还用于解码从RDP客户端到RDP服务器的所有流量 。