当前位置: 首页 > news >正文

WSL2固定IP与Hyper-V虚拟机组建稳定开发网络实战

1. 项目概述与核心痛点

如果你在Windows上同时使用WSL2和Hyper-V虚拟机,大概率遇到过这个让人头疼的场景:每次重启电脑或WSL2实例,它的IP地址就变了。这不仅仅是记不住IP的小麻烦,它直接切断了你精心搭建的开发环境。比如,你在Windows主机上用IDE调试,需要连接到WSL2里的数据库;或者你的某个服务跑在Hyper-V的虚拟机里,需要和WSL2里的另一个微服务通信。一旦IP变动,所有的配置、连接字符串、防火墙规则全都失效,你得像个侦探一样重新查找IP,然后逐一修改,效率低到令人抓狂。

这个项目的目标,就是彻底终结这种混乱。我们要为WSL2分配一个在私有网络内固定的、静态的IP地址,并以此为基础,构建一个稳定的三角通信网络:让Windows主机、WSL2 Linux子系统、以及Hyper-V虚拟机三者之间能够像在同一个局域网内的三台独立机器一样,通过固定的IP地址可靠、高效地互相访问。这不仅仅是“固定IP”,更是搭建一个可靠的本地开发与测试网络的基础设施。下面,我就把自己趟过坑、验证可行的全套方案拆解给你,从原理到实操,一步不落。

2. 网络架构设计与原理剖析

2.1 WSL2网络模型的“动态”本质

要解决问题,得先理解问题是怎么来的。WSL2默认的网络模式可以理解为一种高度集成的“NAT网络”。微软为了让WSL2开箱即用、无需复杂配置,创建了一个轻量级的虚拟交换机(通常叫WSL)和一个虚拟NAT设备。每次启动WSL2时,这个虚拟网络设备会从192.168.0.0/16这类私有网段中,动态分配一个IP地址给WSL2的虚拟网卡(比如eth0)。同时,Windows主机会在这个虚拟网络上获得一个固定的、通常是192.168.0.1的IP,作为WSL2实例的默认网关和DNS服务器。

这种设计的优点是简单,但动态分配就是“不稳定”的代名词。虽然主机到WSL2的通信通过localhost转发通常没问题,但反向(WSL2访问主机特定服务)或第三方(Hyper-V VM访问WSL2)需要IP地址时,动态IP就成了绊脚石。

2.2 实现固定IP的核心思路:自定义虚拟网络

我们的核心策略是“另起炉灶”,不让WSL2使用默认的动态网络,而是为它创建一个我们拥有完全控制权的、静态配置的虚拟网络。这个网络将作为连接主机、WSL2和Hyper-V虚拟机的共同桥梁。

具体来说,我们需要在Windows的Hyper-V管理器中(即使你不直接运行Hyper-V虚拟机,WSL2也依赖Hyper-V平台)创建一个新的外部虚拟交换机。这里的关键是选择“外部网络”类型,并绑定到你主机物理网卡(比如Wi-Fi或以太网卡)上。这样做的目的是让这个虚拟交换机能够桥接到你的物理网络,从而让连接到这个交换机的所有设备(包括后续的Hyper-V虚拟机)和你的主机处于同一个二层网络广播域内。然后,我们通过修改WSL2的配置文件,强制它使用我们新建的这个虚拟交换机,并在这个交换机所关联的网络中,为WSL2的虚拟网卡手动配置一个静态IP地址。

2.3 三角通信的路由与防火墙考量

固定IP只是第一步。要实现三方互通,还需要解决路由和防火墙问题。

  1. 路由:由于我们创建的是外部交换机,理论上主机、WSL2、Hyper-V虚拟机三者的IP会在同一个网段(例如192.168.31.0/24)。它们之间的通信是二层交换,不需要额外配置路由。这是最理想、最简洁的情况。
  2. 防火墙:这是最容易导致“ping不通”的隐形杀手。Windows Defender防火墙默认会阻止许多入站连接。当你从WSL2或Hyper-V虚拟机去访问Windows主机上的服务(如SQL Server、Redis、Web API)时,必须在主机防火墙上为对应的端口添加入站规则,允许来自我们静态IP网段的连接。

注意:有些教程会教你完全关闭防火墙,这是极不安全的做法,尤其对于开发机可能连接外网的情况。我们的原则是“精确放行”,只打开需要的端口。

3. 环境准备与前置检查

在开始动手之前,请确保你的环境满足以下条件,并完成检查。

3.1 系统与功能要求

  • Windows版本:Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11。这是支持WSL2完整功能的基础。
  • WSL2已安装并启用:在PowerShell(管理员身份)中运行wsl --list --verbose,确认WSL版本为2,并且至少有一个Linux发行版(如Ubuntu)已安装。
  • Hyper-V平台已启用:即使你不直接使用Hyper-V管理器,WSL2也需要Hyper-V的底层支持。在“控制面板->程序->启用或关闭Windows功能”中,确保“Hyper-V”和“Windows虚拟机监控程序平台”已被勾选启用。启用后需要重启电脑。
  • 虚拟化已开启:进入电脑BIOS/UEFI设置,确保Intel VT-x或AMD-V虚拟化技术已启用。

3.2 关键信息收集

记录下你当前的环境信息,方便后续对照和排错:

  1. 主机物理网卡名称

    • 打开“控制面板->网络和共享中心->更改适配器设置”。
    • 找到你正在连接互联网的网卡(如“WLAN”对应无线,“以太网”对应有线)。
    • 记下它的名称,比如“Realtek PCIe GbE Family Controller”。我们后续创建虚拟交换机会用到。
  2. 当前WSL2 IP信息

    • 启动你的WSL2发行版(例如Ubuntu)。
    • 运行命令ip addr show eth0。你会看到类似inet 172.24.32.156/20的输出。这个172.24.32.156就是当前动态分配的IP,而/20是子网掩码信息。
    • 在WSL2里运行cat /etc/resolv.conf,查看当前的DNS服务器,通常是Windows主机的IP(如192.168.0.1)。
  3. 规划静态IP网段

    • 非常重要:你必须选择一个与你当前主机所在物理网络不同的IP网段,以避免IP冲突。
    • 如何选择:在Windows命令提示符里运行ipconfig,查看你物理网卡的IPv4地址。例如,如果你的主机IP是192.168.31.45,子网掩码是255.255.255.0,那么你的物理局域网网段就是192.168.31.0/24
    • 安全网段:为此项目选择一个不同的私有网段,例如192.168.60.0/24。我们将在这个网段内分配IP。
    • IP分配方案
      • Windows主机虚拟网卡:192.168.60.1
      • WSL2 Linux子系统:192.168.60.100
      • Hyper-V 虚拟机:192.168.60.200(举例)
    • 子网掩码统一使用:255.255.255.0(即/24)。

4. 核心步骤:创建与配置静态虚拟网络

4.1 步骤一:创建Hyper-V外部虚拟交换机

这是构建我们自定义网络的物理基础。

  1. 管理员身份打开PowerShell

  2. 运行以下命令创建虚拟交换机。请将-NetAdapterName后面的参数替换为你之前记录的物理网卡名称

    New-VMSwitch -Name "WSL2StaticNet" -NetAdapterName "以太网" -AllowManagementOS $true
    • -Name "WSL2StaticNet":为你创建的虚拟交换机命名,后续配置会用到这个名字。
    • -NetAdapterName "以太网":指定绑定的物理网卡。如果是无线网卡,可能是“WLAN”。
    • -AllowManagementOS $true关键参数。这允许Windows主机操作系统(Management OS)也连接到这个交换机,从而获得一个虚拟网卡并分配IP(即我们规划的192.168.60.1)。
  3. 创建成功后,再次打开“控制面板->网络和共享中心->更改适配器设置”。你应该能看到一个新的网络连接,名字类似于vEthernet (WSL2StaticNet)。这就是主机连接到此虚拟交换机的虚拟网卡。

4.2 步骤二:为主机虚拟网卡配置静态IP

现在我们需要给Windows主机在这张新虚拟网卡上设置我们规划好的IP。

  1. 在“网络连接”窗口,右键点击vEthernet (WSL2StaticNet),选择“属性”。
  2. 双击“Internet 协议版本 4 (TCP/IPv4)”。
  3. 选择“使用下面的IP地址”:
    • IP地址:192.168.60.1
    • 子网掩码:255.255.255.0
    • 默认网关:留空(因为这是一个隔离的内部网络,不需要网关访问外网,外网访问通过物理网卡)。
    • DNS服务器:可以留空,或设置为公共DNS如8.8.8.8114.114.114.114。建议留空,主机会自动处理。
  4. 点击“确定”保存。

4.3 步骤三:配置WSL2使用静态IP

这是最关键的一步,我们需要创建WSL2的配置文件来覆盖默认网络行为。

  1. 在Windows用户目录下(通常是C:\Users\<你的用户名>\),创建一个名为.wslconfig的文件(注意前面有个点)。你可以用记事本或VS Code创建。

  2. 将以下内容写入.wslconfig文件:

    [wsl2] networkingMode=bridged vmSwitch=WSL2StaticNet ipv6=true
    • networkingMode=bridged:告诉WSL2使用桥接模式,连接到指定的虚拟交换机。
    • vmSwitch=WSL2StaticNet:指定要桥接到的虚拟交换机名称,必须与步骤4.1中创建的名称完全一致。
    • ipv6=true:启用IPv6支持,按需设置。
  3. 保存并关闭文件。

  4. 接下来,我们需要在每个WSL2发行版内部配置静态IP。这需要通过一个启动脚本实现。在WSL2的Linux发行版中(例如Ubuntu),编辑根目录下的启动脚本。通常我们可以放在/etc/profile.d/下,或者修改/etc/wsl.conf。这里我推荐一个更灵活的方式:创建自定义脚本。

    • 在WSL2中,创建脚本文件:sudo vim /usr/local/bin/set-static-ip.sh

    • 输入以下内容:

      #!/bin/bash # 删除eth0上可能存在的旧IP sudo ip addr flush dev eth0 # 为eth0添加静态IP和子网掩码 sudo ip addr add 192.168.60.100/24 broadcast 192.168.60.255 dev eth0 # 将eth0网卡启动 sudo ip link set dev eth0 up # 添加默认路由,网关指向主机虚拟网卡IP sudo ip route add default via 192.168.60.1 dev eth0 # 配置DNS,指向主机或公共DNS echo "nameserver 192.168.60.1" | sudo tee /etc/resolv.conf echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf # 防止WSL自动覆盖resolv.conf sudo chattr +i /etc/resolv.conf 2>/dev/null || true
    • 保存后,赋予执行权限:sudo chmod +x /usr/local/bin/set-static-ip.sh

    • 为了让这个脚本在每次WSL2启动时自动运行,编辑~/.bashrc文件(如果你用bash):vim ~/.bashrc

    • 在文件末尾添加一行:/usr/local/bin/set-static-ip.sh

  5. 重启WSL2:关闭所有WSL2窗口,回到Windows PowerShell(管理员),运行wsl --shutdown来完全终止WSL2后台虚拟机。然后重新启动你的Linux发行版。

  6. 启动后,在WSL2内运行ip addr show eth0,检查IP是否已变为192.168.60.100。运行ping 192.168.60.1,测试是否能通Windows主机。

4.4 步骤四:配置Hyper-V虚拟机加入同一网络

如果你有现成的Hyper-V虚拟机,需要将其网络也接入我们创建的WSL2StaticNet交换机。

  1. 打开Hyper-V 管理器
  2. 在右侧虚拟机列表中,右键点击目标虚拟机,选择“设置”。
  3. 在左侧选择“网络适配器”。
  4. 在右侧“虚拟交换机”下拉菜单中,选择我们之前创建的WSL2StaticNet
  5. 点击“确定”。
  6. 启动该Hyper-V虚拟机。在虚拟机内部(如Linux虚拟机),手动配置静态IP:
    • IP地址:192.168.60.200(按你的规划)
    • 子网掩码:255.255.255.0
    • 网关:192.168.60.1
    • DNS:192.168.60.18.8.8.8
    • 配置方法因虚拟机操作系统而异(如Ubuntu使用netplan,CentOS使用nmcli或修改网络配置文件)。

5. 通信测试与防火墙配置

配置完成后,必须进行全面的连通性测试。

5.1 基础连通性测试(Ping)

  1. 从 WSL2 测试
    • ping 192.168.60.1(Windows主机) - 应该成功。
    • ping 192.168.60.200(Hyper-V VM) - 应该成功。
  2. 从 Windows 主机测试
    • 打开命令提示符或PowerShell。
    • ping 192.168.60.100(WSL2) - 应该成功。
    • ping 192.168.60.200(Hyper-V VM) - 应该成功。
  3. 从 Hyper-V 虚拟机测试
    • ping 192.168.60.1(Windows主机) - 应该成功。
    • ping 192.168.60.100(WSL2) - 应该成功。

如果任何一步ping不通,首先检查IP配置是否正确,然后大概率是防火墙问题

5.2 配置Windows防火墙规则(关键步骤)

为了让WSL2和Hyper-V VM能访问主机上的服务,需要在Windows Defender防火墙中放行。

  1. 打开“Windows Defender 防火墙与高级安全”。
  2. 点击“入站规则” -> “新建规则...”。
  3. 规则类型选择“端口”,下一步。
  4. 选择“TCP”或“UDP”,根据你的服务需要。如果要放行所有测试,可以选“TCP和UDP”。在“特定本地端口”输入你需要开放的端口号,例如80,443,3306,6379,8080(用逗号分隔),或者直接放行ICMP(ping)用于测试。为了安全,建议按需开放,不要开放所有端口。这里以开放ICMP和几个常见端口为例。
  5. 下一步,选择“允许连接”。
  6. 下一步,保持所有配置文件(域、专用、公用)勾选,或者至少勾选“专用”。
  7. 下一步,给规则起一个易于识别的名字,例如“Allow_WSL2_HyperV_StaticNet”。
  8. 最关键的一步:创建完成后,在入站规则列表中找到你刚创建的规则,右键“属性”。
  9. 切换到“作用域”选项卡。
  10. 在“远程IP地址”部分,选择“下列IP地址”,然后点击“添加”。
  11. 添加我们静态网络的地址范围:192.168.60.0/24。这样规则只对这个网段的机器生效,安全性更高。
  12. 点击“确定”保存。

现在再进行ping测试,应该全部都能通过了。

5.3 应用层服务测试

基础网络通了之后,可以测试实际应用,这比ping更有说服力。

  • 场景一:WSL2中的Web服务供主机访问

    1. 在WSL2的Ubuntu里,安装并启动一个Nginx:sudo apt update && sudo apt install nginx -y && sudo systemctl start nginx
    2. 在Windows主机浏览器中访问http://192.168.60.100,应该能看到Nginx欢迎页。
  • 场景二:主机Redis供WSL2和Hyper-V VM访问

    1. 在Windows主机上安装Redis(如通过Windows版或WSL1版本),并配置其监听0.0.0.0(而不仅仅是127.0.0.1)。
    2. 在WSL2中,使用redis-cli -h 192.168.60.1尝试连接。
    3. 在Hyper-V VM中,同样尝试连接。
  • 场景三:WSL2与Hyper-V VM互访

    1. 在Hyper-V VM中启动一个简单的Python HTTP服务器:python3 -m http.server 8080
    2. 在WSL2中用curl http://192.168.60.200:8080访问。

6. 疑难杂症与深度排查指南

即使按照步骤操作,也可能遇到问题。这里是我踩过坑后总结的排查清单。

6.1 常见问题速查表

问题现象可能原因排查步骤与解决方案
WSL2启动后IP仍是172.x网段.wslconfig配置未生效或虚拟机未重启1. 检查.wslconfig文件路径和内容是否正确。
2. 运行wsl --shutdown彻底关闭,再重新启动WSL。
3. 检查Hyper-V虚拟交换机WSL2StaticNet是否创建成功。
能ping通主机(.1),但ping不通对方(.100或.200)防火墙阻止了ICMP回显请求1. 在Windows防火墙“高级安全”中,启用“文件和打印机共享(回显请求 - ICMPv4-In)”规则,并限制作用域为192.168.60.0/24
2. 或按5.2节创建自定义ICMP允许规则。
主机ping不通WSL2或Hyper-V VM目标系统(WSL2/VM)自身的防火墙未关闭1.在WSL2中sudo ufw disable(Ubuntu) 临时关闭防火墙测试。
2.在Hyper-V Linux VM中:检查firewalldiptables规则。
应用服务(如Web、Redis)无法访问防火墙未放行特定端口/服务未监听所有接口1. 按5.2节在Windows防火墙为特定端口创建入站规则。
2. 确认服务绑定地址为0.0.0.0,而非127.0.0.1。例如Redis配置中检查bind 0.0.0.0
WSL2内无法解析域名(无法上网)DNS配置错误或被覆盖1. 检查WSL2中/etc/resolv.conf,确认nameserver是192.168.60.1
2. 如果被覆盖,使用sudo chattr +i /etc/resolv.conf锁定文件(见4.3步骤脚本)。
3. 在Windows主机vEthernet适配器属性中,确保DNS已设置。
创建虚拟交换机时报错物理网卡名称错误/网卡被其他虚拟机占用1. 用Get-NetAdapter命令精确获取网卡名称。
2. 确保未同时运行VMware等使用同网卡的虚拟化软件。
Hyper-V VM获取不到IP或网络不通VM内网络配置错误/虚拟交换机未正确分配1. 在Hyper-V管理器检查VM设置,确认网络适配器连接到了WSL2StaticNet
2. 在VM内部,检查网络配置文件,确保静态IP配置正确,网关指向192.168.60.1

6.2 高级排查命令与工具

  • 查看网络拓扑:在PowerShell中运行Get-VMSwitchGet-VMNetworkAdapter -All,查看所有虚拟交换机和适配器的状态。
  • 追踪路由:在Windows上,tracert 192.168.60.100查看去往WSL2的路径。应该只有一跳。
  • 检查ARP表:在Windows上,arp -a查看ARP缓存,应该能看到192.168.60.100192.168.60.200对应的MAC地址。如果看不到,说明二层通信可能有问题。
  • 使用WSL2诊断命令wsl --status可以查看WSL2的整体状态和内核版本等信息。
  • 重置网络:如果一切混乱,可以尝试在PowerShell(管理员)中重置虚拟网络:Get-VMSwitch -Name \"WSL2StaticNet\" | Remove-VMSwitch -Force。然后从步骤4.1重新开始。注意这会断开所有连接。

6.3 关于.wslconfigwsl.conf的区分

这里容易混淆,明确一下:

  • .wslconfig:位于Windows用户目录(C:\Users\<用户名>),用于配置WSL2虚拟机本身的全局设置,如内存、CPU、网络模式等。我们用它来设置网络桥接。
  • wsl.conf:位于WSL2 Linux发行版内部(/etc/wsl.conf),用于配置该发行版内部的行为,如自动挂载、用户默认值等。它不能直接设置静态IP。

7. 方案优化与自动化脚本

手动配置虽然清晰,但每次WSL2发行版重置或更换,都需要重新操作。我们可以通过脚本实现自动化,让固定IP的配置变得坚固且可重复。

7.1 创建一体化的Windows配置脚本

在Windows上创建一个PowerShell脚本(例如setup_wsl_static_net.ps1),以管理员身份运行,一次性完成主机端设置:

# setup_wsl_static_net.ps1 # 请以管理员身份运行 # 1. 创建外部虚拟交换机 (请修改 -NetAdapterName 参数为你的网卡名) $switchName = "WSL2StaticNet" $physicalAdapter = "以太网" # 更改为你的网卡名,例如 “WLAN” Write-Host "正在创建虚拟交换机 $switchName ..." -ForegroundColor Yellow try { New-VMSwitch -Name $switchName -NetAdapterName $physicalAdapter -AllowManagementOS $true -ErrorAction Stop Write-Host "虚拟交换机创建成功。" -ForegroundColor Green } catch { Write-Host "创建虚拟交换机失败,可能已存在。错误信息: $_" -ForegroundColor Red # 可以选择强制删除后重建,这里仅提示 # Remove-VMSwitch -Name $switchName -Force } # 2. 为主机虚拟网卡配置静态IP $hostIP = "192.168.60.1" $subnetMask = "255.255.255.0" Write-Host "正在为主机虚拟网卡配置静态IP $hostIP ..." -ForegroundColor Yellow $adapter = Get-NetAdapter | Where-Object {$_.Name -like "*$switchName*"} if ($adapter) { # 移除可能存在的旧IP Remove-NetIPAddress -InterfaceAlias $adapter.Name -IPAddress $hostIP -Confirm:$false -ErrorAction SilentlyContinue # 设置新IP New-NetIPAddress -InterfaceAlias $adapter.Name -IPAddress $hostIP -PrefixLength 24 | Out-Null Write-Host "主机IP配置完成。" -ForegroundColor Green } else { Write-Host "未找到名为 *$switchName* 的适配器,请检查交换机是否创建成功。" -ForegroundColor Red } # 3. 创建或更新.wslconfig文件 $wslConfigPath = "$env:USERPROFILE\.wslconfig" $wslConfigContent = @" [wsl2] networkingMode=bridged vmSwitch=$switchName "@ Write-Host "正在配置.wslconfig文件..." -ForegroundColor Yellow Set-Content -Path $wslConfigPath -Value $wslConfigContent -Force Write-Host ".wslconfig文件已写入: $wslConfigPath" -ForegroundColor Green # 4. 创建基础的防火墙规则(放行ICMP用于测试) $firewallRuleName = "Allow_WSL2_HyperV_StaticNet_ICMP" Write-Host "正在配置防火墙规则..." -ForegroundColor Yellow # 检查规则是否存在,不存在则创建 if (-not (Get-NetFirewallRule -DisplayName $firewallRuleName -ErrorAction SilentlyContinue)) { New-NetFirewallRule -DisplayName $firewallRuleName ` -Direction Inbound ` -Protocol ICMPv4 ` -IcmpType 8 ` -RemoteAddress 192.168.60.0/24 ` -Action Allow ` -Enabled True | Out-Null Write-Host "防火墙ICMP规则创建成功。" -ForegroundColor Green } else { Write-Host "同名防火墙规则已存在,跳过创建。" -ForegroundColor Yellow } Write-Host "`n主机端配置完成!请重启WSL2 (运行: wsl --shutdown),并在WSL2内运行静态IP配置脚本。" -ForegroundColor Cyan

7.2 增强版WSL2内部启动脚本

将4.3步骤中的脚本改进一下,增加更健壮的逻辑(/usr/local/bin/set-static-ip.sh):

#!/bin/bash # 增强版静态IP设置脚本 set -e # 遇到错误立即退出 STATIC_IP="192.168.60.100" GATEWAY_IP="192.168.60.1" NETMASK="24" INTERFACE="eth0" # 函数:检查IP是否已配置 is_ip_configured() { ip addr show dev $INTERFACE | grep -q "inet $STATIC_IP/$NETMASK" } # 函数:配置IP和路由 configure_network() { echo "[$(date)] 正在配置静态网络..." # 清空现有配置(谨慎操作,在生产环境建议注释掉) # sudo ip addr flush dev $INTERFACE 2>/dev/null || true # 添加静态IP if ! is_ip_configured; then sudo ip addr add $STATIC_IP/$NETMASK brd + dev $INTERFACE echo " 已添加IP: $STATIC_IP/$NETMASK" else echo " IP $STATIC_IP 已存在,跳过添加。" fi # 启动网卡 sudo ip link set dev $INTERFACE up # 配置默认路由(如果不存在) if ! ip route show | grep -q "default via $GATEWAY_IP"; then sudo ip route add default via $GATEWAY_IP dev $INTERFACE echo " 已添加默认路由 via $GATEWAY_IP" fi # 配置DNS并防止被覆盖 if [ ! -f /etc/resolv.conf.bak ]; then sudo cp /etc/resolv.conf /etc/resolv.conf.bak fi echo "nameserver $GATEWAY_IP" | sudo tee /etc/resolv.conf > /dev/null echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf > /dev/null # 尝试锁定文件(某些发行版可能不支持chattr) sudo chattr +i /etc/resolv.conf 2>/dev/null || { echo " 注意: 无法锁定 /etc/resolv.conf,WSL可能会在启动时覆盖它。" echo " 可以考虑在 /etc/wsl.conf 中添加 [network] generateResolvConf = false 来禁止生成。" } echo "[$(date)] 网络配置完成。" echo "当前IP: $(hostname -I | awk '{print $1}')" echo "测试连通性: ping $GATEWAY_IP" } # 主逻辑 if [ "$(id -u)" -ne 0 ]; then echo "此脚本需要root权限,将使用sudo执行。" exec sudo bash "$0" "$@" fi configure_network

然后,将这个脚本的执行加入到~/.bashrc最后,并加上一个判断,避免在非交互式shell中重复执行:

# 在 ~/.bashrc 末尾添加 if [ -t 0 ] && [ -z "$WSL_STATIC_IP_SET" ]; then /usr/local/bin/set-static-ip.sh >/dev/null 2>&1 & export WSL_STATIC_IP_SET=1 fi

7.3 处理WSL2自动生成resolv.conf的问题

这是最顽固的问题之一。WSL2每次启动都会尝试重写/etc/resolv.conf。除了用chattr +i锁定,更根本的方法是在WSL2内部的/etc/wsl.conf文件中配置:

sudo vim /etc/wsl.conf

添加以下内容:

[network] generateResolvConf = false # 禁止WSL自动生成DNS配置

保存后,退出所有WSL2窗口,在Windows中运行wsl --shutdown,再重新启动。这样WSL2就不会覆盖我们手动设置的DNS了。

http://www.jsqmd.com/news/1330815/

相关文章:

  • 广州民营企业主经济犯罪律师哪个专业:【法纳刑辩】专业精湛 - 18002239949
  • 如何快速掌握重庆大学LaTeX毕业论文模板:3步终极使用指南
  • 终极指南:如何用开源NAND闪存编程器NANDO实现低成本硬件编程
  • 政务外包驻场两年,我的代码整整两年没人看过第二眼
  • Windows Server IIS FTP服务配置:用户隔离与权限管理实战
  • AI代理驱动攻击:从自动化渗透到智能对抗的攻防新范式
  • 从零构建智能体操作系统:基于文件夹结构与核心循环的AI Agent开发实践
  • 2026实测:抖音保存受限视频手机端电脑端方法汇总+无水印教程 - 免费软件工具方法教程
  • 如何用lilToon着色器打造专业卡通角色:完整入门教程
  • 数据分析师必备:从SQL取数到业务洞见的全流程实战指南
  • MATLAB工程实践:从数学建模到算法部署的完整工作流
  • 基于QClaw框架的自动化签到Agent开发实战:从零到云端部署
  • 广州民营企业主经济犯罪律师推荐:【法纳刑辩】口碑卓越 - 18002239949
  • Matlab离散点求导实战:从噪声处理到Savitzky-Golay与样条插值
  • 2026年8月广州转向节羊角/广州缓冲胶厂家实力榜_广州赛鼎汽车配件有限公司 - 品牌宣传支持者
  • 基于OpenClaw开源平台,在Windows/Linux上实现iCloud数据自动化同步
  • 2026年老旧鱼池改六仓过滤很麻烦吗?施工几天完工
  • UE5 GAS实战:碰撞事件驱动角色属性交互系统设计与实现
  • C++单元测试覆盖率统计实战:基于gtest/gcov/lcov的完整配置与避坑指南
  • 深入解析MySQL临键锁:原理、死锁场景与性能优化实战
  • 3步搞定游戏实时翻译:Translumo终极使用指南
  • PWM转模拟电压:低通滤波器原理、设计与工程实践全解析
  • JMeter取样器深度解析:从HTTP到TCP,精准模拟协议的性能测试核心
  • HarmonyOS 7 / API 26 ArkWeb 文件上传适配:内核差异、权限边界和失败兜底一次验清
  • 2026年8月中山南洋法式园林住宅/中山石岐带花园叠墅优选_岐关悦来 - 品牌宣传支持者
  • Dify实战指南:从零构建AI应用,快速集成大语言模型
  • AI Agent驱动全链路自动化测试:从代码变更到智能报告的实践
  • 基于Docker Compose的OpenClaw生产级容器化部署与运维指南
  • 从零部署MinDoc:构建私有文档管理系统的完整指南
  • 电动汽车参与电网调度的多目标优化与MATLAB实现