1. 为什么需要从WSL1升级到WSL2?
Windows Subsystem for Linux(WSL)是微软在Windows 10和Windows 11上提供的Linux兼容层。WSL1和WSL2虽然名字相似,但架构完全不同。WSL1本质上是一个翻译层,它将Linux系统调用转换为Windows系统调用。而WSL2则是一个轻量级的虚拟机,运行真正的Linux内核。
WSL2相比WSL1有几个关键优势:
- 完整的系统调用兼容性:WSL2使用真实的Linux内核,可以运行Docker等需要特定内核功能的应用程序
- 文件系统性能:在Linux文件系统操作上,WSL2比WSL1快得多(特别是git操作、npm安装等)
- 内存管理:WSL2有更高效的内存管理机制
- 网络功能:支持完整的网络栈和本地主机连接
注意:如果你的工作主要涉及跨Windows和Linux文件系统的操作(比如频繁在/mnt/c下工作),WSL1的文件访问性能可能反而更好。
2. 升级前的准备工作
2.1 系统要求检查
在开始升级前,需要确认你的系统满足以下要求:
- Windows 10版本1903或更高版本(内部版本18362或更高)
- 对于x64系统:版本19041或更高
- 虚拟化功能已启用(在BIOS中开启VT-x或AMD-V)
可以通过Win+R运行winver命令查看当前Windows版本。
2.2 启用必要的Windows功能
以管理员身份打开PowerShell,运行以下命令:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart完成后需要重启计算机。
2.3 安装WSL2内核更新包
从微软官网下载并安装WSL2 Linux内核更新包: https://aka.ms/wsl2kernel
这个包大约50MB,安装过程很简单,一路点击"下一步"即可。
3. 将现有WSL1发行版转换为WSL2
3.1 查看当前WSL版本
在PowerShell中运行:
wsl -l -v这会列出所有已安装的Linux发行版及其当前运行的WSL版本。输出类似:
NAME STATE VERSION * Ubuntu-20.04 Stopped 13.2 设置默认WSL版本
在转换特定发行版前,建议先设置默认使用WSL2:
wsl --set-default-version 23.3 转换现有发行版
对于每个要转换的发行版,使用以下命令:
wsl --set-version <发行版名称> 2例如:
wsl --set-version Ubuntu-20.04 2转换过程可能需要几分钟时间,具体取决于发行版的大小。
提示:如果转换过程中遇到问题,可以尝试先导出再导入发行版:
wsl --export Ubuntu-20.04 Ubuntu-20.04.tar wsl --unregister Ubuntu-20.04 wsl --import Ubuntu-20.04 C:\WSL\Ubuntu-20.04 Ubuntu-20.04.tar --version 2
4. WSL2的常见问题与解决方案
4.1 网络访问问题
WSL2使用虚拟网络,与主机不在同一个网络栈。这意味着:
- 从Windows访问WSL2中的服务:使用
localhost(最新版本已支持) - 从WSL2访问Windows中的服务:使用
host.docker.internal或Windows主机的IP
可以通过在WSL2中运行cat /etc/resolv.conf查看nameserver,这就是Windows主机的IP。
4.2 文件系统性能
虽然WSL2的Linux文件系统性能很好,但访问Windows文件系统(/mnt/c等)的性能可能不如WSL1。如果需要在Windows和Linux之间频繁操作文件,可以考虑:
- 将项目放在Linux文件系统中(如~/projects)
- 使用VS Code的Remote - WSL扩展直接在WSL中编辑文件
4.3 内存使用
WSL2默认会使用最多50%的物理内存。如果发现内存占用过高,可以在用户目录下创建或修改.wslconfig文件:
[wsl2] memory=4GB swap=2GB然后运行wsl --shutdown重启WSL2使配置生效。
5. WSL2的高级配置与优化
5.1 使用自定义内核
WSL2默认使用微软提供的内核,但你也可以使用自己编译的内核:
- 从https://github.com/microsoft/WSL2-Linux-Kernel获取源码并编译
- 在
.wslconfig中指定内核路径:
[wsl2] kernel=C:\\path\\to\\your\\kernel5.2 启用systemd
WSL2默认不使用systemd,但可以通过以下方式启用:
- 在
/etc/wsl.conf中添加:
[boot] systemd=true- 退出所有WSL实例
- 在PowerShell中运行
wsl --shutdown - 重新启动WSL
5.3 图形界面支持
WSL2支持运行图形界面程序,需要安装X Server(如VcXsrv):
- 安装VcXsrv并启动(勾选"Disable access control")
- 在WSL2中设置DISPLAY环境变量:
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0- 现在可以运行图形程序了,如
gedit或nautilus
6. 回退到WSL1
如果遇到兼容性问题需要回退,可以使用:
wsl --set-version <发行版名称> 1或者设置默认版本为WSL1:
wsl --set-default-version 1我在实际使用中发现,WSL2对于大多数开发场景都是更好的选择,特别是需要运行Docker或使用Linux特有功能时。唯一需要回退到WSL1的情况可能是需要高性能访问Windows文件系统中的文件。