Если я использую ручную настройку в командной строке (после инструкции ядра), Я могу правильно настроить свое сетевое соединение:
# 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
Комментарии:
Я придумал уродливый хакер, за который я бы предпочел не получать никаких кредитов, но, надеюсь, он поможет людям начать работу и делать более важные дела, ожидая надлежащего ответа / исправления:
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), поэтому я не чувствую себя обязанным исправлять это.
Кроме того, поскольку ведомые устройства обрабатываются в сценарии мастера, нет необходимости объявлять их в файле конфигурации.