赞
踩
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管理器)
如果是专业版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后,之前创建的虚拟交换机仍然会正常工作,不受影响。
在“控制面板->程序和功能->启用或关闭Windows功能”界面取消选中Hyper-V后,确定退出并重启计算机即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。