外观
链路聚合(Bond)
做完这一篇,两块网卡合成一个 bond0:一条网线或一个交换机端口出问题时 NAS 仍然在线,或者多台客户端同时访问时流量被分到两条链路上。先说结论:单个客户端的单个文件传输不会因此变快。
先想清楚要它做什么
| 目的 | 能不能做到 |
|---|---|
| 冗余:一条链路坏了不断网 | 能。active-backup 模式不需要交换机配合,最容易成功 |
| 总带宽:多台客户端同时访问 | 能。推荐 LACP(802.3ad),需要支持它的交换机 |
| 单个客户端传大文件更快 | 基本不能 |
Linux 内核的 bonding 文档写明:除 balance-rr 以外的负载均衡模式,「没有单个连接能用到超过一块网卡的带宽」。OMV 官方文档也提醒:LACP 下单个客户端拿不到 2 Gbit,还要受磁盘速度限制。想让单个客户端更快,直接换 2.5G 或 10G 的网卡和交换机更靠谱,见网卡与交换机。SMB 本身的传输优化见 SMB 传输性能调优。
建 Bond 会改动正在使用的网卡
- 影响范围:成员网卡原来的以太网配置要先删除,才能加入 Bond;应用后 NAS 的 IP 由
bond0提供。应用瞬间 Web、SSH、SMB 连接会断开;配错了就失联。 - 前置条件:有本机控制台;至少两块物理以太网口(Wi-Fi 不能做成员);用 LACP 时,交换机端口已配成聚合组;记下现有的地址、网关和 DNS;用 active-backup 以外的模式前,先确认交换机是否需要配合。
- 回退:点 应用 之前,用黄色提示条上的 撤销;已经应用并失联,用本机控制台的
omv-firstaid重置网卡,见改坏网络后怎么救。
模式怎么选
界面里的模式用英文名显示,编号 0 到 6。交换机要求来自 Linux 内核文档:
| 编号 | 模式 | 交换机要求 | 说明 |
|---|---|---|---|
| 1 | active-backup(默认) | 不需要 | 同一时刻只有一块网卡工作,它失效时切到另一块。需要指定 主要(Primary)。新手首选 |
| 4 | 802.3ad(LACP) | 端口必须配成 802.3ad 聚合 | 多客户端并发时分流。成员网卡速率、双工要一致 |
| 5 | balance-tlb | 不需要 | 发送方向按负载分配,接收只走一块。需要驱动能读出网卡速率 |
| 6 | balance-alb | 不需要 | 在 tlb 的基础上,对 IPv4 做接收均衡。需要网卡能在运行时改 MAC |
| 0 | balance-rr | 需要把端口聚合(etherchannel 或 trunk) | 轮流发包。是唯一可能让单个连接超过一块网卡速度的模式,但包容易乱序 |
| 2 | balance-xor | 需要把端口聚合 | 按传输哈希策略选网卡 |
| 3 | broadcast | 通常需要把端口聚合 | 每个包都从所有网卡发出,只为容错,很少用 |
没有支持 LACP 的交换机,就选 1;有,并且确实有多台客户端并发访问,再考虑 4。其他模式不建议新手用。
表单字段
网络 → 接口 → 创建 → 汇聚(Network → Interfaces → Create → Bond):
| 字段 | 默认值 | 说明 |
|---|---|---|
| 设备 | 自动命名 | 创建时不显示,系统自动取 bond0、bond1……;编辑时显示且只读 |
| 隶属(Slaves) | 空 | 成员网卡,只能选以太网口,至少一块(官方界面提示「至少需要一个网卡」)。下拉框里没有的网卡,是因为它还有以太网配置,或已被别的 Bond、桥接、VLAN 占用 |
| 模式(Mode) | active-backup | 见上表 |
| 传输哈希策略(Transmit Hash Policy) | layer2 | 只在模式 2、4、5 可选:layer2、layer2+3、layer3+4、encap2+3、encap3+4 |
| 主要(Primary) | 自动填入第一块成员 | 只在模式 1、5、6 可选且必填,必须是成员之一 |
| MII 监测频率 | 100 | 毫秒,检查链路是否存活的间隔 |
| 停用延迟(Down delay) | 200 | 毫秒,发现故障后等多久才停用该成员 |
| 延时(Up delay) | 200 | 毫秒,链路恢复后等多久才启用。官方中文译名只有「延时」 |
| IPv4、IPv6、高级设置 | 同以太网口 | 见网络接口。Bond 没有 MAC 地址和 WOL 字段 |
OMV 把这些参数写进 /etc/netplan/40-openmediavault-bond0.yaml(文件名里的 bond0 随设备名变化)。主要网卡恢复后会重新成为活动网卡,这个行为由环境变量 OMV_SYSTEMD_NETWORKD_BOND_PRIMARYRESELECTPOLICY 控制,默认 always。界面没有 LACP 速率、最小链路数等选项,需要时见自定义网络配置。
把现有网卡并入 Bond
下面是官方文档的分步做法,每一步结束时都保留一条能访问 Web 界面的路。以双网卡为例,网卡一是正在用的,网卡二是空闲的:
- 如果网卡一还是安装时的 DHCP 配置,先在
网络 → 接口里把它改成静态。地址填它当前分到的那个,通常不需要重新登录。保存,再点 应用。 - 创建 → 汇聚:隶属只选网卡二,选好模式;地址填一个同网段、没被占用的新地址,填子网掩码;网关和 DNS 服务器先留空(两块网卡同时带网关,会出现两条默认路由)。保存,再点 应用。
- 注销,用 Bond 的新地址重新登录。
- 选中网卡一那一行,点 删除(确认框里点 是),再点黄色提示条上的 应用。
- 编辑 Bond,隶属里现在可以选网卡一了,把它加进去。保存,再点 应用。
- 再编辑 Bond,把地址改成最终想用的地址,补上网关和 DNS 服务器,保存,再点 应用。仪表盘上应该出现 Bond 接口和它的速率。
第 6 步是本文补充的:官方文档只写到仪表盘出现 Bond,但 Bond 在第 2 步没有网关和 DNS,网卡一的配置在第 4 步又被删掉了,最终总得有人补上。
想一步到位,可以在同一批待应用的变更里先删掉成员网卡原来的以太网配置(先别点 应用),再创建 Bond,把两块网卡都选为成员并填原来的地址,最后只应用一次。omv-extras wiki 对桥接就是这样做的;成员网卡的候选列表是按配置数据库计算的,删除操作一做完,这块网卡就会出现在候选里(源码如此)。这种做法只有一次切换,但全有或全无,配错了只能靠控制台。Bond 这样操作没有在 OMV 8 上验证过。
交换机端要做什么
- active-backup、balance-tlb、balance-alb:交换机不需要特殊配置,插两根线就行。
- 802.3ad:在交换机上把这两个口配成一个 LACP 聚合组,OMV 里选 802.3ad。两端要配套,只配一端通常不通,或者只有一条链路在工作。
- balance-rr、balance-xor、broadcast:交换机上要把端口聚合(不同厂商叫 etherchannel、trunk 等)。
具体菜单因交换机型号而异,以厂商文档为准。
检查结果
网络 → 接口里出现bond0,方式和地址正确。选中它点 显示详情,状态正常。仪表盘的网络接口小部件里能看到 Bond 的速率。
在 OMV 的 shell 里查看内核的 Bond 状态:
sh# 在 OMV 的 shell 里执行(root),只读 ip -br addr # bond0 有地址,成员网卡没有地址 cat /proc/net/bonding/bond0 # 看模式、成员状态、链路状态输出里应能看到你选的模式(例如
fault-tolerance (active-backup))和每个成员的MII Status: up。用 802.3ad 时还有一段 802.3ad 信息,其中Partner Mac Address在对端协商成功后会显示成交换机的 MAC;一直是全 0,多半说明交换机那边没有响应 LACP。active-backup 的故障切换测试:在客户端上持续
ping <NAS 的 IP>,然后拔掉当前工作网卡的网线,通常只会丢几个包。再次cat /proc/net/bonding/bond0,活动成员应该换了。测完把线插回去。想验证总带宽,要用多个客户端同时传输,工具见性能测试。
常见问题
Bond 之后速度没有变成两倍。 这是预期行为。单个连接只会走一条链路;要用多台客户端并发,或者在 balance-rr 下接受乱序的代价。速度还受磁盘限制。
创建时下拉框里没有想要的网卡。 它还有自己的以太网配置,或已被别的 Bond、桥接、VLAN 占用。到 网络 → 接口 删除它原来的以太网配置,再回来选。
保存时提示主要网卡不对。 模式 1、5、6 必须指定 主要,而且必须是 隶属 里的成员之一。
802.3ad 一直不通。 先确认交换机端口已经配成 LACP 聚合组、两个口速率一致,再看 cat /proc/net/bonding/bond0。排除不了时,先改回 active-backup 保证能访问。
拆掉 Bond 之后 NAS 没有 IP 了。 成员网卡在加入 Bond 时已经没有自己的以太网配置,只删 Bond 它们就没有地址。正确的做法是:删除 Bond(先别应用),再给其中一块网卡新建以太网配置,最后一起应用,失败可以用 撤销。这个流程按配置数据库的行为推出,没有在 OMV 8 上实测。
想把 Bond 给虚拟机用。 把 Bond 作为桥接的成员,见网桥:给虚拟机和容器用。