前言
WSL1 是基于代理的虚拟化技术,它通过将 Linux 系统调用转换为 Windows 系统调用来实现与 Windows 内核的交互。WSL2 则使用了真正的虚拟机技术,它在 Windows主机 上运行一个轻量级的 Linux 内核。
WSL2 无法访问 Windows 的 localhost 网络是由 WSL2 的网络架构所致。WSL2 使用了一个虚拟网络适配器来与 Windows 主机进行通信,这导致 WSL2 无法直接访问 Windows 的 localhost 网络。因此,以往的 WSL2 在访问 Windows 网络时需要将其当作 LAN 的另一个设备,而 Windows 宿主则可以把 WSL 当作本机设备。这导致了很多问题,尤其是梯子方面的。
WSL2 2.0 引入的镜像网络可以解决 localhost 访问问题。启用镜像网络后,WSL2 和 Windows 主机将使用相同的网络,并且可以通过 localhost 访问本机系统上的服务。这意味着你可以在 WSL2 中访问本机系统上运行的应用程序,以及通过本机系统访问在 WSL2 中运行的应用程序。
配置
在Windows的资源管理器的地址栏输入: %UserProfile%
,即可打开当前用户的主目录,创建文件: .wslconfig
[wsl2]
memory=4GB # 分配给 WSL 2 的内存大小
processors=2 # 分配给 WSL 2 的 CPU 核心数
localhostForwarding=true # 是否启用 localhost 转发
[experimental]
autoMemoryReclaim=gradual # 开启自动回收内存,可在 gradual, dropcache, disabled 之间选择
networkingMode=mirrored # 开启镜像网络
dnsTunneling=true # 开启 DNS Tunneling
firewall=true # 开启 Windows 防火墙
autoProxy=true # 开启自动同步代理
sparseVhd=true # 开启自动释放 WSL2 虚拟硬盘空间
重启WSL
管理员身份运行PowerShell:
- 停止WSL:
wsl --shutdown
- 启动WSL:
wsl
之后就可以在 wsl 中使用 localhost 的方式来访问宿主机上的服务了。
curl http://localhost
其他命令
- 在WSL中查看宿主机的IP:
cat /etc/resolv.conf
,输出中 nameserver 后面的地址即是宿主机的IP地址。