Se eu usar uma configuração manual na linha de comando (seguindo as instruções do kernel ), posso configurar corretamente minha conexão de rede:
# modprobe bonding mode=4 miimon=100
# ifconfig bond0 up
# ip link set eno1 master bond0
# ip link set eno2 master bond0
Só para constar, o switch utilizado é um Cisco Nexus 2248, e não especifico um endereço IP porque há uma camada 802.1q adicional (cuja presença ou ausência no arquivo de configuração não tem impacto no problema).
O problema é que não consigo criar um /etc/network/interfaces
arquivo correto para que isso seja feito automaticamente no momento da inicialização. Há muita confusão online entre as diferentes versões do pacote ifenslave, principalmente sua documentação e sobre como evitar condições de corrida ao usar o ifup. O que funcionou com as versões anteriores do Ubuntu não funciona mais. E eu não ficaria surpreso se o systemd estivesse tornando as coisas ainda mais confusas. Basicamente, não importa o que eu tente, meus scripts travam no momento da inicialização e tenho que esperar um ou cinco minutos antes que o processo de inicialização seja concluído.
Isso é o melhor que consegui:
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
No momento da inicialização, a inicialização do bond0 trava por um minuto (porque o bond0 está esperando que pelo menos um de seus escravos seja ativado, isso nunca acontece, então ele atinge o tempo limite), mas depois que o sistema é inicializado, o uso ifup eno1
funciona e o bond0 é iniciado trabalhando corretamente.
Se eu especificar auto eno1
, o processo de inicialização para por cinco minutos, o bond0 nunca é ativado corretamente e tentar usá ifdown eno1
-lo ficará preso porque está aguardando algum bloqueio /run/network/wherever
(não consigo lembrar o arquivo exato e reiniciei esta máquina com frequência suficiente já), o que parece indicar que sim, entrei em uma condição de corrida e ifup está preso para sempre com eno1.
Alguém tem uma solução funcional no Ubuntu mais recente?
Eu tenho uma configuração de trabalho em execução no 16.04 (linux 4.4.0-22) que é muito semelhante.
Além da taxa LACP e 1G (eno1+) vs 10G SFP+ (eno49+), a maior diferença parece ser o uso de
auto bond0
.Algumas dessas opções podem ser redundantes.
Não vendo nenhuma parada durante a inicialização. Fazer um
systemctl restart networking
gera uma pequena espera de alguns segundos, mas nada mais.Você deve permitir que o sistema abra a interface de ligação mesmo quando as portas escravas não estiverem prontas para configurá-la o tempo todo, "escravos de ligação nenhum" faz isso. Então, exemplo de configuração certa:
Eu também tenho uma configuração de vínculo funcional em 16.04, e minha configuração funciona bem no Ubuntu desde 12.04, inalterada.
Minha solução é praticamente a mesma do @timss, mas nunca precisei mexer em /etc/modprobe.d/bonding.conf e há alguns detalhes que achei necessários ao longo do tempo que incluí abaixo e comentarei em o fim.
Abaixo, tenho interfaces eth2-eth5 ligadas em bond0
Comentários:
Eu criei um hack feio pelo qual prefiro não receber nenhum crédito, mas espero que ajude as pessoas a começar e fazer coisas mais importantes enquanto esperam por uma resposta/correção adequada:
Basicamente, consiste em sobrecarregar todos os scripts ifup. Há mensagens de erro exibidas ao fazer
ifdown bond0
, mas por design, ifdown continua executando os scripts restantes e o sistema acaba limpo (é possível alternar entre ifup/ifdown), então não me sinto compelido a consertar isso.Além disso, uma vez que os escravos são tratados no script do mestre, não há necessidade de declará-los no arquivo de configuração.