WSL在Linux开发过程中给开发人员提供了极大的便利,但同时存在一定的问题,就是IP地址不固定。对嵌入式开发人员来说,要求在固定的网络环境下对开发板进行调试,不太友好。因此笔者尝试对WSL实现桥接网络直连外部交换机,并关闭DHCP固定它的IP地址。
要实现上述功能有两种方式,一种是临时对WSL的虚拟交换机进行修改,每次重启计算机后会重置;另一种是新建一个虚拟网络交换机,用来实现桥接网络,做好配置则可以保证其永久生效。
临时生效方案
使用管理员权限运行powershell,运行“Get-NetAdapter | fl”获得网卡列表,从中选择需要桥接到的网卡(必须是物理网卡),笔者电脑上的物理网卡名叫WLAN。
Get-NetAdapter | fl
在Windows系统下创建文本文档WSL2.bat,并填入以下内容(注意网卡名要填自己电脑上的,Ubuntu要改为自己主机上的子系统名称,且IP地址要和桥接的外部网卡在同一网段,路由地址应为外部网卡的网关地址)
powershell -c "Set-VMSwitch WSL -NetAdapterName WLAN"
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.0.205/24 broadcast 192.168.0.255 dev eth0
wsl -d Ubuntu -u root ip route add 0.0.0.0/0 via 192.168.0.1 dev eth0
wsl -d Ubuntu -u root echo nameserver 192.168.0.1 ^> /etc/resolv.conf
wsl -d Ubuntu -u root service ssh start
保存后,使用管理员身份运行WSL2.bat,运行结束后,进入WSL子系统,运行ifconfig查看是否修改成功。
如果修改成功则显示如上图,但这种修改是临时的,意味着下次重启计算机后,设置又会被复位,因此每次重启都需要以管理员身份运行上述脚本。如果嫌麻烦,可以将脚本配置进开机启动项,这样就不需要人为操作了。
永久生效方案
上述临时生效方案虽然可以将脚本配置成开机启动解决,但终归有些不太方便。出于追求完美的考虑,笔者还是尝试桥接网络的永久生效方案。(注意,永久生效方案需要Hyper-V管理器的支持,配置不高的电脑慎用,会卡到怀疑人生,如果实在想尝试,建议在装好虚拟交换机后卸载Hyper-V管理器)
安装Hyper-V管理器
如果是专业版Windows操作系统,可以直接在“控制面板->程序和功能->启用或关闭Windows功能”界面选中Hyper-V后,确定退出并重启计算机。
如果是家庭版Windows系统,则需要通过脚本进行安装,创建如下脚本"Hyper-V.bat"
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hv.txt
for /f %%i in ('findstr /i . hv.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hv.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
Pause
保存后以管理员身份运行Hyper-V.bat,安装Hyper-V管理器,安装完成后重启计算机。
安装完成后,可在Windows搜索栏内搜索Hyper-V管理器,打开后界面如上图所示。
创建桥接网络虚拟交换机
按照下图标示的步骤创建虚拟交换机,将其命名为WSLBridge。
修改配置文件
使用快捷键Win+R唤出运行窗口,在打开栏内填入%USERPROFILE%并在打开的文件夹内创建配置文件".wslconfig",并在该配置文件内输入以下内容。
[wsl2]
vmIdleTimeout=-1
networkingMode=bridged
vmSwitch=WSLBridge
ipv6=true
dhcp=false
进入wsl的Ubuntu子系统,打开/etc/wsl.conf,若文件不存在则创建
sudo vim /etc/wsl.conf
在wsl.conf配置文件内填入以下内容
[boot]
systemd = true
[network]
generateHosts = false
generateResolvConf = false
检查/etc/systemd/network/,若文件夹下没有文件则创建一个配置文件my-network.conf,若文件夹下有文件则忽略此步骤。
sudo vim /etc/systemd/network/my-network.conf
在my-network.conf文件内填入以下内容
[Match]
Name=en*
[Network]
DHCP=ipv4
重启networkd
sudo systemctl restart systemd-networkd.service
打开配置文件/etc/netplan/00-wsl2.yaml,如果不存在就创建。
sudo vim /etc/netplan/00-wsl2.yaml
在00-wsl2.yaml文件内填入以下格式的内容
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses: [静态IP地址/子网掩码]
gateway4: 网关IP地址
nameservers:
addresses: [DNS服务器IP地址1, DNS服务器IP地址2]
举例如下:
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses: [192.168.0.205/24]
gateway4: 192.168.0.1
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
然后使用sudo netplan apply
应用新的网络设置,重启WSL2子系统即可。(出现类似以下报错可忽略)
重启后,wsl子系统的IP地址将不再随机变化,且直接桥接到外部局域网,可更方便地用于进行网络调试以及嵌入式开发。(用这个方案可永久生效,只需配置一次)
卸载Hyper-V管理器
由于Hyper-V管理器给笔者的笔记本电脑造成了较大的负荷,所以笔者决定将其卸载,以释放一定的计算资源。卸载Hyper-V后,之前创建的虚拟交换机仍然会正常工作,不受影响。
在“控制面板->程序和功能->启用或关闭Windows功能”界面取消选中Hyper-V后,确定退出并重启计算机即可。文章来源:https://www.toymoban.com/news/detail-744383.html
文章来源地址https://www.toymoban.com/news/detail-744383.html
到了这里,关于WSL实现桥接网络并固定IP地址的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!