Netzwerk/bonding
02.04.2007 : Die Begriffe "NIC-Bonding" und "Link Aggregation" stehen für die logische Zusammenfassung von 2 oder mehreren physikalischen Netzwerkkarten, um entweder ein Load-Balancing und/oder eine höhere Ausfallsicherheit zu erreichen...
Gehen wir einmal von dem Beispiel aus, daß man ein Server in seinem LAN hat, über den erstens extrem viel Datenverkehr läuft und der zweitens absolut nicht ausfallen darf (in diesem Beispiel geht es um eine defekte Netzwerkkarte oder einen defekten Port an dem entsprechenden Switch). Mittels "NIC-Bonding" kann man nun zwei physikalische Netzwerkkarten zu einer neuen, logischen zusammenfassen.
Zur Vorbereitung sollte unser Server zwei Netzwerkkarten eingebaut bekommen, die auch vom Linux-Kernel erkannt werden. In meinem Beispiel sollen die beiden Karten "eth1" und "eth2" zusammengefasst werden. Zurerst schauen wir aber mittels "mii-tool" (apt-get install mii-diag), ob die Links in Ordnung sind :
mii-tool eth0: negotiated 100baseTx-FD, link ok eth1: negotiated 100baseTx-FD, link ok eth2: negotiated 100baseTx-FD, link ok
Nun sollten wir die Module "bonding" (für das eigentliche
Zusammenfassen) und "mii" (für die Überwachung des Link-Status) laden
(und am besten auch gleich in die Datei /etc/modules eintragen, damit
sie beim nächsten Bootvorgang automatisch geladen werden) :
modprobe bonding modprobe mii
Bei einem "ifconfig -a" sollte man jetzt bereits ein neues Interface mit Namen "bond0" sehen :
mars:~# ifconfig -a bond0 Link encap:Ethernet HWaddr 00:00:00:00:00:00 BROADCAST 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)
...
Nun brauchen wir noch das Debian-Paket "ifenslave" :
apt-get install ifenslave
Als nächstes editieren wir mit dem Texteditor unserer Wahl die Datei /etc/modprobe.d/aliases und fügen ff. Zeilen hinzu (meine Netzwerkkarten brauchen den "via_rhine"-Treiber - das muss entsprechend angepasst werden) :
alias bond0 bonding alias eth1 via_rhine alias eth2 via_rhine options bonding mode=0 miimon=100
Ferner sollte ff. Zeile in die Datei /etc/modprobe.d/actions :
probeall bond0 eth1 eth2 bonding
Mit ff. Aufruf werden die Konfigurationsdateien mit den eben gemachten Verädnerungen aktualisiert :
update-modules
Nun editieren wir die Konfigurationsdatei für die Interfaces und IP-Adresse /etc/network/interfaces :
auto bond0 iface bond0 inet static address 192.168.0.100 netmask 255.255.255.0 hwaddress ether 00:40:33:E2:65:87 gateway 192.168.0.1 up ifenslave bond0 eth1 eth2 down ifenslave -d bond0 eth1 eth2
für die Karten eth1 und eth2 bitte keine(!) Konfiguration vornehmen!! |
Nun laden wir das "bonding"-Modul nochmal neu ...
rmmod bonding modprobe bonding
... und starten unser Netzwerk neu :
/etc/init.d/networking stop /etc/init.d/networking start
Sollten keine Fehler zu sehen sein, sollte man bei dem Aufruf von "ifconfig -a" nun bei den Interfaces "bond0", "eth1" und "eth2" überall die gleichen MAC- und IP-Adressen sehen.
Nun kann man spasseshalber einmal das Netzwerkkabel von "eth1" oder "eth2" ziehen und sich die Kernel-Meldungen anschauen, man sollte so etwas wie "eth1 has failed, eth2 becoming primary" usw. sehen.
Verbindet man die beiden Netzwerkkarten über verschiedene Switches oder VLANs, erhöht man entsprechend die Ausfallsicherheit. Bei unserem Beispiel werden die Netzwerkpakete im sogenannten "Round-Robin-Verfahren" verteilt, sprich, sie werden abwechselnd über die eine und die andere Netzwerkkarte versendet.
Neben unserem Beipiel (bonding mode=0 - siehe oben) gibt es noch andere Bonding-Verhaltensvarianten: alle verfügbanre Modi sind in der Kernel-Dokumentation "kernel/Documentation/net/bonding.txt" im Detail aufgeführt.