Назад | Перейти на главную страницу

Файл конфигурации связывания 802.3ad на сервере Ubuntu 16.04 LTS

Если я использую ручную настройку в командной строке (после инструкции ядра), Я могу правильно настроить свое сетевое соединение:

# 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 файл, чтобы это выполнялось автоматически во время загрузки. Eсть много онлайн-путаницы между различными версиями пакета 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?

Вы должны разрешить системе активировать интерфейс связывания, даже если подчиненные порты не готовы к его настройке все время, "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

У меня есть рабочая установка, работающая на 16.04 (linux 4.4.0-22), которая очень похожа.

Помимо скорости LACP и 1 Гбит / с (eno1 +) против 10 Гбит / с 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

У меня тоже есть рабочая установка связывания на 16.04, и моя установка хорошо работает на Ubuntu с 12.04, без изменений.

Мое решение почти такое же, как и от @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»: прочтите документацию об этой опции, она может иметь очень значительное влияние на производительность вашего связанного интерфейса.

Я придумал уродливый хакер, за который я бы предпочел не получать никаких кредитов, но, надеюсь, он поможет людям начать работу и делать более важные дела, ожидая надлежащего ответа / исправления:

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), поэтому я не чувствую себя обязанным исправлять это.

Кроме того, поскольку ведомые устройства обрабатываются в сценарии мастера, нет необходимости объявлять их в файле конфигурации.