文章目录
在微软Build 2025开发者大会上,微软宣布了一项重磅决定:正式开源Windows Subsystem for Linux(WSL)项目。这一消息标志着微软与开源社区合作的新篇章,也满足了开发者社区长达九年的期盼。
WSL的发展历程
WSL的故事始于2016年,当时微软在Build 2016大会上首次宣布了这一项目。WSL最初作为Windows 10周年更新的一部分发布,这在当时引起了广泛关注——微软居然在Windows中内置了一个Linux环境!
WSL 1:兼容层方案
最初的WSL(现称为WSL 1)基于一个微处理器提供程序(lxcore.sys),这使得Windows能够原生运行ELF可执行文件,并在Windows内核中实现Linux系统调用。虽然创新,但这种方法在文件系统性能和系统调用兼容性方面存在明显不足。
WSL 2:虚拟化技术革新
认识到这些限制后,微软在2019年宣布了WSL 2,并在2020年正式发布。WSL 2采用了更为彻底的方案:在轻量级实用工具虚拟机内运行完整的Linux内核。这种方法极大地提高了性能和兼容性,使得WSL能够运行更多Linux应用程序,甚至包括图形界面应用。
独立应用的发展
为了加快开发速度并更好地响应社区需求,微软在2021年将WSL从Windows代码库中分离出来,成为一个独立的应用程序。这个新的WSL首次以0.47.1版本在Microsoft Store上发布,当时仅支持Windows 11系统。
随后,微软继续完善这一"WSL包",直到2022年11月发布了WSL 1.0.0版本,这是第一个稳定版本,同时增加了对Windows 10的支持。
微软继续改进WSL,最终在2023年推出了WSL 2.0.0版本,引入了镜像网络、DNS隧道、代理支持、防火墙兼容性等重大改进。截至2025年5月,最新版本为WSL 2.5.7。
WSL开源:内容与范围
根据微软官方博客介绍,此次开源的WSL代码现已在GitHub上公开,开发者可以下载源代码、构建WSL、添加新功能或修复,并参与WSL的积极开发。
已开源的组件
此次开源的WSL代码包括以下主要组件:
-
命令行可执行文件:与WSL交互的入口点
- wsl.exe
- wslconfig.exe
- wslg.exe
-
WSL服务:负责启动WSL虚拟机、启动发行版、挂载文件访问共享等
- wslservice.exe
-
Linux init和守护进程:在Linux中运行以提供WSL功能的二进制文件
- 用于启动的init
- 用于网络的gns
- 用于端口转发的localhost等
-
文件共享:使用WSL的Plan9服务器实现将Linux文件共享到Windows
值得注意的是,微软已经开源了以下WSL相关组件:
- microsoft/wslg:支持Wayland和X服务器相关场景的WSL图形界面
- microsoft/WSL2-Linux-Kernel:WSL 2中使用的Linux内核源代码
尚未开源的组件
某些组件仍是Windows镜像的一部分,目前尚未开源:
- Lxcore.sys:支持WSL 1的内核驱动程序
- P9rdr.sys和p9np.dll:运行"\wsl.localhost"文件系统重定向的组件(从Windows到Linux)
为什么现在开源?
微软在官方博客中解释了为什么现在决定开源WSL:
"多年来,我们非常幸运,从第一天起就拥有一个强大的社区支持WSL。我们很幸运,人们分享他们的知识,并花费无数的时间来帮助追踪错误,找到实现新功能和改进WSL的最佳方法。
如果没有社区的支持,WSL就不可能有今天的成就。即使无法访问WSL的源代码,人们也能够做出重大贡献,最终成就WSL的今天。
这就是为什么我们今天对WSL开源感到无比兴奋。我们已经看到社区在没有源代码的情况下为WSL做出了巨大的贡献,我们迫不及待地想看到,在社区能够直接为项目贡献代码之后,WSL将如何发展。"
据Windows与设备部门副总裁Pavan Davuluri透露,开源WSL的过程之所以花费了这么长时间,是因为需要进行重大的架构调整,将WSL从Windows主代码库中解耦出来。
这也回应了WSL GitHub仓库中第一个问题(Issue #1):"这个项目会开源吗?"这个问题现在终于被关闭了。
WSL的技术架构与工作原理
WSL 2的工作原理
WSL 2的核心是一个轻量级的Hyper-V虚拟机,其中运行着完整的Linux内核。这种方法不仅提供了卓越的性能,还确保了与原生Linux的高度兼容性。以下是WSL 2的关键特点:
- 虚拟化技术:使用轻量级实用工具虚拟机运行真正的Linux内核
- 文件系统性能:比WSL 1提供更快的文件系统操作
- 完整的系统调用兼容性:确保更多Linux应用能够正常运行
- 图形界面支持:通过WSLG支持Linux图形应用程序
- 资源管理:支持内存回收、GPU加速等功能
与Windows集成
WSL 2提供了与Windows系统的深度集成:
- 文件系统访问:可以通过
\\wsl$\<DistroName>\
访问Linux文件,同时在Linux内可通过/mnt/c/
访问Windows文件 - 网络集成:共享Windows的网络连接,支持localhost转发
- GPU支持:支持使用Windows GPU进行机器学习工作负载
使用WSL进行开发的实例
在WSL中使用.NET开发C#应用程序
以下是在WSL的Ubuntu发行版中使用.NET开发简单C#应用程序的示例:
// 文件:Program.cs
// 这是一个在WSL中运行的简单C#程序
// 演示了如何访问Windows和Linux文件系统
using System;
using System.IO;
using System.Diagnostics;
namespace WSLDemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("WSL与Windows集成演示程序");
// 检测是否在WSL环境中运行
bool isWsl = File.Exists("/proc/sys/kernel/osrelease") &&
File.ReadAllText("/proc/sys/kernel/osrelease").ToLower().Contains("microsoft");
Console.WriteLine($"是否在WSL环境中运行: {isWsl}");
if (isWsl)
{
// 获取WSL发行版信息
string distroInfo = File.ReadAllText("/etc/os-release");
Console.WriteLine("当前WSL发行版信息:");
Console.WriteLine(distroInfo);
// 访问Windows文件系统
Console.WriteLine("\n访问Windows文件系统:");
string windowsPath = "/mnt/c/Windows";
if (Directory.Exists(windowsPath))
{
var windowsFiles = Directory.GetFiles(windowsPath, "*.exe", SearchOption.TopDirectoryOnly);
Console.WriteLine($"Windows目录中的exe文件数量: {windowsFiles.Length}");
}
// 演示跨系统进程调用
Console.WriteLine("\n从WSL调用Windows命令:");
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/c ver";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
Console.WriteLine(output);
}
Console.WriteLine("程序执行完毕。按任意键退出...");
Console.ReadKey();
}
}
}
要在WSL中编译和运行此程序,请按照以下步骤操作:
-
首先在WSL中安装.NET SDK:
# 添加Microsoft包仓库 wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb # 安装SDK sudo apt-get update sudo apt-get install -y apt-transport-https sudo apt-get update sudo apt-get install -y dotnet-sdk-7.0
-
创建并编译程序:
# 创建新项目 mkdir WSLDemo cd WSLDemo dotnet new console # 将上面的代码复制到Program.cs # 编译和运行 dotnet run
这个示例展示了WSL如何同时利用Linux和Windows的优势,为开发者提供无缝的混合环境。
WSL的主要优势
开发者为什么选择WSL?
以下是开发者选择WSL的主要原因:
-
无需虚拟机或双启动系统:直接在Windows中运行Linux环境,无需配置复杂的虚拟机或担心双启动系统的问题
-
与Windows的无缝集成:
- 从Linux访问Windows文件系统
- 从Windows访问Linux文件系统
- 共享网络配置和localhost端口
-
轻量级:比传统虚拟机占用更少的资源,启动速度更快
-
支持多种Linux发行版:可以同时运行多个不同的Linux发行版(如Ubuntu、Debian、Fedora等)
-
图形应用支持:通过WSLg可以运行Linux图形应用程序
-
GPU加速:支持在Linux环境中使用Windows GPU,特别适合机器学习工作负载
WSL在企业中的应用
Microsoft在Build 2025上还宣布了WSL的多项企业级功能:
-
Microsoft Defender for Endpoint的WSL 2支持:现已正式推出,企业可以使用Microsoft Defender监控WSL环境
-
Intune功能集成:允许通过Intune管理WSL设置,并基于Linux发行版的状态强制执行条件访问方案
-
Microsoft Entra ID集成:即将推出的功能,使Microsoft的身份验证库(MSAL)能够与WSL安全通信,让用户可以使用Windows上的Entra ID凭据自动登录WSL中的应用程序
WSL的未来发展
微软在最近的更新中透露了WSL的未来发展方向:
即将推出的功能
-
WSL设置GUI应用程序:为了帮助用户自定义、管理和查看WSL中可用的设置,微软正在开发一个WSL设置GUI应用程序,使配置WSL变得更加直观和简单
-
Dev Home集成:微软正在开发"环境"功能,允许用户在Dev Home中管理、启动和创建新的开发环境,包括WSL发行版
-
内存、存储和网络改进:
- 自动将WSL存储的内存释放回Windows
- 改进网络功能,默认启用DNS隧道
- 实验性功能如自动磁盘空间回收和镜像网络模式,支持IPv6等新功能
社区贡献的重要性
微软强调,WSL的成功很大程度上归功于社区的支持和贡献。即使在没有源代码访问权限的情况下,开发者社区也为推动WSL的发展做出了巨大贡献。现在通过开源,微软希望促进更多创新和改进。
开始使用WSL
如果你还没有使用过WSL,以下是快速入门的步骤:
安装WSL
在Windows 10版本2004及更高版本或Windows 11上,安装WSL非常简单:
# 管理员权限运行PowerShell
wsl --install
此命令将:
- 启用必要的Windows功能
- 下载并安装最新的Linux内核
- 将WSL 2设为默认版本
- 安装Ubuntu发行版(默认)
安装其他Linux发行版
你可以通过Microsoft Store或命令行安装其他Linux发行版:
# 列出可用的发行版
wsl --list --online
# 安装特定发行版
wsl --install -d Debian
WSL基本命令
# 列出已安装的发行版
wsl --list --verbose
# 设置默认的WSL版本
wsl --set-default-version 2
# 设置特定发行版使用的WSL版本
wsl --set-version <发行版名称> <版本号>
# 设置默认发行版
wsl --set-default <发行版名称>
# 启动特定发行版
wsl -d <发行版名称>
# 以特定用户身份启动
wsl -d <发行版名称> -u <用户名>
# 运行特定命令
wsl -d <发行版名称> <命令>
结论
微软宣布开源WSL标志着Windows和Linux两大生态系统之间的界限进一步模糊化。这不仅体现了微软拥抱开源的战略转变,也为开发者社区提供了更多参与和贡献的机会。
随着越来越多的开发者依赖跨平台开发环境,WSL已成为Windows系统上不可或缺的工具。通过开源WSL,微软让开发者能够深入了解其工作原理、贡献新功能,并根据自己的需求进行自定义。
我们期待看到开源后的WSL如何继续发展,以及社区将如何塑造其未来。无论是提高性能、增强与Windows的集成还是添加新功能,WSL的开源将为开发者提供更多可能性。