wsl 与 wsl2
WSL(Windows Subsystem for Linux)是微软开发的兼容层,允许在Windows系统上原生运行Linux二进制文件。其发展经历了三个阶段:
- WSL1(2016年发布)
- 基于系统调用转译层(syscall translation layer)
- 通过lxss.sys驱动实现Linux系统调用到Windows NT API的实时转换
- 文件系统采用DrvFS实现跨系统文件互操作
- 网络栈与Windows共享,使用相同IP地址
- WSL2(2019年发布)
- 基于轻量级Hyper-V虚拟机
- 完整Linux内核(有修改,源码见微软WSL2-Linux-Kernel仓库)
- 虚拟化方案优化:动态内存分配(默认使用80%物理内存)、快速启动(<2秒)
- 采用9P文件系统协议实现跨系统文件访问
- WSLg(2021年新增)
- 基于Wayland协议和RDP远程桌面
- 支持OpenGL 4.6和Vulkan 1.2图形加速
- 音频支持通过PulseAudio协议转发
由于 wsl 已经基本停止支持,以下 wsl 均指代 wsl2
wsl 2 安装
wsl 2 又分为 in-box version 和 application version 两种安装方式^wsl version。
其中 in-box 版本就是 Windows 10 在系统中自带的版本,可以通过开启 Windows 功能来安装。这种方式安装的 wsl 版本号与 Windows 版本绑定,更新也依赖于 Windows 更新。
而 application 版本是通过 Microsoft Store 安装的版本,更新也依赖于 Microsoft Store。与 Windows 的版本无关,通常会包含最新的功能和性能优化。 通常来说,建议使用 application 版本。
安装 application version
直接在 Microsoft Store 中安装。
或者通过 winget :winget install 9P9TQF7MRM4R
安装 in-box version
- 启用 Windows 功能
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart - 安装 Linux 内核升级 https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
wsl --set-default-version 2- 安装所需的发行版
查看 wsl 版本
in-box 版本安装的 wsl 和 application 版本安装的 wsl 版本有一些区别,可以通过 wsl --version 确认安装的 wsl 版本。
配置
wsl 获取 Windows IP
wsl 会默认使用 Windows 机器作为 DNS Nameserver,因此可以利用这个机制在 wsl 中通过 cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }') 获取 windows 主机的 ip。
wsl 访问 Windows 服务
默认情况下,wsl 有自己独立的 IP 地址,因此 Windows 防火墙可能会阻止 wsl 访问 Windows 主机上的服务。
可以在 windows powershell 中执行 New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow 允许 wsl 通过防火墙访问 windows 主机。
Windows 访问 wsl 服务
默认情况下,wsl 上开放的端口会自动 forward 到 Windows 主机上,因此可以直接通过 localhost:port 访问 wsl 上的服务。
网络上的其他主机想要访问 wsl 上的服务时,可以设置 Windows 将请求转发到 wsl 上。 可能还需要同时开放 Windows 防火墙。
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=<wsl IP> connectport=2222
netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=2222