arquivo de configuração de ligação 802.3ad em um servidor LTS do Ubuntu 16.04

4

Se eu usar uma configuração manual na linha de comando (seguindo as instruções do kernel ), Eu 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

Para o registro, o switch usado é um Cisco Nexus 2248, e eu 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 sobre o problema).

O problema é que não consigo criar um arquivo /etc/network/interfaces correto para que isso seja feito automaticamente no momento da inicialização. Há um lote de confusão online entre as diferentes versões do pacote ifenslave, notavelmente sua documentação, e sobre como evitar condições de corrida ao usar o ifup. O que quer que tenha funcionado 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, o que quer que eu tente, meus scripts ficam presos no momento da inicialização e eu tenho que esperar um ou cinco minutos antes do processo de inicialização ser 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, o bond0 fica parado por um minuto (porque bond0 está esperando que pelo menos um de seus escravos seja criado, isso nunca acontece, então ele expira), mas quando o sistema é inicializado, usando ifup eno1 funciona e bond0 começa a funcionar corretamente.

Se eu especificar auto eno1 , o processo de inicialização será interrompido por cinco minutos, o bond0 nunca será exibido corretamente e tentar usar ifdown eno1 ficará bloqueado porque está aguardando algum bloqueio em /run/network/wherever (não é possível lembre-se do arquivo exato, e tenha reiniciado esta máquina com bastante frequência já), o que parece indicar que sim, eu corri para uma condição de corrida e ifup ficou preso para sempre com eno1.

Alguém tem uma solução funcional no Ubuntu mais recente?

    
por To마SE 11.05.2016 / 10:28

4 respostas

2

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 .

# /etc/modprobe.d/bonding.conf
alias bond0 bonding
    options bonding mode=4 miimon=100 lacp_rate=1

Algumas dessas opções podem ser redundantes.

# /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

Não vendo nenhuma parada durante a inicialização. Fazer um systemctl restart networking produz uma espera curta de alguns segundos, mas nada mais.

$ systemd-analyze
Startup finished in 2.344s (kernel) + 1.658s (userspace) = 4.002s
    
por 19.05.2016 / 09:42
1

Eu também tenho uma configuração de ligação de trabalho em 16.04, e minha configuração funciona bem no Ubuntu desde 12.04, inalterada.

Minha solução é praticamente a mesma que a do @timss, mas eu nunca precisei mexer no /etc/modprobe.d/bonding.conf e há alguns detalhes que achei necessários ao longo do tempo, que incluí abaixo e comentará no final.

Abaixo, eu tenho interfaces eth2-eth5 ligadas em 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

Comentários:

  1. "hwaddress ether": notei que quando você liga suas interfaces, o endereço MAC da interface ligada será igual ao endereço MAC de uma das interfaces sendo conectadas, mas poderá mudar sempre que o sistema for reiniciado. Acho útil que os servidores tenham um endereço MAC conhecido, então, aqui, eu o defino para o MAC de uma das interfaces de uma maneira que seja permanente.
  2. "xmit_hash_policy": leia os documentos sobre essa opção e isso pode ter um impacto muito significativo no desempenho de sua interface vinculada.
por 12.09.2016 / 03:50
1

Você deve permitir que o sistema abra a interface bond, mesmo quando as portas escravas não estão prontas para configurá-lo o tempo todo, "nenhum dos escravos obrigatórios" faz isso. Exemplo de configuração correto:

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
    
por 19.01.2017 / 10:31
0

Eu criei um hack feio para o qual eu prefiro não receber nenhum crédito, mas espero que ajude as pessoas a começar e fazer coisas mais importantes enquanto aguarda por uma resposta / correção apropriada:

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

Consiste praticamente em sobrecarregar todos os scripts do ifup. Há mensagens de erro exibidas ao fazer ifdown bond0 , mas pelo ifdown do projeto continua executando os scripts restantes, e o sistema acaba limpo (é possível percorrer o ifup / ifdown), então não me sinto compelido a consertar isso. / p>

Além disso, como os escravos são atendidos no script do mestre, não há necessidade de declará-los no arquivo de configuração.

    
por 16.05.2016 / 19:13