Vous commencez à le savoir, j'ai une vie passionnante ! Ajoutez à cela quelques problèmes de sommeil, et vous obtenez un Georges (doux, poilu, mais un peu encombrant).
Ça fait presque un an que le tableau en face de mon bureau comporte le schéma d'un eredondance de switchs genre plat de pâtes dans "La belle et le clochard".
Chez moi je vous avouerais que ça serait pas d'une utilité cruciale. Déjà j'ai pas forcément la place pour avoir tous mes équipements en double, et j'ai pas le budget.
Mais pour la culture, j'ai quand même voulu tester l'agrégation de cartes réseaux et passer mon network en gigabit. C'est quand même plus appréciable de pouvoir profiter de son serveur de fichier à la vitesse de l'éclair.
Désormais, on trouve facilement dans le commerce des cartes Gigabit pour une dizaine d'euros (soit 2 pintes). Très abordable donc (d'autant plus que je ne bois pratiquement pas). Du coup, j'ai repris le même modèle que ce que j'avais déjà : une D-Link DGE-528T. Déjà ça tourne sur Linux out-of-da-box, et puis je me suis dit que pour faire du bonding, avoir deux interfaces identiques c'était pas une mauvaise idée.
Ensuite, comme j'aime bien que tout soit bien rangé (numériquement du moins, la vaisselle ça compte pas ), on "hack" udev pour qu'il renomme nos interfaces :
% cat /etc/udev/rules.d/70-persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single line.
# PCI device 0x1186:0x4300 (r8169)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:26:5a:xx:xx:b1", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="dl1"
# PCI device 0x1106:0x3065 (via-rhine)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:16:17:xx:xx:da", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
# PCI device 0x1186:0x4300 (r8169)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:26:5a:xx:xx:29", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="dl0"
Nos deux interfaces D-Link se nommeront donc respectivement dl0 et dl1.
On installe ensuite ifenslave qui nous permettra de configurer notre bonding.
% aptitude install ifenslave-2.6 # sur noyau 2.6
Puis on configure notre interface :
% cat /etc/network/interfaces
auto dl0
iface dl0 inet manual
auto dl1
iface dl1 inet manual
# Bonding des cartes d-link
auto bond0
iface bond0 inet static
address x.x.x.10
netmask 255.0.0.0
network x.x.x.0
broadcast x.x.x.255
slaves dl0 dl1
# bond_mode active-backup
bond_mode balance-alb
bond_miimon 100
# bond_downdelay 200
# bond_updelay 200
On remarquera qu'il existe plusieurs options de bonding. J'ai choisis le mode balance-alb car il ne requiert pas de support particulier par le switch.
Une fois la configuration terminée, on relance le service réseau, et on admire le résultat :
% /etc/init.d/networking restart
% ifconfig
bond0 Link encap:Ethernet HWaddr 00:26:5a:xx:xx:29
inet addr:x.x.x.10 Bcast:x.x.x.255 Mask:255.0.0.0
inet6 addr: fe80::xxxx:xxxx:febc:d129/16 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:607096 errors:0 dropped:0 overruns:0 frame:0
TX packets:1161831 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:315395882 (300.7 MiB) TX bytes:1011808371 (964.9 MiB)
dl0 Link encap:Ethernet HWaddr 00:26:5a:xx:xx:29
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:79358 errors:0 dropped:0 overruns:0 frame:0
TX packets:691743 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:58332730 (55.6 MiB) TX bytes:639080990 (609.4 MiB)
Interrupt:17
dl1 Link encap:Ethernet HWaddr 00:26:5a:xx:xx:b1
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:527738 errors:0 dropped:0 overruns:0 frame:0
TX packets:470088 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:257063152 (245.1 MiB) TX bytes:372727381 (355.4 MiB)
Interrupt:18 Base address:0x2000
On voit bien que nos deux interfaces dl0 et dl1 sont utilisées, et que la somme des deux donne bond0. De plus, je peux débrancher un des deux câbles durant un transfert sans crainte.
Au final, j'ai donc une bande passante multipliée par deux en sortie de mon serveur, et donc sur mon "backbone". Ainsi qu'une redondance en cas de panne.
Bref, je ne pouvais pas passer à côté de cette expérience.