用WSL打造一个轻便的Linux开发环境

Linux在开发中的很多方便特性是Windows无法比拟的(例如好用的包管理器,简单的环境变量配置等等)。但是Linux在生态支持上相比Windows仍然有所欠缺,因此直接装双系统也会面临诸多不便。此外,虚拟机的解决方案也太”重“。

WSL(Windows Subsystem for Linux)是一个运行在Windows当中的子系统,是在Windows环境中使用Linux的一个相对轻量级的解决方案(配置简单,资源占用低),可以视作是对软件兼容性和开发易用性的一个折中。微软也在对WSL进行持续的开发投入,让WSL变得更加完善。

WSL和WSL2的比较

WSL有两个大版本,二者主要区别如下:

Feature WSL 1 WSL 2
Integration between Windows and Linux
Fast boot times
Small resource foot print compared to traditional Virtual Machines
Runs with current versions of VMware and VirtualBox
Managed VM
Full Linux Kernel
Full system call compatibility
Performance across OS file systems

目前微软开发的开发支持更多针对WSL2,一些新特性也只有WSL2能得到支持(例如运行Linux GUI程序,GPU加速等),但是WSL并没有被放弃。

二者在很多方面有着不同,对新接触WSL的人而言比较重要的区别主要在如下几点:

  • WSL没有完整的Linux内核,而WSL有,某些依赖于Linux内核的操作在WSL中可能无法完成(例如某些网络功能,直接调用硬件等)
  • WSL对跨系统的文件操作性能更好(尤其是大量小文件的读写方面),而WSL2在Linux系统中的文件性能更好
  • WSL没有独立的网络配置,子系统和宿主使用相同的IP和端口,而WSL2拥有独立的IP和端口
  • 当前版本下WSL对资源占用相对较低,CPU性能相对更好
  • Windows任务管理器中可以显示WSL中的进程,而无法显示WSL2中的进程(真的有人会用任务管理器管理WSL进程吗)

二者的不同特性决定了它们的不同使用方式。

如果你只是厌倦了Windows中cmd、PowerShell这些工具的功能孱弱和语法孤岛,并享受Linux上方便的开发环境配置,日常使用以操作Windows中的文件为主(虽然这听起来很非主流但确实很爽),此外不需要用到完整Linux内核才能支持的功能,那么WSL是一个很好的解决方案。

如果你需要用到完整Linux内核中的一些特性(例如进行一些网络开发和调试),以及想使用上述的只有WSL2才支持的一些新特性,那么你必然会选择WSL2。

因此,WSL和WSL2并无绝对好坏之分(至少目前阶段仍然如此),关键是要找准自身需求。当然,你完全可以安装多个Linux发行版,某些发行版用于简单替代Windows开发环境,另外的则用于一些对WSL2独有特性的需求。

更多关于WSL和WSL2的区别和比较可以参考:

Comparing WSL 1 and WSL 2 | Microsoft Docs

WSL 和 WSL2 简单对比 - V2EX

互操作性

Windows中的磁盘和文件在WSL中挂载在 /mnt/* ,可以直接使用Linux中的命令对Windows系统中的文件进行操作。

但是Windows中的文件权限在WSL中默认都是777,这在某些场景下可能会带来麻烦。

另外,考虑到WSL和WSL2在文件系统方面的不同特性,在WSL中可以比较简单地直接访问Windows中的文件,而对于WSL2,最好还是直接将文件放在Linux目录中而不是挂载目录。

WSL中可以可以执行Windows命令,甚至能将Windows和Linux命令结合起来:

1
C:\temp> dir | wsl grep git

不过互操作性有时候也会导致一些混乱,好在可以禁用互操作性。

更多内容参考微软官方文档:

Windows interoperability with Linux | Microsoft Docs

安装WSL

关于安装过程微软官方文档中已经有非常详细的说明:

Install WSL on Windows 10 | Microsoft Docs

关于WSL和WSL的版本管理与切换可以参考:

Set Your Distribution Version to WSL 1 or WSL 2 | Microsoft Docs

从WSL切换到WSL2的过程中可能需要额外安装一些程序,按照提示完成即可

在WSL中使用VS Code

直接在终端中编辑代码对大部分人来说是一件痛苦的事情,但是可以通过VS Code结合一些插件,在VS Code中打开WSL中的项目,提升开发效率。

微软官方文档中给出了开发环境的配置方法:

Get started using VS Code with WSL | Microsoft Docs

在WSL中,输入 code . 就可以调用Windows系统中的VS Code打开当前文件夹,剩下的操作几乎和在本地开发没有任何区别(如果你使用的是WSL2,在打开本地的大型项目时可能会感到一些卡顿)

在WSL2中运行Linux GUI程序

NOTE: 仅Windows 11 + WSL2 支持

具体过程微软官方文档同样说得非常详细,这里只总结大致流程:

  1. 安装显卡的WSL驱动
  2. 运行 wsl --update 更新WSL
  3. 安装并运行Linux GUI程序

Run Linux GUI apps with WSL | Microsoft Docs

在WSL2中使用GPU加速

NOTE: 仅Windows(Build 20150 or higher) + WSL2 支持

2020年发布这一新功能,参考开发者博客:

GPU accelerated ML training inside the Windows Subsystem for Linux - Windows Developer Blog

微软官方文档上给出了开发指南:

GPU acceleration in WSL | Microsoft Docs

IPv6支持

WSL2目前还不支持IPv6,要使用IPv6特性只能使用WSL1(直接用宿主机的IP和端口号)

Comparing WSL 1 and WSL 2 | Microsoft Docs