如果我在命令行上使用手动设置(按照内核指令),我可以正确设置我的网络连接:
# 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
就会起作用并且 bond0 会开始正常工作。
如果我指定auto eno1
,那么启动过程将停滞五分钟,bond0 永远不会正确启动,并且尝试使用ifdown eno1
将会卡住,因为它正在等待某些锁定/run/network/wherever
(不记得确切的文件,并且已经多次重新启动这台机器),这似乎表明是的,我遇到了竞争条件并且 ifup 永远卡在 eno1 上。
有人对最新的 Ubuntu 有可行的解决方案吗?
答案1
我有一个在 16.04(linux 4.4.0-22)上运行的工作设置,非常相似。
除了 LACP 速率和 1G(eno1+)与 10G SFP+(eno49+)之外,最大的区别似乎是使用auto bond0
。
# /etc/modprobe.d/bonding.conf
alias bond0 bonding
options bonding mode=4 miimon=100 lacp_rate=1
其中一些选项可能是多余的。
# /etc/network/interfaces
auto eno49
iface eno49 inet manual
bond-master bond0
auto eno50
iface eno50 inet manual
bond-master bond0
auto bond0
iface bond0 inet static
address 10.0.0.1
netmask 255.255.255.0
bond-slaves eno49 eno50
bond-mode 4
bond-miimon 100
bond-lacp-rate 1
启动过程中没有看到任何停顿。执行此操作systemctl restart networking
会短暂等待几秒钟,但仅此而已。
$ systemd-analyze
Startup finished in 2.344s (kernel) + 1.658s (userspace) = 4.002s
答案2
您必须允许系统启动 Bond 接口,即使从属端口尚未准备好进行配置,“bond-slaves none” 就是这样做的。正确的配置示例如下:
allow-hotplug eno1
iface eno1 inet manual
bond-master bond0
allow-hotplug eno2
iface eno2 inet manual
bond-master bond0
auto bond0
iface bond0 inet manual
bond-mode 802.3ad
bond-miimon 100
bond-lacp-rate fast
bond-slaves none
bond-xmit_hash_policy layer2+3
答案3
我在 16.04 上也有一个有效的绑定设置,并且我的设置从 12.04 开始在 Ubuntu 上运行良好,没有变化。
我的解决方案与@timss 的解决方案非常相似,但我不需要弄乱 /etc/modprobe.d/bonding.conf,并且我发现随着时间的推移有一些必要的细节,我将其包含在下面并将在最后进行评论。
下面,我将接口 eth2-eth5 绑定在 bond0 上
auto eth2
iface eth2 inet manual
bond-master bond0
auto eth3
iface eth3 inet manual
bond-master bond0
auto eth4
iface eth4 inet manual
bond-master bond0
auto eth5
iface eth5 inet manual
bond-master bond0
auto bond0
iface bond0 inet manual
hwaddress ether 00:00:00:00:00:00 <= ADD MAC of one of the bonded interfaces here
bond-slaves eth2 eth3 eth4 eth5
bond-miimon 100
bond-mode 802.3ad
bond-lacp-rate 1
xmit_hash_policy layer3+4
评论:
- “hwaddress ether”:我注意到,当您绑定接口时,绑定接口的 MAC 地址将等于被绑定接口之一的 MAC 地址,但每次系统重新启动时,它都可能发生变化。我发现服务器拥有一个已知的 MAC 地址很有用,因此我在这里将其设置为接口之一的 MAC,这样就永久生效了。
- “xmit_hash_policy”:阅读有关此选项的文档,它会对绑定接口的性能产生非常显著的影响。
答案4
我想出了一个丑陋的黑客方法,我宁愿不获得任何荣誉,但希望它能够帮助人们开始并在等待正确的答案/修复时做更重要的事情:
auto bond0
iface bond0 inet manual
pre-up modprobe bonding mode=4 miimon=100
pre-up ifconfig bond0 up
pre-up ip link set eno1 master bond0
pre-up ip link set eno2 master bond0
up /bin/true
down /bin/true
post-down ip link set eno2 nomaster
post-down ip link set eno1 nomaster
post-down ifconfig bond0 down
post-down rmmod bonding
它基本上就是重载整个 ifup 脚本。执行时会显示错误消息ifdown bond0
,但根据设计,ifdown 会继续执行剩余的脚本,最终系统会恢复正常(可以循环执行 ifup/ifdown),因此我觉得没有必要修复这个问题。
此外,由于从属服务器在主服务器脚本中得到处理,因此无需在配置文件中声明它们。