news 2026/10/29 2:04:31

PVE 装 OpenWrt:不改现有网络,用单臂路由让指定虚拟机上网

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PVE 装 OpenWrt:不改现有网络,用单臂路由让指定虚拟机上网

引子

之前在 PVE 中陆续安装了 Debian、Ubuntu、FreeBSD、Windows,以及飞牛 fnOS,这次继续折腾 OpenWrt。

OpenWrt 是一个基于 Linux 的开源路由器操作系统。除了运行在常见的家用路由器上,它也可以部署在 x86 电脑、软路由设备以及虚拟机中。

不过,这次我并不准备让 OpenWrt 接管家庭网络,而是希望在已有的 PVE 环境中,独立运行一台 OpenWrt,并让指定的虚拟机通过它上网。

最终采用的方案是:

  • 不修改 PVE 原有的网络拓扑。

  • 不新增虚拟网桥。

  • OpenWrt 只使用一张 VirtIO 网卡。

  • 保留 PVE 原有 DHCP 和 NAT。

  • 只有指定的虚拟机才使用 OpenWrt 作为默认网关。

整个过程已在实际环境中验证成功。下面从镜像下载、虚拟机创建、网络配置到最终测试,完整记录安装过程。


一、实验环境与网络规划

1. 实验环境

本次环境如下:

项目配置
物理设备ThinkPad T480
虚拟化平台PVE 9.2.11
OpenWrt 版本25.12.6
系统架构x86_64
启动方式UEFI(OVMF)
OpenWrt VM ID130
OpenWrt VM NameOpenWRT
CPU1 Core
内存512 MB
虚拟网卡VirtIO,单网卡
测试虚拟机Debian 13.7(VM 111)

PVE 宿主机通过 Wi-Fi 连接家庭路由器,原本已经配置了一个 NAT 网络:

网络设备IP 地址用途
PVE wlp3s0192.168.31.50/24连接家庭网络
PVE vmbr0192.168.100.1/24虚拟机内部网络
OpenWrt192.168.100.30/24单臂路由
Debian VM 111192.168.100.11/24路由测试
PVE dnsmasq192.168.100.100–199DHCP 地址池

注意:192.168.100.1 是 PVE 内网网关,不是 192.168.100.10。

这些 IP 地址只对应本次实验环境,读者应根据自己的实际网络调整。

2. 为什么选择单臂路由?

常规软路由一般使用至少两张网卡:

  • WAN:连接上级网络。

  • LAN:连接下级网络。

而我们希望 OpenWrt 与已有虚拟机继续共用vmbr0,不另外创建 WAN/LAN 网桥。

因此采用同网段单网卡转发方案:

这里的 OpenWrt 接收测试 VM 的流量,再通过同一张网卡转发给 PVE 网关。

这样就形成:

Debian VM → OpenWrt192.168.100.30→ PVE192.168.100.1→ 家庭路由器 → Internet

需要说明:这种单臂路由没有实现 WAN/LAN 二层隔离,而是通过同接口 IPv4 转发和 NAT 来实现。它适合本次实验,但不是一个完整的网络隔离方案。


二、下载 OpenWrt 镜像

1. 选择 UEFI 版本

OpenWrt 官方为 x86_64 平台提供多种镜像,包括:

镜像用途
ext4-combined.img.gzLegacy BIOS 启动
ext4-combined-efi.img.gzUEFI 启动
squashfs-combined-efi.img.gzUEFI + SquashFS
ext4-rootfs.img.gz仅根文件系统

本次选择:

generic-ext4-combined-efi.img.gz

原因很简单:

  • PVE 已经成熟支持 UEFI。

  • EXT4 根文件系统可读写。

  • 后续方便扩容磁盘与安装软件。

  • 不需要依赖传统 BIOS 启动。

需要注意,EXT4 镜像不具备 SquashFS 那样的只读根文件系统及对应的恢复机制。

官方也推荐在没有特殊需求时优先选择 EXT4 UEFI 镜像。

下载地址:

OpenWrt 25.12.6 x86_64 下载目录

2. 下载和解压

在 PVE 宿主机执行:

mkdir -p /root/openwrt cd /root/openwrt wget https://downloads.openwrt.org/releases/25.12.6/targets/x86/64/openwrt-25.12.6-x86-64-generic-ext4-combined-efi.img.gz

推荐校验 SHA256:

sha256sum openwrt-25.12.6-x86-64-generic-ext4-combined-efi.img.gz

本次版本对应的官方 SHA256 为:

1ef06b324d04490a90de26d6f2a292111854f05e3c946648fad70c339b52f739

确认一致后解压:

gzip -dk openwrt-25.12.6-x86-64-generic-ext4-combined-efi.img.gz

最终得到.img文件。

OpenWrt x86 的这种安装方式不需要 ISO,也不需要运行传统安装程序。直接将磁盘镜像导入 PVE 即可。


三、创建 OpenWrt 虚拟机

本次使用命令行创建 VM,便于复现。

1. 检查 VM ID

在 PVE 宿主机执行:

qm list pvesm status

确认 VM 130 未被使用,且local-lvm有足够的空间。

2. 创建虚拟机

qm create 130 \ --name OpenWRT \ --ostype l26 \ --machine q35 \ --bios ovmf \ --cpu host \ --cores 1 \ --memory 512 \ --net0 virtio,bridge=vmbr0,link_down=1

几个关键参数:

参数说明
--name OpenWRT虚拟机名称
--machine q35Q35 虚拟机芯片组
--bios ovmfUEFI 固件
--cpu host使用宿主机 CPU 特性
--cores 11 个 CPU 核心
--memory 512分配 512 MB 内存
--net0 virtioVirtIO 网络设备
link_down=1首次启动时断开虚拟网卡

最后这个参数非常重要。

OpenWrt 默认会在 LAN 接口运行 DHCP 服务。

而本次 PVE 的vmbr0已经有 dnsmasq 提供 DHCP。如果直接让 OpenWrt 接入网络,两个 DHCP 服务器可能同时向虚拟机分配地址。

因此,先让 OpenWrt 的网卡断开,等完成网络配置、关闭 DHCP 以后,再重新连接。

3. 添加 EFI Disk

qm set 130 \ --efidisk0 local-lvm:0,efitype=4m,pre-enrolled-keys=0

这里使用 OVMF,并且不启用预置的 Secure Boot 密钥。

EFI Disk 用于存储 UEFI 固件变量,与 OpenWrt 镜像自带的 EFI 系统分区不同。

4. 导入 OpenWrt 磁盘

qm disk import 130 \ /root/openwrt/openwrt-25.12.6-x86-64-generic-ext4-combined-efi.img \ local-lvm \ --target-disk sata0

随后设置启动顺序:

qm set 130 --boot order=sata0

这里使用 SATA 磁盘,配置简单,对于这种轻量级路由系统足够使用。

5. 检查配置

qm config 130

确认包含:

bios: ovmf machine: q35 cores: 1 memory: 512 cpu: host boot: order=sata0 efidisk0: ... sata0: ... net0: ...,bridge=vmbr0,link_down=1

其中 MAC 地址、磁盘卷名等由 PVE 生成,不必与其他人的配置完全相同。


四、启动 OpenWrt

在 PVE 宿主机执行:

qm start 130

然后进入:

PVE → VM 130 → Console

OpenWrt 会直接从导入的磁盘启动。

进入命令行后,按 Enter 即可操作。

1. 设置 root 密码

passwd

按照提示设置密码。

2. 检查网络接口

ip addr

注意,OpenWrt 默认使用 BusyBox 提供的精简版ip命令,不支持某些完整iproute2参数。例如:

ip -br addr

可能会报错。

直接使用ip addr即可。

再检查:

uci show network

默认情况下,x86 OpenWrt 通常会把第一张虚拟网卡eth0加入br-lan。

查看:

uci get network.lan.device

预期输出:

br-lan

此时虚拟网卡尚未连通,属于正常情况。


五、配置 OpenWrt 网络

这部分是本次实验最关键的内容。

下面命令全部在OpenWrt Console中执行,而不是在 PVE 宿主机中执行。

1. 备份默认配置

cp /etc/config/network /etc/config/network.bak cp /etc/config/dhcp /etc/config/dhcp.bak cp /etc/config/firewall /etc/config/firewall.bak

出现配置问题时,可以通过 Console 恢复。

2. 配置静态 IP 和默认网关

本次使用:

OpenWrt IP: 192.168.100.30 Netmask: 255.255.255.0 Gateway: 192.168.100.1

执行:

uci set network.lan.proto='static' uci set network.lan.ipaddr='192.168.100.30' uci set network.lan.netmask='255.255.255.0' uci set network.lan.gateway='192.168.100.1'

设置 DNS:

uci -q delete network.lan.dns uci add_list network.lan.dns='223.5.5.5' uci add_list network.lan.dns='1.1.1.1' uci commit network

这里最容易出错的是 Gateway。

OpenWrt 的上级网关必须指向 PVE 的vmbr0IP,即 192.168.100.1。

而不是指向家庭路由器的192.168.31.1,因为 OpenWrt 本身并不直接处于家庭路由器的网段中。

3. 关闭 OpenWrt DHCP

由于 OpenWrt 与其他 VM 处于同一网段,不能让 OpenWrt 再运行一个 DHCP 服务器向整个vmbr0发放地址。

执行:

uci set dhcp.lan.ignore='1' uci set dhcp.lan.dhcpv4='disabled' uci set dhcp.lan.dhcpv6='disabled' uci set dhcp.lan.ra='disabled' uci set dhcp.lan.ndp='disabled' uci commit dhcp

这里关闭了:

  • DHCPv4 地址分配。

  • DHCPv6 服务。

  • IPv6 Router Advertisement。

  • IPv6 NDP 代理。

本次只需要 OpenWrt 作为指定 VM 的 IPv4 网关,并不需要它接管整个网络。

不要简单地关闭整个 dnsmasq 服务。DHCP 地址分配和 DNS 解析是两个功能,即使关闭 DHCP,OpenWrt 仍然可以保留 DNS 服务。

4. 配置 Firewall4 和 NAT

常规 OpenWrt 使用 LAN、WAN 两个 firewall zone。

默认情况下,Masquerade 一般启用在 WAN zone 上。

但我们的 OpenWrt 只有一个 LAN 接口,流量从br-lan进入,再从br-lan转发出去。

所以这次要在 LAN zone 启用 Masquerade。

先确认:

uci get firewall.@zone[0].name

本次默认配置输出:

lan

确认是lan后执行:

uci set firewall.@zone[0].forward='ACCEPT' uci set firewall.@zone[0].masq='1' uci commit firewall

如果你的 LAN zone 不是@zone[0],需要先通过uci show firewall找到对应 zone,不能直接套用序号。

这里的关键就是:

masq=1

它会让 OpenWrt 对从 LAN zone 发出的 IPv4 流量执行源地址转换。

例如:

Debian VM192.168.100.11→ OpenWrt192.168.100.30(SNAT / Masquerade)→ PVE192.168.100.1

PVE 看到的是由 OpenWrt 地址发出的流量,返回的数据再通过 conntrack 还原并转发给 Debian。

如果不做 SNAT,PVE 很可能直接将返回数据发送给同网段的 Debian,绕过 OpenWrt,不符合我们希望测试的路径。

5. IPv4 Forwarding 与 ICMP Redirect

OpenWrt 默认启用 IPv4 转发,但建议确认:

sysctl net.ipv4.ip_forward

预期:

net.ipv4.ip_forward = 1

另外,同网段单臂路由存在一个特别的问题:数据包从同一个接口进入、又从同一个接口转发,Linux 可能发送 ICMP Redirect,建议客户端改走另一个网关。

因此建议关闭 ICMP Redirect 发送:

cat > /etc/sysctl.d/99-one-arm.conf <<'EOF' net.ipv4.ip_forward=1 net.ipv4.conf.all.send_redirects=0 net.ipv4.conf.default.send_redirects=0 net.ipv4.conf.br-lan.send_redirects=0 EOF

应用:

sysctl -p /etc/sysctl.d/99-one-arm.conf

这样设置会持久保存,重启后仍然生效。

6. 应用配置

/etc/init.d/network restart /etc/init.d/dnsmasq restart /etc/init.d/odhcpd restart /etc/init.d/firewall restart

最后检查:

uci get network.lan.ipaddr uci get network.lan.gateway uci get dhcp.lan.ignore uci get dhcp.lan.ra uci get firewall.@zone[0].masq

预期:

192.168.100.30 192.168.100.1 1 disabled 1

这里确认无误后,才连接虚拟网卡。


六、连接网卡并测试 OpenWrt 上网

在 PVE Web 界面:

VM 130 → Hardware → Network Device (net0) → Edit

取消勾选:

Disconnect

保存即可。

如果网络没有立即恢复,可以在 OpenWrt Console 中重新执行:

/etc/init.d/network restart

1. 检查 IP

ip addr

实际测试中,br-lan获得:

inet 192.168.100.30/24

2. 检查路由

ip route

实际输出:

default via 192.168.100.1 dev br-lan 192.168.100.0/24 dev br-lan scope link src 192.168.100.30

这说明 OpenWrt 已经将 PVE 的vmbr0作为默认网关。

3. 测试网络

依次执行:

ping -c 3 192.168.100.1 ping -c 3 1.1.1.1 nslookup openwrt.org

分别验证:

  1. OpenWrt 能连接 PVE 网关。

  2. OpenWrt 能连接互联网。

  3. OpenWrt 的 DNS 解析正常。

以上均成功,说明 OpenWrt 自身已经可以上网。

但到这里还不能证明单臂路由已经成功,我们还需要让另一台 VM 通过它访问外网。


七、访问 OpenWrt LuCI 管理界面

LuCI 是 OpenWrt 提供的 Web 管理界面。

本次安装的 OpenWrt 镜像中已经包含 LuCI,不需要额外安装。

直接访问:

http://192.168.100.30

即可进入登录页面。

这里需要说明一个 PVE NAT 网络的访问问题。

1. 为什么 Ubuntu 主力机可以直接访问?

我的 PVE 通过 Wi-Fi 连接家庭局域网:

之前安装 Debian、Ubuntu Server 等虚拟机时,已经在 Ubuntu 主力机上设置了到 PVE 内网的静态路由。

例如:

sudo ip route replace 192.168.100.0/24 via 192.168.31.50

其中:

  • 192.168.100.0/24:PVE 内部虚拟机网络。

  • 192.168.31.50:PVE 在家庭局域网中的 IP。

注意:这要求 Ubuntu 主力机能够直达 PVE 的192.168.31.50,PVE 已开启 IPv4 转发且防火墙允许相关流量。这条命令仅临时修改路由,永久保存需要通过 Ubuntu 的网络管理配置完成。

如果之前已经设置过静态路由,就无需重复操作。

因此,本次可以直接:

http://192.168.100.30

或者 SSH:

ssh root@192.168.100.30

不需要额外建立 SSH 隧道,也不需要给每台 VM 设置端口映射。

对于尚未配置此类静态路由的读者,可以先通过 PVE Console 完成系统管理,之后再根据自身网络规划添加路由。

2. 初次登录 LuCI

使用 root 和之前设置的密码登录。

首次进入 Status → Overview,可能出现:

Check online for firmware upgrades

它询问是否每次打开 Overview 页面时自动联网检查固件更新。

这只是一个管理功能,与本次路由、DHCP、NAT 都没有关系。

我选择:

No, disable checking

关闭自动检查,需要升级时再手动操作即可。

如果出现UNSAVED CHANGES,再通过 Save & Apply 保存。


八、让指定 Debian VM 通过 OpenWrt 上网

到这里,OpenWrt 已经安装完成,可以通过 LuCI 管理,也能够自己访问互联网。

但单臂路由是否真正成功,还需要验证其他 VM 能否经它转发流量。

本次使用已经安装好的 Debian 13.7(VM 111)。

1. 查看 Debian 原有网络

在 Debian 中执行:

ip addr ip route

本次 Debian 地址为:

192.168.100.11/24

原有默认网关:

default via 192.168.100.1 dev ens18

也就是说,原本 Debian 直接使用 PVE 网关上网。

2. 临时修改默认网关

执行:

sudo ip route replace default via 192.168.100.30

这里不需要修改 Debian 的 IP,也不需要换网卡。

仅将默认网关从 PVE 改为 OpenWrt。

查看:

ip route

本次实际结果类似:

default via 192.168.100.30 dev ens18 default via 192.168.100.1 dev ens18 proto dhcp src 192.168.100.11 metric 100 192.168.100.0/24 dev ens18 proto kernel scope link src 192.168.100.11 metric 100

可以看到,两条默认路由同时存在。

原因是 PVE 的 DHCP 仍然向 Debian 下发192.168.100.1作为默认网关,而我们又手工添加了192.168.100.30。

这没有问题。

手动添加的第一条默认路由优先级更高,访问互联网时会优先经过 OpenWrt。

3. 验证路由选择

执行:

ip route get 1.1.1.1

实际测试输出:

1.1.1.1 via 192.168.100.30 dev ens18 src 192.168.100.11

这条输出非常关键。

它说明 Debian 访问1.1.1.1时,内核选择的下一跳确实是:

192.168.100.30,也就是 OpenWrt。

4. 验证互联网访问

继续执行:

ping -c 3 192.168.100.30 ping -c 3 1.1.1.1

再打开 Debian 的 Firefox,访问常见网站。

本次实际测试中,Debian 可以正常访问新浪网等网站,没有发现网络异常。

结合默认路由和 NAT 规则,可以判断单臂路由的 IPv4 转发已经基本跑通。


九、验证 OpenWrt 的 NAT 规则

在 OpenWrt 中执行:

nft list chain inet fw4 srcnat_lan

本次实际输出:

table inet fw4 { chain srcnat_lan { meta nfproto ipv4 masquerade comment "!fw4: Masquerade IPv4 lan traffic" } }

这说明 OpenWrt 已经生成了 LAN zone 的 IPv4 Masquerade 规则。

这里涉及几个组件:

组件作用
Linux IP Forwarding允许在路由器上转发 IP 数据包
Firewall4OpenWrt 的防火墙配置框架
nftablesLinux 内核防火墙规则
Masquerade动态源地址转换
conntrack跟踪连接状态,实现 NAT 回程处理

数据包的处理过程大致如下:

返回流量则通过相应的 conntrack/NAT 状态逐层处理,最终回到 Debian。

这里存在多层 NAT,不过本次只是学习和验证路由功能,并非生产网络,对实验没有明显影响。

严格来说,nft输出证明 NAT 规则已经安装,并不单独证明每一个数据包都命中了它。

如果需要更深入的验证,可以使用 tcpdump、nftables 计数器或 conntrack,观察真实的转发连接。


十、恢复原有网络与保存快照

本次 Debian 使用的是临时路由修改,所以回滚很方便。

在 Debian 中执行:

sudo ip route del default via 192.168.100.30 dev ens18

便可以恢复使用 DHCP 下发的:

192.168.100.1

重启或重新建立网络连接时,临时路由也可能自动消失。

如果以后需要让 Debian 永久通过 OpenWrt 上网,可以再通过 NetworkManager 或系统网络配置持久保存网关。

由于我们没有更改 PVE dnsmasq,其他 VM 仍然正常使用 PVE 网关。

创建 PVE 快照

全部验证完成后,建议在 PVE 宿主机执行:

qm snapshot 130 openwrt-baseline

后续不管是测试防火墙、DNS、VPN 还是策略路由,都可以回到这个已经正常运行的基线。


十一、几个容易踩的坑

1. 不要让 OpenWrt 和 PVE 同时提供 DHCP

这是最需要注意的问题。

如果两者同时在vmbr0上广播 DHCP 响应,其他虚拟机可能拿到错误的 IP、网关或者 DNS。

所以我们首次创建 VM 时,先使用link_down=1隔离网络,完成配置后再连接。

2. OpenWrt Gateway 不要设置成家庭路由器

本次 OpenWrt 所在网段是:

192.168.100.0/24

它的直接上级网关是:

192.168.100.1

家庭路由器通常位于另一个网段,不能直接作为这里的下一跳。

3. 同一网段通信不一定经过 OpenWrt

例如 Debian 访问另一台192.168.100.x虚拟机时,Linux 会通过直连路由在同一二层网段通信。

这部分流量通常不会经过默认网关 OpenWrt。

因此,本次验证重点是访问其他网段或互联网的 IPv4 流量。

4. NAT 配置不能直接照搬常规软路由教程

常规 OpenWrt 通常在 WAN zone 上开启 Masquerade。

但这次只有一个接口,所以需要在 LAN zone 启用。

否则即使 OpenWrt 自己能正常上网,也不意味着 Debian 能够通过它完成转发。

5. 本次实验不等于全部 IPv6 流量都经过 OpenWrt

整个测试主要针对 IPv4。

如果 Debian 同时存在 IPv6 地址与默认路由,IPv6 流量可能走其他路径。

同样,本次也没有实现真正的 WAN/LAN 安全隔离。对于需要严格管理不同网段访问权限的场景,仍然建议使用多个接口、网桥或者 VLAN。

6. OpenWrt 的 EXT4 系统分区比较小

本次使用的是官方原始磁盘镜像,LuCI 显示的根文件系统空间大约只有百 MB 级别。

这对基础路由功能足够,但如果以后安装大量软件包,需要扩容虚拟磁盘及 OpenWrt 内部文件系统。

OpenWrt 25.12 也已经使用apk替代原来的opkg,安装软件时要注意版本差异。


写在最后

这次在 PVE 中安装 OpenWrt,与之前安装普通 Linux 虚拟机有两个明显区别。

首先,OpenWrt 不需要传统安装程序。

直接下载官方 x86_64 UEFI 磁盘镜像,导入 PVE,再设置 OVMF 和启动磁盘,就能完成操作系统安装。

其次,OpenWrt 真正的重点在于网络配置,而不是操作系统安装本身。

本次选择了一个相对简单的实验方案:

  • PVE 继续通过 Wi-Fi 和 NAT 为原有虚拟机提供网络。

  • OpenWrt 只使用vmbr0上的一张 VirtIO 网卡。

  • OpenWrt 关闭 DHCP,避免影响现有网络。

  • 通过 IPv4 Forwarding 和 LAN Masquerade 实现单臂路由。

  • Debian VM 通过手动修改默认网关,经 OpenWrt 访问互联网。

最终,OpenWrt 25.12.6 在 VM 130 中正常启动,LuCI 管理界面可以访问,Debian VM 也成功通过 OpenWrt 上网。

整个过程没有新增 PVE 网桥,也没有修改现有 NAT、DHCP 或其他虚拟机网络配置。

这套方案的意义并不是替代传统双网口软路由,而是提供一个相对独立、容易回滚的 OpenWrt 实验环境。

在这个基础上,后续还可以继续研究 DNS、nftables、conntrack、WireGuard、VLAN,以及更复杂的策略路由。

对于已经使用 PVE 搭建家庭实验环境的读者,OpenWrt 是一个值得继续探索的 Linux 网络平台。


参考资料

  • OpenWrt 官方网站:OpenWrt

  • OpenWrt 25.12.6 x86_64 下载目录

  • OpenWrt x86 安装说明

  • OpenWrt Firewall 配置

  • Proxmox VE 官方文档

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/29 2:04:31

Scaling Law 与涌现能力

Scaling Law 与涌现能力你肯定听过两个说法&#xff1a; “大力出奇迹&#xff0c;模型越大越强。” “模型大到一定程度&#xff0c;会突然’开窍’&#xff0c;冒出小模型没有的能力。” 这两个说法&#xff0c;一个叫 Scaling Law&#xff0c;一个叫涌现&#xff08;emergen…

作者头像 李华
网站建设 2026/10/29 2:03:43

Linux FFmpeg深度解析之avdevice_list_input_sources调用流程与实战(六)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐&#xff1a;《Android系统多媒体进阶实战》&#x1f680; Android Audio工程师专栏地址&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; Android多媒体专栏地址&a…

作者头像 李华
网站建设 2026/10/29 2:03:28

【AI】Artemis-codex:来给你的Agent配一台手机吧

【AI】Artemis-codex&#xff1a;来给你的Agent配一台手机吧 前言 前面几篇文章主要在折腾 LangChain 和 LangGraph&#xff0c;从最小 Agent、工具调用&#xff0c;一直写到 RAG 和条件分支。这次给 Agent 加一个更直观的工具&#xff1a;一台手机。 电脑旁边有闲置安卓机的…

作者头像 李华
网站建设 2026/10/29 2:02:43

## 机器学习环境搭建

## 开发环境搭建 ## 安装 ### 简介: 指的是一个开源的发行版本, 其包含了 Conda 以及等一千八百多个科学包及其依赖项。因为包含了大量的科学包, 和可以把不同的环境隔离开 , 所以我们选择去 ### 下载地址: 下载自己对应的版本, 五百兆左右 , 如果下载速度慢可以移步国内镜像。…

作者头像 李华
网站建设 2026/10/29 2:02:11

Openlayers地图管道中添加双向燕尾水流动画效果

1&#xff1a;需求是这样的&#xff0c;需要在openlayers地图加载的管道上添加双向燕尾水流动画效果如下 openlayers代码如下&#xff1a; // 启动水流动画&#xff08;蓝底带箭尾效果&#xff09;startFlowAnimation() {if (this.flowPathFeatures.length 0) return;// 清理…

作者头像 李华