Installation

Pré requis :

  • deux cartes réseaux
  • deux câbles croisés
  • le logiciel ifenslave (apt-get install ifenslave)

Pour vous repérer dans les logs, j'ai fait mes tests avec trois cartes réseaux sur chaque PC :

  • une 100 Mbps 3Com (eth0 : 192.168.4.108), relié à mon routeur serveur DHCP pour Internet.
  • une double 100 Mbps Intel pro (eth1 et eth2 : 192.168.0.10 et .5)

Explication :

Il faut commencer donc pas relier les deux cartes réseaux de chaque PCs avec deux câbles croisés. Ensuite lancer le module bonding

modprobe bonding

Il est normalement disponible sous forme de module sur tous les noyaux récents. Sinon activez le dans "Devices Drivers -> Networking support -> Bonding driver support" et recompilez votre noyau.

Nous pouvons maintenant monter notre interface virtuelle bond0 :

ifconfig bond0 192.168.0.10 netmask 255.255.255.0

on peut specifier notre addresse MAC à la main sinon on peut celle de la première interface montée :

ifconfig bond0 hw ether 00:11:22:33:44:55

Et ensuite relier nos deux interfaces au bond0:

ifenslave bond0 eth1
ifenslave bond0 eth2

Vérification

Et voila en 4 lignes nous avons une double connexion. Regardons de plus près notre configuration (ifconfig) :

serveur13:~% ifconfig
bond0    Lien encap:Ethernet  HWaddr 00:90:27:C6:7E:52
            inet adr:192.168.0.10  Bcast:192.168.0.255  Masque:255.255.255.0
            adr inet6: fe80::200:ff:fe00:0/64 Scope:Lien
            UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
            RX packets:1814210 errors:0 dropped:0 overruns:0 frame:0
            TX packets:1804998 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 lg file transmission:0
            RX bytes:2048947128 (1.9 GiB)  TX bytes:860980838 (821.0 MiB)
eth1      Lien encap:Ethernet  HWaddr 00:90:27:C6:7E:52
            inet adr:192.168.0.10  Bcast:192.168.0.255  Masque:255.255.255.0
            adr inet6: fe80::290:27ff:fec6:7e52/64 Scope:Lien
            UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
            RX packets:907105 errors:0 dropped:0 overruns:0 frame:0
            TX packets:902500 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 lg file transmission:1000
            RX bytes:1024438913 (976.9 MiB)  TX bytes:430469332 (410.5 MiB)
            Interruption:11 Adresse de base:0x9000 Mémoire:f5200000-f5200038
eth2      Lien encap:Ethernet  HWaddr 00:90:27:C6:7E:52
            inet adr:192.168.0.10  Bcast:192.168.0.255  Masque:255.255.255.0
            adr inet6: fe80::290:27ff:fec6:7e52/64 Scope:Lien
            UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
            RX packets:907105 errors:0 dropped:0 overruns:0 frame:0
            TX packets:902498 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 lg file transmission:1000
            RX bytes:1024508215 (977.0 MiB)  TX bytes:430511506 (410.5 MiB)
            Interruption:9 Adresse de base:0x9020 Mémoire:f5201000-f5201038

Vous pouvez remarquer que bond0, eth1 et eth2 ont tous la même adresse IP mais aussi la même MAC.

Pour vérifier notre bonding

vi /proc/net/bonding/bond0

qui donne :

Ethernet Channel Bonding Driver: v2.5.0 (December 1, 2003)

Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth1 
MII Status: up
Link Failure Count: 0

Slave Interface: eth2
MII Status: up
Link Failure Count: 0

Tests

Nous pouvons maintenant tester si nous avons bien doublé notre bande passante. J'utilise l'outil iperf pour ça. J'ai donc fait un test avec une simple connexion 100Mbits/sec puis un test avec les deux cartes en bonding.

Je fais le test en passant par la carte relié au routeur, lui-même relié à l'autre PC.

serveur13:~% iperf -c 192.168.4.185 -i 2

Client connecting to 192.168.4.185, TCP port 5001
TCP window size: 16.0 KByte (default)

[  3 local 192.168.4.108 port 32822 connected with 192.168.4.185 port 5001
[ ID Interval       Transfer     Bandwidth
[  3  0.0- 2.0 sec  22.1 MBytes  92.8 Mbits/sec
[  3  2.0- 4.0 sec  22.4 MBytes  93.9 Mbits/sec
[  3  4.0- 6.0 sec  22.4 MBytes  93.9 Mbits/sec
[  3  6.0- 8.0 sec  22.4 MBytes  93.9 Mbits/sec
[  3  8.0-10.0 sec  22.4 MBytes  93.8 Mbits/sec
[  3  0.0-10.0 sec   112 MBytes  93.6 Mbits/sec

Test sur le bonding.

serveur13:~% iperf -c 192.168.0.5 -i 2
Client connecting to 192.168.0.5, TCP port 5001
TCP window size: 16.0 KByte (default)

[  3 local 192.168.0.10 port 32811 connected with 192.168.0.5 port 5001
[ ID Interval       Transfer     Bandwidth
[  3  0.0- 2.0 sec  44.2 MBytes   185 Mbits/sec
[  3  2.0- 4.0 sec  44.8 MBytes   188 Mbits/sec
[  3  4.0- 6.0 sec  44.9 MBytes   188 Mbits/sec
[  3  6.0- 8.0 sec  44.8 MBytes   188 Mbits/sec
[  3  8.0-10.0 sec  44.8 MBytes   188 Mbits/sec
[  3  0.0-10.0 sec   224 MBytes   187 Mbits/sec

Alors, satisfait ?

Surveillance du lien réseau

Le driver bonding est capable de ne passer que sur une seule interface si un câble se débranche. Sachant que les pannes sur un serveur sont le plus souvent matérielles, cela permet une haute disponibilité. A noter deux petits outils permettant d'interroger les registres ETHTOOL et MII des cartes réseaux. Les outils sont donc mii-tool (issu du package net-tools) et ethtool. Toutes les interfaces ne supportent pas ces registres, dans ce cas on ne peut pas détecter la déconnexion (en fait il existe une solution en utilisant les requêtes ARP mais ça ne rentre pas dans ce cadre). Pour utiliser cette fonction du bonding il faut utiliser des modes tel que active-backup, pour plus d'info lisez la doc :).

Mii

serveur13:~% mii-tool eth0
eth0: negotiated 100baseTx-FD, link ok

serveur13:~% mii-tool eth1
eth1: negotiated 100baseTx-FD flow-control, link ok

serveur13:~% mii-diag eth0
Basic registers of MII PHY #24:  3000 786d 0000 0000 01e1 41e1 0005 2801.
The autonegotiated capability is 01e0.
The autonegotiated media type is 100baseTx-FD.
Basic mode control register 0x3000: Auto-negotiation enabled.
You have link beat, and everything is working OK.
Your link partner advertised 41e1: 100baseTx-FD 100baseTx 10baseT-FD 10baseT.
  End of basic transceiver information.
serveur13:~% mii-diag eth1
Basic registers of MII PHY #1:  3000 782d 02a8 0150 05e1 45e1 0001 ffff.
The autonegotiated capability is 01e0.
The autonegotiated media type is 100baseTx-FD.
Basic mode control register 0x3000: Auto-negotiation enabled.
You have link beat, and everything is working OK.

Your link partner advertised 45e1: Flow-control 100baseTx-FD 100baseTx 
          10baseT-FD 10baseT, w/ 802.3X flow control.
  End of basic transceiver information.

Ethtool

Avec la carte dual Interl pro :

serveur13:~% ethtool eth2
Settings for eth2:
       Supported ports:  TP MII 
       Supported link modes:   10baseT/Half 10baseT/Full
                               100baseT/Half 100baseT/Full
       Supports auto-negotiation: Yes
       Advertised link modes:  10baseT/Half 10baseT/Full
                               100baseT/Half 100baseT/Full
       Advertised auto-negotiation: Yes
       Speed: 100Mb/s
       Duplex: Full
       Port: Twisted Pair
       PHYAD: 1
       Transceiver: internal
       Auto-negotiation: on
       Supports Wake-on: pg
       Wake-on: d
       Link detected: yes

Avec la carte 3Com, ça ne fonctionne pas

serveur13:~% ethtool eth0
Settings for eth0:
No data available

Conclusion

Vous avez vu qu'en quelques lignes, il est facile d'augmenter sa bande passante entre deux PCs reliés directement. A vous d'affiner cette configuration, je pense par exemple au fichier /etc/network/interfaces. Il est aussi possible de faire ce genre de chose en passant par un switch mais il faut qu'il supporte le trunking ou l'agrégation dynamique 802.3ad. Le channel bonding utilisé sous Linux est l'équivalent du Trunking de D-LINK ou encore de l'EtherChannel de CISCO. Tous ces systèmes ou équipements sont conformant à la norme IEEE 802.3ad.

Doc