wsl2设置网络桥接到物理网卡

2024/12/28

Tags: wsl2 windows

Table of Contents

0. 前言

前几个月已经探索了通过x11 转发, 在windows与mac os上通过ubuntu docker 镜像,运行具有gpu加速的ubuntu gui程序

但是在windows上有更直接的选择, 那就是通过wsl2 运行ubutnu的linux 子系统, 这种方式,可以通过在docker desktop中设置与具体的wsl2 发行版集成, 让windows和wsl2 发行版使用同一个docker socket,共享一个docker engine

docker 也更建议把docker与wsl2一起使用, 此方案应有更多的性能红利和社区支持红利

由于我将在windows上通过wsl2 ubuntu运行的程序会使用udp广播来发现局域网中的设备,所以不能使用wsl默认的nat网络,否则udp广播刚不能传达到局域网的设备端. 所以我探索了设置wsl 网络桥接物理网卡的方式,并记录在此,留痕

此方法需要

限制

如果将来在windows 10测试验证, 将会更新些文档

1.windows家族版安装hyper-v

通常安装hyper-v的方式是在程序中打开windows功能,选中hyper-v,确定安装,不过如果你是windows 家庭版,那么在打开windows功能的界面中不会有hyper-v的选项,需要用以下方式安装

创建 hyper-v.bat

1
2
3
4
5
6
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
pause

使用命令提示符或powershell运行这个脚本即可进行安装

2. 创建hyper-v 虚拟交换机网络

然后运行hyper-v后,在右边点创建虚拟交换机,选择外部网络,并设置wsl需要使用的物理网卡, 将名称修改为自己想定义的名称,我这里命名为 wsl-net

image-20241229131345931

在powershell 使用Get-NetAdapter,或ncpa.cpl命令可以查看创建的虚拟机网络名称为 vEthernet(wsl-net), 为了方便配置,我们重命名它为wsl-net (直接在ncpa.cpl打开的网络适配器窗口右键重命名即可)

1
2
3
4
PS C:\WINDOWS\system32> Get-NetAdapter

Name                      InterfaceDescription                    ...
vEthernet (wsl-net)       Hyper-V Virtual Ethernet Adapter #3     ...

修改完还是在powershell中命令Get-NetAdapter验证一下

1
2
3
4
PS C:\WINDOWS\system32> Get-NetAdapter

Name                      InterfaceDescription                    ...
wsl-net                   Hyper-V Virtual Ethernet Adapter #3     ...

3. 配置wsl配置文件,使用虚拟交换机网络

在配置之前,进入wsl中查看网络为

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
DESKTOP-E31FB3M:/mnt/host/c/Users/kokbi# ip  a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:15:5d:b5:ac:4f brd ff:ff:ff:ff:ff:ff
    inet 172.28.219.98/20 brd 172.28.223.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:feb5:ac4f/64 scope link
       valid_lft forever preferred_lft forever

3.1 win11

在用户目录中修改.wslconfig (如果没有则创建)

1
2
3
4
5
[WSL2]
networkingMode=bridged
vmSwitch=external
dhcp=false
localhostForwarding=True

3.2 win10

参考

win10不支持通过配置文件直接配置虚拟交换机网络,所以只能通过修改默认的wsl网络来达到桥接的目的

超级管理员权限的powershell中执行

1
Set-VMSwitch -name "WSL" -NetAdapterName "WLAN" -AllowManagementOS $true

在wsl 中执行刷新ip地址和dhcp获取ip地址

1
2
ip addr flush dev eth0
dhclient eth0

如果需要网上冲浪,还需要配置一下dns

1
sudo echo "nameserver 8.8.8.8" > /etc/resolv.conf

如果想切换回NAT网络 ,设置在具有超级管理员权限的powershell中执行

1
Set-VMSwitch WSL -SwitchType Internal

更进一步设置到wsl里的/etc/wsl.conf,在wsl启动时将自动执行脚本

1
2
3
4
5
[boot]
systemd=true
command = "/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe -Command 'Set-VMSwitch -name "WSL" -NetAdapterName "WLAN" -AllowManagementOS $true'; ip addr flush dev eth0; dhclient eth0"
[network]
generateResolvConf = false

等验证, 如果修改了默认的wsl网络,在wsl 关掉,重启电脑后会造成的影响需要观察,

从上方github的链接中看他们在wsl开启后才修改为桥接,并在wsl shutdown后,马上就把网络修改回NAT模式了.

>> Home

Comments