- A+
WSL2-CentOS7固定IP
WSL2 采用 Hyper-V 的 Internal Virtual Switch,这个虚拟交换机本身是可以设置静态 IP 地址的,但是 WSL2 却自作聪明,在每次全新启动的时候将网络配置恢复成 DHCP,这就导致WSL2每次全新启动后的IP都不固定,如果需要一个固定的IP,需要做一些设置。
备注:如果使用localhost方式可正常访问的话,可不做此固定IP配置;我是在win11中使用IDEA配置远程访问docker地址localhost:2375时无法连接,才进行配置的;实测在win10中可正常连接。
前置设置
因为WSL2每次全新启动的时候将网络配置恢复成DHCP;重新生成网关和IP ;为了使我们的自定义IP能生效;我们需要对WSL2进行配置,阻止它每次重新配置网关;如果不进行此配置,即使自定义了IP,在WSL2启动后一段时间,自定义IP会被自动生成的IP进行覆盖而无法生效。配置方法如下:
进入WSL2,使用命令查看:cat /etc/resolv.conf
如图所示,我们可以看到,配置文件注释说明得很清楚:这个文件为WSL自动生成;如果不想生成这个文件,需要添加配置文件。
因此,我们按注释的意思,使用命令新建配置文件:vim /etc/wsl.conf
;配置文件内容为:
[network] generateResolvConf = false
增加此配置后,则不会再自动生成此文件。
由于原来的/etc/resolv.conf是可能是一个软链接(链接到/run/resolvconf/resolv.conf);不管是真实文件还是软链接,我们都需要删除它,为后面脚本进行自定义DNS做准备
执行删除命令:rm /etc/resolv.conf
至此,WSL2固定IP的前置设置完成
创建批处理文件设置静态IP
完成前面的设置后,我们需要在windows创建一个 set_static_ip.bat
批处理脚本进行IP设置,脚本内容如下:
@echo off rem 以管理员身份运行 %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit rem 需要设置的子系统名称 set linux=CentOS7 rem 设置网段 set localnet=192.168.86 rem 设置子系统的ip set ip=%localnet%.2 wsl -d %linux% -u root ip addr del $(ip addr show eth0 ^| grep 'inetb' ^| awk '{print $2}' ^| head -n 1) dev eth0 wsl -d %linux% -u root ip addr add %ip%/24 broadcast %localnet%.255 dev eth0 wsl -d %linux% -u root ip route add 0.0.0.0/0 via %localnet%.1 dev eth0 wsl -d CentOS7 -u root echo "nameserver %localnet%.1" ^> /etc/resolv.conf powershell -c "Get-NetAdapter -IncludeHidden -Name 'vEthernet (WSL)' | Get-NetIPAddress | Remove-NetIPAddress -Confirm:$False; New-NetIPAddress -IPAddress %localnet%.1 -PrefixLength 24 -InterfaceAlias 'vEthernet (WSL)'; Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False; New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix %localnet%.0/24" exit
脚本中的子系统名称和网段可根据实际情况修改;双击执行此脚本可完成WSL2的静态IP设置
开机自动设置
由于每次重新启动Windows系统都需要执行一次这个脚本来设置静态IP ;为了方便,我们需要一些设置来实现开机自动执行脚本;有两种方式,可根据需要选择:
-
方式一:
把
set_static_ip.bat
批处理脚本放到windows开机启动目录下C:Users用户名AppDataRoamingMicrosoftWindowsStart MenuProgramsStartup
实现开机自动执行;需要注意的是,请把路径中的 "用户名" 替换为实际的用户名 -
方式二:
在WSL2中使用命令编辑
vim ~/.bashrc
;在最后添加如下内容:if [ `hostname -I` != 192.168.8.2 ]; then cmd.exe /c "D:set_static_ip.bat" 1>nul fi
注意:此方式实现是的在WSL2启动时设置IP,且只适用于从windows应用商店下载安装的WSL2分发版本,因为只有是从windows应用商店下载安装的WSL2分发才可能调用cmd.exe;而其他方式(例如从github下载)安装的WSL2分发则可能无法直接调用cmd.exe
Host映射
在windows的host文件(C:WindowsSystem32driversetchosts)添加如下内容:192.168.86.2 windows.wsl
在WSL2的host文件添加如下内容:(/etc/hosts)添加如下内容:192.168.86.1 windows.local
添加Host映射后,可实现windows和wsl互ping及互相访问的能力;不添加映射,根据IP也可能互相访问;只是映射后,主机名更容易记住。