Bonding (Collegare 2 schede di rete x aumentare la banda)

Gio, 29/05/2008 - 15:23

Bonding (Collegare 2 schede di rete x aumentare la banda)

Inviato da koko82 3 commenti
Cosa significa il termine bonding?

Bonding (o Teaming) significa avere due interfacce di rete aggregate in modo da apparire come unica interfaccia fisica. La nuova interfaccia verrà chiamata bond0. Per ottenere questo in linux avremo bisogno di alcune utility e alcuni moduli che vedremo in seguito.

Cosa permette di fare in modo pratico il bonding?

La nuova interfaccia virtuale (bond0) permette diverse configurazioni tra cui:

1) aggregazione active-active: aumenta l'ampiezza di banda garantendo la ridondanza;
2) aggregazione active-standby: crea solo una ridondanza del servizio;
3) aggregazione round-robin: bilancia il carico e permette fault tolerance;
4) aggregazione active-backup: solo per fault tolerance.
Scenario realizzato per questa guida.

Per fare il channel bonding abbiamo visto che servono almeno due interfacce di rete. Supponiamo nel nostro esempio di avere a disposizione due personal computer per la nostra rete casalinga (un client e un server). Ogni pc avrà a disposizione due interfacce (eth0 e eth1) che verranno aggregate per formarne una virtuale (bond0). Colleghiamo con un cavo cross l'interfaccia eth0 lato server com l'eth0 lato client. Eseguiamo lo stesso procedimento per le eth1.

Come ottenere il bonding?

Per poter utilizzare il metodo descritto avremo bisogni di alcuni pacchetti e alcuni moduli del kernel come già anticipato in precedenza. I pacchetti che dobbiamo aver installati sono: net-tools, iputils e ethtool facilmente scaricabili dal repository. Se non li abbiamo ancora installati, installiamoli. Per ottenere il channel bonding, il kernel deve avere il supporto per il bonding delle periferiche. Abbiamo a disposizione due modi per controllare:

1)
# modprobe --list | grep -i bonding

/lib/modules/2.6.20-16-generic/kernel/drivers/net/bonding/bonding.ko
2)

# find /lib/modules/`uname -r` -iname bonding*

/lib/modules/2.6.20-16-generic/kernel/drivers/net/bonding/bonding.ko

Utilizzeremo inoltre mii-tool e il modulo mii.o quindi controlliamo anche la sua esistenza sul nostro sistema. Anche qui abbiamo due modi per controllare:

1)
# find /lib/modules/`uname -r` -iname mii*

/lib/modules/2.6.20-16-generic/kernel/drivers/net/mii.ko

2)

# modprobe --list | grep -i mii

/lib/modules/2.6.20-16-generic/kernel/drivers/net/mii.ko

Nel caso in cui i due moduli non siano presenti nella nostra configurazione kernel dovremo ricompilare quest'ultimo spuntando i moduli:

Device Drivers --->
Networking support --->
Bonding driver support
e
Device drivers --->
Network device support --->
Ethernet --->
Generic Media Indipendent Interface device support
E' logico supporre che entrambi i personal dovranno avere i suddetti moduli e pacchetti.

Una volta configurati i moduli ed installati i pacchetti controlliamo che le nostre schede di rete supportino il MII. Si può verificare che il driver della scheda supporti il link MII con il seguente comando:

ethtool | grep "Link detected:"

Se MII è supportato, l'output dovrebbe essere il seguente:
Link detected: yes

Come si configura il bonding?
I file che andremo a configurare per ottenere il channel bonding sono:
1) /etc/modules.conf
2) /etc/sysconfig/network-scripts/ifcfg-bond
3) /etc/sysconfig/network-scripts/ifcfg-eth

Il primo file da editare è /etc/modules.conf dove potremo inserire il nome dell'interfaccia e le seguenti opzioni:
mode=[0..6]
(Indica la modalità di funzionamento dell'interfaccia virtuale)
Le modalità sono 6. Le prime quattro sono quelle maggiormente usate. Vediamole in successione:

1) mode=0 (balance-rr): Imposta una policy del tipo round-robin per il bilanciamento del carico e per il fault tolerance. Le trasmissioni vengono ricevute e inviate in modo sequenziale (eth0,eth1,eth0,...), su ogni interfaccia slave di tipo 'bonded', iniziando con la prima disponibile.
2) mode=1 (active-backup): Imposta una policy del tipo active-backup per il fault tolerance. Le trasmissioni vengono ricevute e inviate tramite la prima interfaccia slave di tipo 'bonded'. Un'altra interfaccia slave di tipo 'bonded' viene usata solo se la prima interfaccia non ha un esito sperato. Il MAC address visibile all'esterno e' solo il MAC assegnato alla bond0 (che corrisponde al MAC di una scheda fisica).
3) mode=2 (balance-xor): Imposta una policy del tipo XOR tra MAC address di destinazione e quello sorgente per garantire la selezione della medesima slave in base alla sorgente. Viene usata per garantire load-balancing e contemporaneamente fault-tollerance.
4) mode=3 (broadcast): questa modalita' viene usata per trasmettere tutti i pacchetti su tutte le schede di rete aggregate. Viene usata per garantire fault-tollerance.
5) mode=4 (802.3ad): Imposta una policy del tipo IEEE 802.3ad dynamic link aggregation. Crea gruppi d'aggregazione che condividono la stessa velocità e impostazioni duplex. Trasmette e riceve su tutte le interfacce slave nell'aggregator attivo. Richiede Nic e Switch che supportino le specifiche 802.3ad.
6) mode=5 Imposta una policy Transmit Load Balancing (TLB) per il fault tolerance e per il bilanciamento del carico. Il traffico in uscita viene distribuito a seconda del carico su ogni interfaccia slave. Il traffico in ingresso viene ricevuto dall'interfaccia slave corrente. Se lo slave ricevente fallisce, un altro al suo posto assume il controllo dell'indirizzo MAC. Bond usato solo in trasmissione.
7) mode=6 Imposta una policy Active Load Balancing (ALB) per il fault tolerance e per il bilanciamento del carico. Include la trasmissione e la ricezione del bilanciamento del carico per il traffico IPV4. La ricezione del bilanciamento del carico viene raggiunta grazie ad un ARP negotiation. Bond usato in trasmissione e ricezione.

Altri valori da impostare nel file sono:

miimon= è la frequenza di controllo del link MII espressa in millisecondi. La diminuzione di questo parametro è inversamente proporzionale alla reattività del sistema in caso di rotture. Il valore standard è 100.
downdelay= Attesa (in millesecondi) prima della disabilitazione dell'interfaccia a seguito del fallimento del link. Deve essere un multiplo di miimon. Il valore 0 (default) lo disabilita.
updelay= Attesa (in millesecondi) prima dell'abilitazione del link. Deve essere un multiplo di miimon. Il valore 0 (default) lo disabilita.
arp_interval= Frequenza di controllo ARP in millisecondi. In mode 0 o 2 lo switch di rete deve essere configurato per distribuire i pacchetti in modo uniforme attraverso i NIC. Il valore 0 (default) lo disabilita.
arp_ip_target= Specifica l'indirizzo IP target delle richieste ARP quando il parametro arp_interval è abilitato. Si possono specificare fino a 16 indirizzi IP in un elenco separato da una virgola.
primary= Specifica il nome dell'interfaccia primaria nel dispositivo virtuale bond. Nelle configurazioni Active-Standby è l'interfaccia sempre attiva e viene disabilibilitata solo in caso di fault.
multicast= Abilita il supporto multicast secondo le seguenti modalità:
0 — Disabilita il supporto multicast.
1 — Abilita il supporto multicast, ma solo sullo slave attivo.
2 — Abilita il supporto multicast su tutti gli slave (il default).
È importante che i parametri arp_interval e arp_ip_target o miimon siano specificati. Diversamente si potrebbe avere un comportamento impredicibile in caso di fault di una scheda.

Impostiamo alcuni valori fondamentali nel file /etc/modprobe.conf per poter attivare la modalità 0.

install bond0 /sbin/modprobe -a eth0 eth1 && /sbin/modprobe bonding
alias bond0 bonding
options bond0 mode=0 miimon=100

/etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
IPADDR=192.168.1.1
NETMASK=255.255.255.248
BROADCAST=192.168.1.7
ONBOOT=yes
BOOTPROTO=none
USERCTL=no

/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

/etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

Eseguiamo queste modifiche per entrambi i personal computer (server e client), riavviamo entrambi. Se tutto è andato per il verso corretto dovremmo riscontrare uma situazione simile per ogni computer:

# ifconfig

bond0 Link encap:Ethernet HWaddr AA:BB:CC:DD:EE:FF
inet addr:192.168.1.1 Bcast:192.168.1.7 Mask:255.255.255.248
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
eth0 Link encap:Ethernet HWaddr AA:BB:CC:DD:EE:FF
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
eth2 Link encap:Ethernet HWaddr AA:BB:CC:DD:EE:FF
UP BROADCAST SLAVE MULTICAST MTU:1500 Metric:1

Se la vostra configurazione è simile a questa siete a cavallo; tutto è andato bene. Ora navigate come sempre e quando volete, staccate uno dei due cavi cross. Che succede? Nulla! Il channel bonding há rilevato un errore su quel collegamento e ha attivato il successivo. Ci sono ulteriori modi per poter configurare il bonding.
Sono tutti descritti nel file Documentation/networking/bonding.txt del proprio kernel.

Chi decidesse di mettere in promiscue mode la bond0, deve sapere che nei mode=0, 2, 3 e 4 il promiscue mode viene propagato a tutte le slave; nei mode=1, 5, 6 solo a quelle attive.

Se le proprie schede di rete non supportano mii? Nessun problema si puo' attivare il bonding passando parametri come l'arp_interval, arp_ip_target e l'use_carrier per il monitoraggio di uno o piu' ip esterni.

Far funzionare due o piu' schede in bonding puo' non essere cosi' facile, le prove fatte con svariate schede come 3com, ne, Realtek, Broadcom non hanno sempre avuto esito positivo.

ATTENZIONE!Ho riscontrato un errore con il channel bonding nel caso in cui nel file ifcfg-bond0 fosse presente la voce MII_NOT_SUPPORTED=no

Spero vi sia stato di aiuto e spero di non aver scritto geroglifici. Accetto di buon grado critiche costruttive e aggiunte.
Fate sapere se funziona o meno.


In:



Commenti

Ritratto di Moreno
#1

Inviato da Moreno il Ven, 30/05/2008 - 06:04.

Grazie

Ciao

Non posso che ringraziarti dell'ottima guida, un altra lacuna è stata colmata.

Mi sa che anche tu fai il programmatore visto come giochi con gli annidamenti, se invece fosse un errore mi dovresti dire dove chiudere i riquadri.

Ciao Ciao, Moreno

Addio, e grazie per tutto il pesce.
Avatar by moonlight-dream.



Ritratto di koko82
#2

Inviato da koko82 il Ven, 30/05/2008 - 16:20.

Re: Grazie

Grazie mille. Bhe anche se sono un informatico e so programmare credo di aver saltato qualche chiusura qua e la. Me ne scuso profondamente. Allora se hai tempo puoi modificarla come ti pare. Nessun problema da parte mia. Se vuoi che lo faccia io ... ora sono un filo di corsa. Appena ho tempo giuro che la sistemo se posso.

Cmq nota per la guida. Con le schede:
realtek 8139 pure e semplici (tanto per capirci quelle che costano pochissimo);
con la scheda 3com con chip 3c59x;
con la scheda sis con chip sis900
funziona tutto alla perfezione. Lo preciso dato che in rete molti lamentano il fatto che la scheda non funziona con tale modalità.
Ciao ciao
Divertitevi pure a mandare un sacco di traffico di qua e di la nella vostra rete casalinga.

Laughing koko82 Laughing



Ritratto di Moreno
#3

Inviato da Moreno il Sab, 31/05/2008 - 15:34.

Re: Grazie

Ciao

Penso di avere sistemato correttamente i riquadri, se non fosse così fammi un fischio.

Ciao Ciao, Moreno

Addio, e grazie per tutto il pesce.
Avatar by moonlight-dream.