WSL2常用命令、设置静态 IP 地址
常用命令:列出分发版wsl -l , wsl --listwsl --list --allwsl --list --running设置默认分发版wsl -s Ubuntu取消注册和重新安装分发版注销后,与该分发关联的所有数据、设置和软件都将永久丢失。 从 Store 重新安装会安装分发版的干净副本。wsl --unregister <DistributionName>wsl --unr
常用命令:
列出分发版
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;"
更多推荐
所有评论(0)