Ubuntu 16.04 LTS 服务器上的 802.3ad 绑定配置文件

Ubuntu 16.04 LTS 服务器上的 802.3ad 绑定配置文件

如果我在命令行上使用手动设置(按照内核指令),我可以正确设置我的网络连接:

# 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

评论:

  1. “hwaddress ether”:我注意到,当您绑定接口时,绑定接口的 MAC 地址将等于被绑定接口之一的 MAC 地址,但每次系统重新启动时,它都可能发生变化。我发现服务器拥有一个已知的 MAC 地址很有用,因此我在这里将其设置为接口之一的 MAC,这样就永久生效了。
  2. “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),因此我觉得没有必要修复这个问题。

此外,由于从属服务器在主服务器脚本中得到处理,因此无需在配置文件中声明它们。

相关内容