常用命令:

列出分发版
wsl -l , wsl --list
wsl --list --all
wsl --list --running
设置默认分发版
wsl -s Ubuntu
取消注册和重新安装分发版
注销后,与该分发关联的所有数据、设置和软件都将永久丢失。 从 Store 重新安装会安装分发版的干净副本。
wsl --unregister <DistributionName>
wsl --unregister Ubuntu
将 WSL 2 设置为默认版本
wsl --set-default-version 2
用于管理适用于 Linux 的 Windows 子系统的参数
--export <分发版> <文件名>  将分发版导出到 tar 文件
--import <分发版> <安装位置> <文件名>  导入指定的 tar 文件作为新的分发版
--list、-l [选项]  列出分发版

wsl --shutdown
立即终止所有正在运行的发行版和 WSL 2 轻量级实用程序虚拟机
wsl --terminate Ubuntu  //关闭ubuntu

service docker status/start/restart

设置静态IP:

WSL2 采用 Hyper-V 的 Internal Virtual Switch,这个虚拟交换机本身是可以设置静态 IP 地址的,但是 WSL2 在每次全新启动的时候将网络配置恢复成 DHCP,这样不仅可能会造成局域网内网段的冲突,而且对于需要固定地址访问 WSL2 内服务的需求也带来了不少麻烦。

解决方案

注:以下解决方案适用于 Debian 系的发行版(如 Ubuntu 等),其它发行版可能需要自行适配。

既然 WSL2 会在启动时做网络适配器的配置,那么我们只需要在启动后重新为其配置网络就可以了。

首先,我们假定我们要将 WSL2 的网关设置为 192.168.50.1,并为 WSL2 分配 192.168.50.2 的 IP 地址,那么我们进入 WSL2 之后,执行以下命令即可:

sudo ip addr del $(ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | head -n 1) dev eth0
sudo ip addr add 192.168.50.2/24 broadcast 192.168.50.255 dev eth0
sudo ip route add 0.0.0.0/0 via 192.168.50.1 dev eth0
sudo echo nameserver 192.168.50.1 > /etc/resolv.conf

上述命令首先删除掉 WSL2 已经配置的 IP 地址,然后为其分配 192.168.50.2/24,最后配置路由并指定 DNS Server。

这样配置完成后,你会发现 WSL2 内连不了网了。这是因为我们还没有对 WSL2 使用的 Internal Virtual Switch 进行配置。

打开 PowerShell,执行以下命令:

Get-NetAdapter 'vEthernet (WSL)' | Get-NetIPAddress | Remove-NetIPAddress -Confirm:$False
New-NetIPAddress -IPAddress 192.168.50.1 -PrefixLength 24 -InterfaceAlias 'vEthernet (WSL)'
Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False
New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix 192.168.50.0/24;

上述命令中,首先找到 vEthernet (WSL) 这个网络适配器,然后将其所有已有的 IP 地址删除,然后为其添加 192.168.50.1/24 的 IP 地址。

最后设置 NAT:首先删除名字叫做 WSLNat 的 NAT(因为我们后续创建的 NAT 名字叫做 WSLNat,这些命令每次启动系统后都需要执行,因此可能系统中已经存在名为 WSLNat 的 NAT 了,为了防止冲突,如果存在的话就先删掉) ,然后创建一个名字叫做 WSLNat 的 NAT,设置内部地址为 192.168.50.0/24

上述命令全部执行完成后,WSL2 将恢复网络连接。

查看并测试一下 WSL2 内的网络

再看看 Windows 下 Virtual Switch 的网络配置,并访问 WSL2 看看:

> get-netadapter 'vEthernet (WSL)' | get-netipaddress

IPAddress         : 192.168.50.1
InterfaceIndex    : 62
InterfaceAlias    : vEthernet (WSL)
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Preferred
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : ActiveStore

> get-netnat 'WSLNat'

Name                             : WSLNat
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 192.168.50.0/24
IcmpQueryTimeout                 : 30
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpIdleSessionTimeout            : 120
UdpInboundRefresh                : False
Store                            : Local
Active                           : True

> ping 192.168.50.2

至此,你可以通过 192.168.50.2 从 Windows 下访问 WSL2(由于 Windows 会为 WSL2 自动配置端口转发,因此也可以直接访问 localhost 访问里面的应用),通过 192.168.50.1 从 WSL2 访问 Windows 了。

一键运行解决方案

由于每次重新启动 WSL2(指完全重新启动,即重新启动了 Windows 或者通过 wsl --shutdown 彻底停止 WSL2 后的首次启动,如果只是切出去的话那不需要)都需要执行一次,不如保存成脚本文件方便使用:

wsl -d Ubuntu -u root ip addr del $(ip addr show eth0 ^| grep 'inet\b' ^| awk '{print $2}' ^| head -n 1) dev eth0
wsl -d Ubuntu -u root ip addr add 192.168.50.2/24 broadcast 192.168.50.255 dev eth0
wsl -d Ubuntu -u root ip route add 0.0.0.0/0 via 192.168.50.1 dev eth0
wsl -d Ubuntu -u root echo nameserver 192.168.50.1 ^> /etc/resolv.conf
powershell -c "Get-NetAdapter 'vEthernet (WSL)' | Get-NetIPAddress | Remove-NetIPAddress -Confirm:$False; New-NetIPAddress -IPAddress 192.168.50.1 -PrefixLength 24 -InterfaceAlias 'vEthernet (WSL)'; Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False; New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix 192.168.50.0/24;"

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐