如果我在命令行上使用手动设置(按照内核说明),我可以正确设置我的网络连接:
# modprobe bonding mode=4 miimon=100
# ifconfig bond0 up
# ip link set eno1 master bond0
# ip link set eno2 master bond0
作为记录,使用的交换机是 Cisco Nexus 2248,我没有指定 IP 地址,因为还有一个额外的 802.1q 层(配置文件中存在或不存在对问题没有影响)。
问题是我无法创建正确的/etc/network/interfaces
文件以在启动时自动完成此操作。网上有很多关于 ifenslave 包的不同版本之间的混淆,尤其是它的文档,以及如何在使用 ifup 时避免竞争条件。任何适用于以前版本的 Ubuntu 的东西都不再适用了。如果 systemd 让事情变得更加混乱,我也不会感到惊讶。基本上,无论我尝试什么,我的脚本都会在启动时卡住,我必须等待一到五分钟才能完成启动过程。
这是我能做到的最好的:
auto lo
iface lo inet loopback
allow-bond0 eno1
iface eno1 inet manual
bond-master bond0
allow-bond0 eno2
iface eno2 inet manual
bond-master bond0
auto bond0
iface bond0 inet manual
bond-mode 4
bond-slaves eno1 eno2
bond-miimon 100
在启动时,bond0 停顿一分钟(因为 bond0 正在等待至少一个从属设备被启动,这永远不会发生,所以它超时),但是一旦系统启动,使用ifup eno1
works 和 bond0 启动好好工作。
如果我指定auto eno1
,那么启动过程会停止五分钟,bond0 永远不会正确启动,尝试使用ifdown eno1
会卡住,因为它正在等待一些锁定/run/network/wherever
(不记得确切的文件,并且经常重启这台机器已经),这似乎表明是的,我遇到了竞争条件,ifup 永远卡在 eno1 上。
有没有人在最新的 Ubuntu 上有一个可行的解决方案?
我有一个在 16.04 (linux 4.4.0-22) 上运行的工作设置,非常相似。
除了 LACP 速率和 1G (eno1+) vs 10G SFP+ (eno49+) 最大的区别似乎是使用
auto bond0
.其中一些选项可能是多余的。
在启动过程中看不到任何停顿。执行 a
systemctl restart networking
会产生几秒钟的短暂等待,但仅此而已。您必须允许系统启动绑定接口,即使从端口还没有准备好一直配置它,“bond-slaves none”会这样做。所以正确的配置示例:
我在 16.04 上也有一个有效的绑定设置,我的设置从 12.04 开始在 Ubuntu 上运行良好,没有改变。
我的解决方案与@timss 的解决方案几乎相同,但我从不需要弄乱 /etc/modprobe.d/bonding.conf 并且随着时间的推移我发现一些必要的细节,我将其包括在下面并将在结束。
下面,我在bond0上绑定了eth2-eth5接口
注释:
我想出了一个丑陋的黑客,我宁愿没有得到任何荣誉,但希望它可以帮助人们开始并在等待正确答案/修复时做更重要的事情:
它几乎包括重载整个 ifup 脚本。执行时会显示错误消息,
ifdown bond0
但根据设计 ifdown 会继续执行剩余的脚本,并且系统最终会干净(可以循环通过 ifup/ifdown),所以我不觉得有必要修复它。另外,由于从属服务器是在主服务器的脚本中处理的,因此无需在配置文件中声明它们。