Repository 32bit  Forum
Repository 64bit  Wiki

Linux Bonding Mini-Howto

Da Slacky.eu.

Questo documento descrive come installare ed usare due o piu' schede di rete in bonding su Slackware Linux 10.1

Indice

Premessa

Questa non vuole essere assolutamente un trattato sul bonding (alias port trunking) ne avere la pretesa di completezza e infallibilita'. Piu' che altro vuole essere una semplice quanto (spero) efficace e pratica raccolta di esperienze in ambito sistemistico con il bonding e la nostra amata Slackware.

Cosa fa il bonding?

Il bonding e' un driver di rete che permette di raggruppare logicamente due o piu' interfacce di rete (eth0, eth1 ..) e di farle funzionare come un unica entita', combinando a tutti gli effetti caratteristiche come banda e disponibilita' di servizio. Subito un esempio:

         +----------+                          +----------+
         |          |eth0                  eth0|          |
         |  Client  +--------------------------+  Server  |
         |          +--------------------------+          |
         |          |eth1                  eth1|          |
         +----------+                          +----------+
  

supponiamo di avere un client e un server rispettivamente con 2 schede di rete da 100Mb. per completezza di esempio sia:

Lato Client: eth0 --> 192.168.0.1
eth1 --> 192.168.0.2
Lato Server: eth0 --> 192.168.0.3
eth1 --> 192.168.0.4

Colleghiamo con un cavo cross l'eth0 del client con l'eth0 del server, facciamo lo stesso con un'altro cavo cross con le eth1. Ora proviamo a trasferire dal server al client una grossa mole di dati via ftp, quindi dal client lanciamo un ftp 192.168.0.3. Supponendo che il traffico segua solo la direzione

  	192.168.0.3 --> 192.168.0.1

avremo che il trasferimeto avviene con una banda di 100Mb/s, che ad occhio e croce significa 1GB ogni minuto e mezzo, dovendo trasferire per esempio una iso di un DVD da 4,5GB ci impiegheremo circa 6/8 minuti. E con l'altra scheda di rete che ci faccio? A meno che i file non siano piu' di uno, cosi' da poter sfruttare il traffico su 192.168.0.4 --> 192.168.0.2 trasferendoli a piu' mani ottimizzando tempo e banda; assolutamente niente. Qui entra in campo il bonding (finalmente), esso permette di aggregare logicamente la eth0 con la eth1 in una nuova scheda di rete che chiameremo bond0 a cui sara' assegnato un solo ip, la nuova situazione sara':

Lato Client: bond0 --> 192.168.0.1 Lato Server: bond0 --> 192.168.0.2

(ovviamente i collegamenti delle schede di rete con i due cavi cross rimarranno sempre gli stessi). Nella modalita' load-balancing del bonding avremo quindi le bond0 con una banda di ben 200Mb/s, il trasferimento via ftp impieghera' meta' tempo e, se avessimo avuto piu' di un file, con un piu' comodo mget *.

Dove posso usare il bonding?

Praticamente ovunque. Supponiamo invece di avere 2 schede da 100Mb, 2 schede Gigabit, stiamo parlando di 2Gb/s di banda. Ma perche' non esagerare con 3 o piu' schede ... parliamo di prestazioni ottenibili solo con fibra ottica. Attenti pero' ad esagerare, entrano in campo fattori come la potenza di calcolo di PC e Switch e i costi lievitano soprattutto per quest'ultimo. Immaginiamo solo che con una modica spesa ho elimitato uno dei colli di bottiglia del cluster hpc che tutti noi abbiamo in casa o al lavoro ;-) Tutto qui? Certamente no. In modalita' active-backup il bonding permette di usare solo la eth0, quindi sfruttare solo i 100Mb/s, ma in caso si guastasse o si rompesse il proprio cavetto Lan di collegamento, automaticamente e senza colpo ferire, entrerebbe in azione la eth1 (fin' ora rimasta a riposare). Immaginate la situazione in cui un sabato mattina la signora delle pulizie, passando l'aspirapolvere, strattona il cavo lan e il vostro prezioso server che deve funzionare 25 ore al giorno (e se si ferma per due secondi se ne accorge mezzo mondo) non e' piu' connesso alla rete: tempo i due suddetti secondi e il vostro capo vi tira giu dal letto. Se aveste avuto due schede di rete configurate in bonding, avrete potuto continuare a dormire (si sa, il venerdi notte si fa sempre tardi) e il lunedi, con calma e sorseggiando uno di quei buonissimi caffe delle machinette mangiasoldi, riattaccato il cavo Lan.

Ma quante sono le modalita' di Bonding?

Le modalita di bonding sono sei, andiamo ad elencarle:

mode0

balance-rr, questo e' la modalita' load-balancing con algoritmo round-robin vista sopra. In pratica i pacchetti vengono trasmessi in sequenza a partire dalla prima sheda di rete all'ultima appartenente al raggruppamento. In parole povere supponendo di avere 3 Slave: eth0, eth1, eth2 che appartengono al Master bond0, il pacchetto numero 1 passa dalla eth0, il 2 dalla eth1, il 3 dalla eth2, il 4 di nuovo dalla eth0 e cosi' via.

mode1

active-backup, questa e' la modalita' in cui e' attiva solo una slave per volta, la successiva scheda appartenente alla bond0 diventa attiva solo nel caso in cui la slave primaria, attualmenta attiva, perdesse il collegamento. Il MAC address visibile all'esterno e' solo il MAC assegnato alla bond0 (che corrisponde al MAC di una scheda fisica). Viene usata per garantire il Fault Tollerace del collegamento.

mode2

balance-xor, questa modalita' usa un algoritmo basato sull' XOR logico 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.

mode3

broadcast, questa modalita' viene usata per trasmettere tutti i pacchetti su tutte le schede di rete aggregate. Viene usata per garantire fault-tollerance.

mode4

802.3ad, vengono utilizzate tutte le schede di rete attive facenti parte della bond0 in accordo con le specifiche 802.3ad. Richiede Nic e Switch che supportino le specifiche 802.3ad.

mode5

balance-tlb, in questa modalita' si ha il load-balancing adattativo (in funzione del traffico) solo in trasmissione.

mode6

balance-alb, questa e' la modalita' di load-balancing adattativo in entrambe le direzioni.


Le modalita' piu' usate sono le prime 4, personalemnte ho potuto 
sperimentare solo le prime due, ed e' di queste che vi raccontero'.

Che cosa serve?

Serve un pc con Slackware Linux con due recenti schede di rete. Le prove le ho fatte su una 10.1 con kernel 2.4.29, per la cronaca ho fatto le stesse prove con una Debian Woody con kernel 2.4.26 e due schede di rete gigabit.

Cosa devo fare?

Assicuratevi che il modulo mii sia tra i moduli del kernel caricati di default all'avvio (da me e' attivo) serve per monitorare il link delle schede di rete (con delle attuali 100Mb in su non doveste avere problemi). Per facilitarvi le cose costruitevi uno script come questo (come root):

  #!/bin/bash
  # carico il modulo bonding in modalita' balance-rr (mode=0) e
  # imposto il monitoraggio del link attivo a 100 ms (miimon=100)
  modprobe bonding mode=0 miimon=100
  # disattivo la eth0 e la eth1 se sono attive
  ifconfig eth0 down
  ifconfig eth1 down
  # associo il MAC address della eth0 (o della eth1) alla bond0
  ifconfig hw ether AA:BB:CC:DD:EE:FF
  # configuro bond0 con un ip di classe C privata e la attivo
  ifconfig bond0 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255 up
  # attivo la primary slave
  ifenslave bond0 eth0
  # attivo la seconda slave
  ifenslave bond0 eth1
  

Alla fine facendo un cat /proc/net/bonding/bond0 dovreste vedere qualcosa di simile

Bonding Mode: load balancing (round-robin)

       Currently Active Slave: eth0
       MII Status: up
       MII Polling Interval (ms): 100
       Up Delay (ms): 0
       Down Delay (ms): 0
       Slave Interface: eth1
       MII Status: up
       Link Failure Count: 1
       Slave Interface: eth0
       MII Status: up
       Link Failure Count: 1

che riassume lo stato del bonding, mentre se fate un ifconfig dovreste vedere qualcosa di simile

  bond0    Link encap:Ethernet  HWaddr AA:BB:CC:DD:EE:FF  
           inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
           UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0 
           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
  eth0     Link encap:Ethernet  HWaddr AA:BB:CC:DD:EE:FF  
           UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:1000 
           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
           Interrupt:11 Base address:0x1060 

 eth1     Link encap:Ethernet  HWaddr AA:BB:CC:DD:EE:FF  
           UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:1000 
           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
           Interrupt:11 Base address:0x1020 	
  lo       Link encap:Local Loopback  
           inet addr:127.0.0.1  Mask:255.0.0.0
           UP LOOPBACK RUNNING  MTU:16436  Metric:1
           RX packets:20 errors:0 dropped:0 overruns:0 frame:0
           TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0 
           RX bytes:1424 (1.3 Kb)  TX bytes:1424 (1.3 Kb)

che vi fa vedere le interfacce al momento attive. Tutto qui. Ovviamente questo e' un esempio, se volete usare l'active-backup dovete solo mettere mode=1 al posto di mode=0, potete usare anche piu' di due schede di rete; l'indirizzo ip e la classe mettete quelli che fanno al caso vostro, con un eventuale gateway, etc, etc ...

ifenslave?

ifenslave e' il comando che serve per aggregare le slave al master. Trovate ifenslave.c tra sorgenti del kernel della vostra Slack in /usr/src/linux/Documentation/networking/ifenslave.c lo potete compilare secondo le indicazioni che riportate nel file gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c \ -o ifenslave e alla fine lo potete copiare in /sbin con i permessi di root. cp ifenslave /sbin/ifenslave Se qualcuno non avesse confidenza col gcc, o sul proprio server di produzione non lo avesse installato, lo puo' trovare nel repository Slacky

Considerazioni Finali

Fin'ora abbiamo parlato solo di bond0, ma ovviamente possono esistere anche bond1 ecc... Potreste prepararvi un /etc/modules.conf con queste righe

   alias bond0 bonding
   options bond0 -o bond0 mode=0 miimon=100
   alias bond0 bonding
   options bond0 -o bond0 mode=1 miimon=100

Una volta attivato il bonding, se volete l'eth0 e l'eth1, dovete operare il cosiddetto detach delle slave, ovvero slegare le eth dalla bond in questo modo:

   ifenslave -d bond0 eth0
   ifenslave -d bond0 eth1
   ifconfig bond0 down

quindi tirare su le eth con i rispettivi ip. Il MAC addres della bond0 puo' essere preso indistintamente dalla eth0 o dalla eth1, ma e' conseutudine prenderlo dalla primary slave, ovvero dalla eth0; mi raccomando non inventatevene uno, il MAC e' un indirizzo univoco sulla rete internet. Chi decidesse di mettere in promiscous mode la bond0, deve sapere che nei mode=0, 2, 3 e 4 il promiscous mode viene propagato a tutte le slave; nei mode=1, 5, 6 solo a quelle attive (vedi cat /proc/net/bonding/bond0). Se le mie 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. Vi sconsiglio di usare schede di rete miste con supporto all'mii solo per alcune, anzi vi sconsiglio di usare schede che non supportino mii, (lo vedete perche' il driver non richiede l'mii). Vi sconsiglio pure l'uso di schede di rete pilotate da driver che non vengono piu' sviluppati da un bel po'. Ho usato delle Broadcom Gigabit (su di un HP DL 380) con successo, invece ho usato 2 Realtek 10Mb con modulo ne2k-pci e un'accoppiata di altre 2 Realtek, una pilotata da ne2k-pci e l'altra da un 8139too (con mii) con insuccesso. Con insuccesso intendo che non sono stato in grado di attivare tutte le varie modalita' di bonding. Con questo script pero' ifconfig eth0 down

   ifconfig eth1 down
   modprobe arp_interval=100 arp_ip_target=aa.bb.cc.dd
   ifconfig hw ether AA:BB:CC:DD:EE:FF
   ifconfig bond0 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255 up
   ifenslave bond0 eth0
   ifenslave bond0 eth1

ho attivato un load-balancing (roud-robin) con funzionalita' di backup su due schede di rete Realtek a 10Mb col coassiale; bisogna quindi saper fare di necessita' virtu' ;-)

Concludo qui, questo piccolo mini-howto sul bonding con la speranza di aver suscitato in qualcuno la curiosita' per questa potenzialita' offerta da linux. Mi scuserete per la lungaggine e se troverete qualche termine tecnico mal tradotto, come pure qualche sgrammaticatura: approfittatene per una risata, serve per allentare lo stress sul lavoro. Accogliero' quanti vogliano con suggerimenti o critiche aggiungere o modificare parte di questo mini-howto con le loro esperienze ed osservazioni.

Approfondimenti

/usr/src/linux/Documentation/networking/bonding.txt Indirizzi vari, basta googglare un po' anche nei gruppi.

Ringraziamenti

Vorrei ringraziare quanti di voi volessero lasciare un feedback sulla loro avventura, o che magari trovassero anche solo delle inesattezze. La Signora delle pulizie (di cui sopra) perche' se non fosse per lei la polvere non sarebbe solo dentro i server ;-)

Linux Bonding Mini-Howto by diego @ slacky v 1.0 30-05-2005

Strumenti personali
Namespace

Varianti