Link Aggregation/Bonding
topic kurze Beschreibung
Beschreibung
Failover und Hochverfügbarkeit
- Netzwerkbindung auf einem Linux-Server konfigurieren
- In einer Windows-Umgebung wird Network Bonding als Network Teaming bezeichnet
- dies ist eine Funktion, die jeder Serverarchitektur hilft, Hochverfügbarkeit und Failover in Szenarien zu gewährleisten, in denen eines der wichtigsten Ethernet-Kabel eine Fehlfunktion hat oder falsch konfiguriert ist.
- Best Practice
- wenn Sie einen Server für Produktionszwecke einrichten.
- Obwohl diese Funktion in einer Linux-Umgebungskonfiguration durchgeführt werden kann, müssen Sie dies jedoch zuerst mit Ihrem Netzwerkadministrator klären, um sicherzustellen, dass die mit Ihrem Server verbundenen Switches Unterstützung für die Netzwerkbindung bieten.
Verfügbaren Modi
Es gibt mehrere Bindungsmodi, die Sie in Ihrer Serverumgebung implementieren können.
Option | Beschreibung |
---|---|
Balance-rr | Dieser Modus bietet Lastausgleich und Fehlertoleranz (Failover) über die Round-Robin-Richtlinie. Bedeutet, dass es Pakete in sequentieller Reihenfolge vom ersten verfügbaren Slave bis zum letzten sendet. |
Active-Backup | Dieser Modus bietet Fehlertoleranzfunktionen über die Active-Backup-Richtlinie. Das bedeutet, dass nach dem Auflegen des Bonding-Ethernet nur noch 1 der Ethernet-Slaves aktiv ist. Der andere Ethernet-Slave wird nur dann aktiv, wenn und nur wenn der aktuell aktive Slave nicht aktiv ist. Wenn Sie diesen Modus wählen, werden Sie feststellen, dass die Bonding-MAC-Adresse von außen auf nur einem Netzwerkadapter sichtbar ist. Dies dient dazu, eine Verwechslung des Schalters zu vermeiden. |
Balance-xor | Dieser Modus bietet Lastausgleich und Fehlertoleranz. Es überträgt basierend auf der ausgewählten Sende-Hash-Richtlinie. Alternative Übertragungsrichtlinien können über die Option xmit_hash_policy ausgewählt werden. |
Broadcast | Dieser Modus bietet nur Fehlertoleranz. Es überträgt alles auf allen Slave-Ethernet-Schnittstellen. |
802.3ad | Dieser Modus bietet Lastausgleich und Fehlertoleranz. Es wird eine Aggregationsgruppe erstellt, die die gleichen Geschwindigkeits- und Duplexeinstellungen hat. Es nutzt alle Slave-Ethernet-Schnittstellen im aktiven Aggregator und basiert auf der 802.3ad-Spezifikation. Um diesen Modus zu implementieren, muss das Ethtool die Basistreiber unterstützen, um die Geschwindigkeit und den Duplexmodus jedes Slaves abzurufen. Der Switch muss auch die dynamische Link-Aggregation unterstützen. Normalerweise erfordert dies einen Eingriff des Network Engineers für eine detaillierte Konfiguration. |
Balance-TLB | Dieser Modus bietet Lastausgleichsmöglichkeiten, da der Name TLB für den Sende-Lastausgleich steht. Für diesen Modus, wenn die Konfiguration tlb_dynamic_lb = 1 ist, wird der ausgehende Verkehr entsprechend der aktuellen Last auf jeden Slave verteilt. Wenn die Konfiguration tlb_dynamic_lb = 0 ist, dann ist der Lastausgleich deaktiviert, jedoch wird die Last nur über die Hastverteilung verteilt. Für diesen Modus muss das Ethtool die Basistreiber unterstützen, um die Geschwindigkeit jedes Slaves zu ermitteln. |
Balance-ALB | Dieser Modus bietet Lastausgleichsmöglichkeiten, da der Name TLB für adaptiven Lastausgleich steht. Ähnlich wie balance-tlb, nur dass sowohl Sende- als auch Empfangsverkehr verbunden sind. Es erhält einen Lastenausgleich, indem es die ARP-Verhandlung erreicht. Der Bonding-Treiber fängt die vom lokalen System gesendeten ARP-Antworten auf ihrem Weg nach draußen ab und überschreibt die Quell-Hardwareadresse mit der eindeutigen Hardwareadresse eines der Slaves in der Bindung. Für diesen Modus muss das Ethtool die Basistreiber unterstützen, um die Geschwindigkeit jedes Slaves wiederherzustellen. |
Installation
# apt install ifenslave'
Gegebenenfalls werden noch die folgenden Programme benötigt:
- net-tools
- Beinhaltet das Programm mii-tool, das unabhängig vom Medium den Status der Schnittstelle sowie die Geschwindigkeits- und Duplex-Einstellungen abfragen bzw. einstellen kann.
- Mii-Tool wird für den Modus 4 (802.3ad) und das Abfragen der verfügbaren Schnittstellen benötigt.
- ethtool
- Programm zum Setzen der Geschwindigkeits- und Duplex-Einstellungen bei Ethernet-Schnittstellen.
- Ethtool wird für die Modi 4 (802.3ad), 5 (balance-tlb) und 6 (balance-alb) benötigt.
- Siehe auch ethtool
# apt install net-tools ethtool
- bmon
- Optional ist das folgende Programm
- Bandwith Monitor, ein Programm, das die Datenübertragungsraten pro Gerät in Echtzeit anzeigen kann
# 'apt install bmon
Anwendungen
Fehlerbehebung
Syntax
Optionen
Parameter
Umgebungsvariablen
Exit-Status
Konfiguration
- Bevor wir mit der Konfiguration beginnen, müssen wir zunächst sicherstellen, dass wir mindestens 2 Ethernet-Schnittstellen in unserem Server konfiguriert haben.
- Um dies zu überprüfen, gehen Sie in den Netzwerk-Konfigurationsordner und listen Sie die verfügbaren Ethernet-Schnittstellen auf.
cd /etc/sysconfig/network-scripts/ ls *ifcfg*eth*
Das Ergebnis ist:
ifcfg-eth0 ifcfg-eth1
Beachten Sie, dass wir derzeit 2 Ethernet-Schnittstellen haben, die auf unserem Server eingerichtet sind, nämlich ETH0 und ETH1.
Lassen Sie uns nun eine Bonding-Schnittstelle namens BOND0 konfigurieren.
- Diese Schnittstelle wird eine virtuelle Ethernet-Schnittstelle sein, die die physikalische Ethernet-Schnittstelle von ETH0 und ETH1 enthält.
vi ifcfg-bond0 DEVICE=bond0 ONBOOT=yes MASTER=yes IPADDR=172.20.43.110 NETMASK=255.255.255.0 GATEWAY=172.20.43.1 BONDING_OPTS="mode=1 miimon=100" TYPE=Ethernet
ls *ifcfg*bon*
Ergebnis
ifcfg-bond0
Das ist alles. Bitte beachten Sie, dass ich innerhalb der BOND0-Schnittstelle eine IP-Adresse angegeben habe.
- Diese IP-Adresse ist die einzige IP-Adresse, die mit unserem Server verbunden ist.
- Um damit fortzufahren, müssen wir die physikalische Ethernet-Schnittstelle in Bezug auf die BOND0-Schnittstelle modifizieren.
vi ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=no MASTER=bond0 SLAVE=yes vi ifcfg-eth1 DEVICE=eth1 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=no MASTER=bond0 SLAVE=yes
Erledigt
- Wir haben die Modifikation der Schnittstelle ETH0 und ETH1 vorgenommen.
- Beachten Sie, dass wir die IP-Adresse in beiden Interfaces entfernt und MASTER = bond0 angehängt haben.
- Dies ist notwendig, um zu bestätigen, dass es sich bei beiden Schnittstellen um virtuelle Schnittstellen handelt, die für die Ethernet-BOND0-Schnittstelle bestimmt sind.
- Um mit der Konfiguration fortzufahren
Erstellen wir eine bonding-Konfigurationsdatei namens bonding.conf unter /etc/modprobe.d
vi /etc/modprobe.d/bonding.conf alias bond0 bonding options bond0 mode=1 miimon=100 modprobe bonding
- Basierend auf der obigen Konfiguration haben wir ein Bindemodul über die Schnittstelle BOND0 konfiguriert
- Wir haben die Bonding-Konfiguration auch dem Verwendungsmodus = 1 zugewiesen, der eine aktive Backup-Richtlinie ist.
- Die Option miimon = 100 stellt die Überwachungsfrequenz für unseren Bonding-Server dar, um den Schnittstellenstatus in Millisekunden zu überwachen.
- Wie oben beschrieben, bietet dieser Modus Funktionen zur Fehlertoleranz in der Konfiguration des Server-Netzwerks.
Da alles eingerichtet ist, starten wir den Netzwerkdienst neu, um die neue Konfiguration zu laden.
service network restart Shutting down interface eth0: [ OK ] Shutting down interface eth1: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface bond0: [ OK ]
- Ausgezeichnet, jetzt haben wir die neue Konfiguration geladen, die wir oben gemacht haben.
- Sie werden feststellen, dass die neue Schnittstelle namens BOND0 in der Netzwerkliste angezeigt wird.
- Sie werden auch feststellen, dass der Schnittstelle ETH0 und ETH1 keine IP-Adresse zugeordnet ist, sondern nur die BOND0-Schnittstelle die IP-Adresse anzeigt.
# ifconfig bond0 Link encap:Ethernet HWaddr 08:00:27:61:E4:88 inet addr:172.20.43.110 Bcast:172.20.43.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe61:e488/64 Scope:Link UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1 RX packets:1723 errors:0 dropped:0 overruns:0 frame:0 TX packets:1110 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:147913 (144.4 KiB) TX bytes:108429 (105.8 KiB) eth0 Link encap:Ethernet HWaddr 08:00:27:61:E4:88 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:1092 errors:0 dropped:0 overruns:0 frame:0 TX packets:1083 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:103486 (101.0 KiB) TX bytes:105439 (102.9 KiB) eth1 Link encap:Ethernet HWaddr 08:00:27:61:E4:88 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:632 errors:0 dropped:0 overruns:0 frame:0 TX packets:28 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:44487 (43.4 KiB) TX bytes:3288 (3.2 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:208 errors:0 dropped:0 overruns:0 frame:0 TX packets:208 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:18080 (17.6 KiB) TX bytes:18080 (17.6 KiB)
- Sie können den Bindungsstatus auch über diesen Befehl überprüfen
cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009) Bonding Mode: fault-tolerance (active-backup) Primary Slave: None Currently Active Slave: eth0 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: eth0 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 08:00:27:61:e4:88 Slave queue ID: 0 Slave Interface: eth1 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 08:00:27:c8:46:40 Slave queue ID: 0
Beachten Sie dazu, dass wir die Schnittstellen ETH0 und ETH1 erfolgreich in eine Bonding-Konfiguration im Active-Backup-Modus umgewandelt haben. Es wurde auch angegeben, dass der Server die Schnittstelle ETH0 verwendet, ETH1 wird als Backup-Schnittstelle dienen.
Test
Jetzt, da alles wie erwartet konfiguriert ist. Lassen Sie uns einen einfachen Test durchführen, um sicherzustellen, dass die von uns vorgenommene Konfiguration korrekt ist. Für diesen Test melden wir uns bei einem neuen Server (oder Linux-Desktop) an und beginnen mit dem Pingen unseres Bonding-Servers, um zu sehen, ob während des Tests eine intermittierende Verbindung besteht.
login as: root root@172.20.43.120's password: Last login: Wed Sep 14 12:50:15 2016 from 172.20.43.80 ping 172.20.43.110 PING 172.20.43.110 (172.20.43.110) 56(84) bytes of data. 64 bytes from 172.20.43.110: icmp_seq=1 ttl=64 time=0.408 ms 64 bytes from 172.20.43.110: icmp_seq=2 ttl=64 time=0.424 ms 64 bytes from 172.20.43.110: icmp_seq=3 ttl=64 time=0.415 ms 64 bytes from 172.20.43.110: icmp_seq=4 ttl=64 time=0.427 ms
In dieser Zeit gehen wir zurück zu unserem Bonding-Server und schalten die Ethernet-Schnittstelle ETH0 aus.
Zuerst führen Sie ifconfig eth0 aus:
# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 08:00:27:61:E4:88 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:1092 errors:0 dropped:0 overruns:0 frame:0 TX packets:1083 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:103486 (201.0 KiB) TX bytes:105439 (122.9 KiB) ifdown eth0
Nun haben wir die Dienste für die Netzwerkschnittstelle ETH0 abgeschaltet.
- Bindungsstatus überprüfen
cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009) Bonding Mode: fault-tolerance (active-backup) Primary Slave: None Currently Active Slave: eth1 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: eth1 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 08:00:27:c8:46:40 Slave queue ID: 0
Sie werden feststellen, dass die ETH0-Schnittstelle nun nicht mehr im Bindungsstatus existiert.
Während dieser Zeit gehen wir zurück zum vorherigen Testserver und überprüfen den kontinuierlichen Ping zu unserem Bonding-Server.
64 bytes from 172.20.43.110: icmp_seq=22 ttl=64 time=0.408 ms 64 bytes from 172.20.43.110: icmp_seq=23 ttl=64 time=0.402 ms 64 bytes from 172.20.43.110: icmp_seq=24 ttl=64 time=0.437 ms 64 bytes from 172.20.43.110: icmp_seq=25 ttl=64 time=0.504 ms 64 bytes from 172.20.43.110: icmp_seq=26 ttl=64 time=0.401 ms 64 bytes from 172.20.43.110: icmp_seq=27 ttl=64 time=0.454 ms 64 bytes from 172.20.43.110: icmp_seq=28 ttl=64 time=0.432 ms 64 bytes from 172.20.43.110: icmp_seq=29 ttl=64 time=0.434 ms 64 bytes from 172.20.43.110: icmp_seq=30 ttl=64 time=0.411 ms 64 bytes from 172.20.43.110: icmp_seq=31 ttl=64 time=0.554 ms 64 bytes from 172.20.43.110: icmp_seq=32 ttl=64 time=0.452 ms 64 bytes from 172.20.43.110: icmp_seq=33 ttl=64 time=0.408 ms 64 bytes from 172.20.43.110: icmp_seq=34 ttl=64 time=0.491 ms
Obwohl die Schnittstelle heruntergefahren wurde, ist haben, immer noch in der Lage sind, unseren Bonding-Server zu pingen und darauf zuzugreifen.
- Weiteren Test
Schalten Sie die ETH0-Schnittstelle wieder ein und die ETH1-Schnittstelle aus.
ifup eth0 cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009) Bonding Mode: fault-tolerance (active-backup) Primary Slave: None Currently Active Slave: eth1 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: eth1 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 08:00:27:c8:46:40 Slave queue ID: 0 Slave Interface: eth0 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 08:00:27:61:e4:88 Slave queue ID: 0
Da die ETH0-Schnittstelle bereits hochgefahren war, schalten wir die ETH1-Schnittstelle aus.
ifdown eth1 cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009) Bonding Mode: fault-tolerance (active-backup) Primary Slave: None Currently Active Slave: eth0 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: eth0 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 08:00:27:61:e4:88 Slave queue ID: 0
Nun gehen wir zurück zum Testserver und überprüfen, was auf dem kontinuierlichen Ping zu unserem Bonding-Server passiert.
64 bytes from 172.20.43.110: icmp_seq=84 ttl=64 time=0.437 ms 64 bytes from 172.20.43.110: icmp_seq=85 ttl=64 time=0.504 ms 64 bytes from 172.20.43.110: icmp_seq=86 ttl=64 time=0.401 ms 64 bytes from 172.20.43.110: icmp_seq=87 ttl=64 time=0.454 ms 64 bytes from 172.20.43.110: icmp_seq=88 ttl=64 time=0.432 ms 64 bytes from 172.20.43.110: icmp_seq=89 ttl=64 time=0.434 ms 64 bytes from 172.20.43.110: icmp_seq=90 ttl=64 time=0.411 ms 64 bytes from 172.20.43.110: icmp_seq=91 ttl=64 time=0.420 ms 64 bytes from 172.20.43.110: icmp_seq=92 ttl=64 time=0.487 ms 64 bytes from 172.20.43.110: icmp_seq=93 ttl=64 time=0.551 ms 64 bytes from 172.20.43.110: icmp_seq=94 ttl=64 time=0.523 ms 64 bytes from 172.20.43.110: icmp_seq=95 ttl=64 time=0.479 ms
Wir haben erfolgreich konfiguriert und bewiesen, dass unser Bonding-Server es schafft, das Disaster-Recovery-Szenario bei einem Netzwerkausfall zu erfüllen.
Sicherheit
Dokumentation
RFC
Man-Pages
Info-Pages
Siehe auch
Links
Projekt-Homepage
Weblinks
- http://wiki.debian.org/Bonding
- Bonding Modi auf www.dodgenet.de
- Ausführliche Anleitung zum Bonding auf www.linuxfoundation.org
- https://www.thomas-krenn.com/de/wiki/NIC_Bonding_unter_Debian
Einzelnachweise
Testfragen
Testfrage 1
Testfrage 2
Testfrage 3
Testfrage 4
Testfrage 5
TMP
Configure network bonding
- by editing the /etc/network/interfaces
- The following example shows my previous bonding mode 1 configuration within the /etc/network/interfaces file, I will leave interfaces with their names for easier understanding:
auto enp2s0iface enp2s0 inet manualbond-master bond0bond-primary enp2s0 wlp3s0 auto wlp3s0iface wlp3s0 inet manualbond-master bond0bond-primary enp2s0 wlp3s0wpa-ssid 'LinuxHint'wpa-bssid '14:CF:E2:2A:EF:00'wpa-psk '972537288765'auto bond0iface bond0 inet dhcpbond-slaves nonebond-mode active-backupbond-miimon 100bond-downdelay 200bond-updelay 200
Datei:Bild17.pngA network bonding configuration with static IP instead of DHCP would have the last block like:
iface bond0 inet staticaddress 192.168.0.54netmask 255.255.255.0network 192.168.0.0gateway 192.168.0.1
Datei:Bild18.pngYou can run the following command to make sure bonding is working properly:# cat /proc/net/bonding/bond0
Source of examples: How to do Linux Network Bonding
Netzwerkkarten bündeln
Manchmal ist es notwendig, zwei Netzwerkkarten zu bündeln, z.B. für eine höhere Ausfallsicherheit oder um einfach den Durchsatz zu erhöhen. Man spricht auch vom NIC-Teaming oder Bonding, wenn man zwei Netzwerkschnittstellen zu einer virtuellen Einheit zusammenfasst. So wird erreicht, dass das System beide Karten als ein Gerät anspricht. Das bedeutet, dass beide Karten dieselbe Hardware-(MAC-)Adresse haben.
Die Bündelung der Netzwerkkarten wird durch das Dienstprogramm ifenslave bewerkstelligt, das dem Kernel ermöglicht, nur ein Gerät zu sehen und zu verwenden, während es die Datenpakete tatsächlich über die zwei Karten sendet. Hiermit kann sowohl Ausfallsicherheit als auch die Nutzung einer größeren Bandbreite erreicht werden.
Vorbereitung
- Vor dem Versuch, zwei Netzwerkkarten zu bündeln, sollte die Integrität und Funktionalität jeder Karte geprüft werden.
- Das Verwenden des Mii-Tools sollte etwa Folgendes zeigen:
sudo mii-tool
- Ausgabe
eth0: negotiated 100baseTx-FD flow-control, link ok eth1: negotiated 100baseTx-FD flow-control, link ok
Damit die Bündelung der Netzwerkkarten funktioniert, muss der Kernel dies unterstützen. Dies lässt sich wie folgt überprüfen [2]:
$ find /lib/modules/`uname -r` -iname bonding* /lib/modules/2.6.20-16-server/kernel/drivers/net/bonding/bonding.ko
Benutzung/Konfiguration
Zuerst werden alle Netzwerkkarten im zukünftigen Verbund deaktiviert:
sudo ifdown eth0 sudo ifdown eth1 sudo ifdown eth...
Dann wird die Konfiguration erstellt. Die /etc/network/interfaces kann wie oben beschrieben konfiguriert werden. Jedoch müssen einige Einträge enthalten sein und geändert werden. Dies wurde ab Ubuntu 8.04 deutlich vereinfacht, da ab nun die gesamte bonding-Konfiguration in dieser Datei abgelegt wird (aber nicht muss).
Einfach und schnell
Da in den Ubuntu-Versionen neuer als 8.04 alle Bonding-Optionen in /etc/network/interfaces gemacht werden kann, genügt es, lediglich ifenslave-2.6 zu installieren. Das betrifft zumindest die Konfiguration auf Linux-Seite. Manche bonding-Modi benötigen zusätzlich noch eine Konfiguration des Switches.
auto bond0 iface bond0 inet static address 10.0.0.10 netmask 255.255.255.0 network 10.0.0.0 broadcast 10.0.0.255 gateway 10.0.0.1 dns-nameservers 10.0.0.1 bond-slaves eth0 eth1 bond-mode 0 bond-miimon 100 bond-updelay 200 bond-downdelay 200
- Erklärungen
- bond-slaves: Welche Schnittstellen diesem Bond zugehörig sind, "all", falls alle.
- bond-mode: 0 bis 6 oder Names des Modus, in dem der bonding-Treiber arbeiten soll.
- bond-miimon: Das bonding-Modul überprüft alle 100ms den Link-Status aller gebündelten Schnittstellen.
- bond-updelay: Wenn eine Schnittstelle als (wieder) aktiv erkannt wird, werden 200ms abgewartet, ehe der bonding-Treiber das interface wieder in den Verbund integriert, ansonsten sofort.
- bond-downdelay: Gibt es einen Übertragungsfehler oder Aussetzer, so betrachtet das bonding-Modul die Schnittstelle erst nach 200ms als verloren und entfernt diese aus dem bond, ansonsten sofort.
Die Konfiguration für alle anderen Interfaces bis auf das loopback-Interface können entfernt bzw. deaktiviert werden.
- Wer ungeduldig ist, kann nun mit folgenden Befehlen den Treiber laden und die Netzwerke neu starten:
modprobe bonding /etc/init.d/networking stop /etc/init.d/networking start
Sicherer ist es, das System neu zu starten. Es sind keine weiteren Einträge in /etc/modules oder anderswo nötig, der bonding-Treiber wird automatisch nach einem Neustart geladen.
Ausführlicher, teilweise für ältere Versionen
Folgender Eintrag muss hinzugefügt werden
auto bond0 iface bond0 inet static address 10.0.0.10 netmask 255.255.255.0 network 10.0.0.0 broadcast 10.0.0.255 gateway 10.0.0.1 dns-nameservers 10.0.0.2 dns-search example.com slaves eth0 eth1
- Anmerkungen
- Hier wird eine statische Konfiguration verwendet, soll die Maschine ihre IP-Adresse mittels DHCP beziehen, wird iface bond0 inet static durch iface bond0 inet dhcp ersetzt, die eingerückten Zeilen entfallen dann. Die IP-Adress-Einstellungen müssen an das eigene Netzwerk angepasst werden.
- Hier werden die Schnittstellen eth0 und eth1 für den Verbund verwendet. Sollen weitere Schnittstellen eingebunden werden, so werden diese hinten angefügt. Alternativ kann auch slaves all geschrieben werden, wenn alle aktiven Schnittstellen in den Verbund aufgenommen werden sollen.
Des Weiteren sollten für die darin enthaltenen einzelnen Schnittstellen die Funktion "auto" durch "allow" ersetzt werden, damit diese nicht zusätzlich bei dem Systemstart mitgestartet werden.
- Im Skript für den Systemstart ist die Funktion "ifup -a" enthalten und die startet alle Netzwerkschnittstellen, die in der Konfiguration mit "auto" vermerkt sind.
- Ansonsten startet Linux jede einzelne Schnittstelle und zusätzlich den Verbund.
- Das ist falsch, denn die einzelnen Schnittstellen sollen durch den Verbund aktiviert werden.
Deshalb sollte man für die im Verbund enthaltenen Schnittstellen den Eintrag wie folgt ändern:
allow eth1 iface eth1 inet dhcp
- Dabei ist es egal, ob man "dhcp" setzt oder was anderes, da diesen Schnittstellen keine eigene IP-Adresse mehr zugeteilt wird.
- Das ist richtig, da die Schnittstellen nur noch durch EINE IP-Adresse angesprochen werden sollen. Dies muss und sollte die IP-Adresse des Verbundes sein.
Danach sollte nach JEDEM Systemstart der Befehl "ifconfig" für bond0 folgenden Hinweis enthalten:
[...] UP BROADCAST RUNNING MASTER MULTICAST [...]
und für die darin enthaltenen Schnittstellen
[...] UP BROADCAST RUNNING SLAVE MULTICAST [...]
Die Konfiguration des Bonding-Treibers muss angegeben werden, hierfür wird in /etc/modprobe.d mit Superuser-Rechten eine neue Datei bonding.conf erstellt und folgendes eingetragen:
alias bond0 bonding options bonding mode=1 miimon=100
- Anmerkung
- Hier wird Bonding-Mode 1 (active-backup) verwendet, das Mii-Tool soll alle 100 Millisekunden den Link-Status überprüfen.
Das Laden des Moduls erfolgt mit dem Befehl:
sudo modprobe bonding
Damit das auch beim nächsten Neustart noch der Fall ist, sollte das bonding-Modul noch in die /etc/modules eingetragen werden [3]:
bonding
Nun wird das Modul automatisch beim Systemstart geladen.
Der neue Verbund wird mit folgendem Befehl gestartet:
sudo ifup bond0
Bonding Modi
Bei der Konfiguration muss ein Bonding-Modus (bond-mode) angegeben werden, der den Zweck und die Art der Bündelung der Netzwerkschnittstellen angibt.
Modus | Bezeichnung | Zweck | Beschreibung |
---|---|---|---|
0 | balance-rr | Lastverteilung & Ausfallsicherheit | Die genutzte Netzwerkschnittstelle wird im Round-Robin-Verfahren festgelegt, das heißt die verfügbaren Schnittstellen werden in Senderichtung wechselweise genutzt. In Empfangsrichtung kann max. die Geschwindigkeit einer einzelnen Schnittstelle erreicht werden - je mehr Teilnehmer, umso mehr Upload-Gesamtbandbreite, denn diese werden auf die übrigen freien Schnittstellen aufgeteilt. |
1 | active-backup | Ausfallsicherheit | Nur eine Schnittstelle ist aktiv, im Fehlerfalle wird eine der anderen im Verbund genutzt. die Netzwerkkarten können über verschiedene Switches angebunden werden. |
2 | balance-xor | Lastverteilung & Ausfallsicherheit | Es wird für jede Gegenstelle im Netzwerk eine zu nutzende Netzwerkschnittstelle zugewiesen, die Zuordnung geschieht über den Modulo der Division zwischen der Formel (Quell-MAC-Adresse XOR Ziel-MAC-Adresse) und der Anzahl der Slave-Schnittstellen. |
3 | broadcast | Ausfallsicherheit | Daten werden auf allen Netzwerkschnittstellen gesendet. Die Nutzung mehrerer Switches ist möglich. |
4 | 802.3ad | Lastverteilung & Ausfallsicherheit | 802.3ad ist ein Standard der IEEE, der die Bündelung mehrerer Schnittstellen mit gleichen Übertragungseinstellungen (Geschwindigkeit und Duplex-Einstellungen) erlaubt, um eine höhere Bandbreite zu erhalten. Es kann nur ein Switch verwendet werden, dieser muss 802.3ad unterstützen. ethtool oder mii-tool wird benötigt. |
5 | balance-tlb | Lastverteilung | Es wird für jede Gegenstelle im Netzwerk eine zu nutzende Netzwerkschnittstelle zugewiesen. Das Verfahren hierzu ist jedoch komplexer und effizienter als bei balance-xor. Das Programm ethtool wird benötigt. |
6 | balance-alb | Lastverteilung | Erweitertes balance-tlb, zusätzlich zur MAC-basierten Zuordnung der Schnittstellen für ausgehende Verbindungen werden eingehende Verbindungen auf die Schnittstellen verteilt. Das Programm ethtool wird benötigt. |
Eine sichere Variante mit zwei Bonding Interfaces
- Bei Unsicherheiten oder scheinbaren Zufälligkeiten der Funktionalität der Konfiguration kann die folgende Variante gewählt werden.
- Diese geht davon aus, dass ein Interface per DHCP, das andere direkt adressiert wird.
Voraussetzung ist das folgende Paket:
# apt-get install moreutils
- Die Bonding-Parameter werden in /etc/modprobe.d/bonding.conf gesetzt
alias bond0 bonding alias bond1 bonding options bonding max_bonds=2 mode=1 miimon=100 use_carrier=1
Das Bonding Modul muss geladen werden. Dazu wird /etc/modules ergänzt um die Zeile:
bonding
Danach wird die Netzwerkkonfiguration erstellt.
Diese enthält folgende Nebenbedingungen:
- Über eth0 wird eine DHCP-Adresse vermittelt
- Die Interfaces eth0 und eth1 bilden bond0
- Mittels eth2 und eth3 wird statisch eine Adresse an bond1 gebunden
Schnittstellendefinition
- /etc/network/interfaces
auto lo iface lo inet loopback
auto eth0 iface eth0 inet dhcp iface bond0 inet manual iface eth1 inet manual
auto bond1 iface bond1 inet static pre-up /sbin/ifconfig eth2 up pre-up /sbin/ifconfig eth3 up up /sbin/ifenslave bond1 eth2 up /sbin/ifenslave bond1 eth3 post-down /sbin/modprobe -r bond1 eth2 eth3 address … netmask … network … broadcast … gateway … dns-nameservers … dns-search …
Nun muss noch bond0 entsprechend konfiguriert werden. Das geschieht in /etc/rc.local
set -x /sbin/ifconfig eth1 $(/usr/bin/ifdata -pa eth0) \ netmask $(/usr/bin/ifdata -pn eth0) up && \ /sbin/ifconfig bond0 $(/usr/bin/ifdata -pa eth0) \ netmask $(/usr/bin/ifdata -pn eth0) && \ /sbin/ifenslave bond0 eth0 eth1 && \ /sbin/ifenslave -c bond0 eth1 set +x
Variante, die auch funktionierte
- Gewisse Unsicherheiten ergeben sich aus der im Paket linux-doc beschriebenen Dokumentation /usr/share/doc/linux-doc/networking/bonding.txt.gz.
- Folgende Variante im obrigen Beispiel von bond1 funktionierte:
- /etc/network/interfaces
auto bond1 iface bond1 inet static bond-slaves none bond-mode active-backup bond-miimon 100 address … ... auto eth2 iface eth2 inet manual bond-master bond1 bond-primary eth2 eth3 auto eth3 iface eth3 inet manual bond-master bond1 bond-primary eth2 eth3
Nur zufällig funktionierende Varianten
Bei den folgenden Variante sind die in /etc/rc.local eingetragenen Modifikationen still zu legen.
- /etc/network/interfaces
auto bond0 iface bond0 inet dhcp bond-slaves none bond-mode active-backup bond-miimon 100 auto eth0 iface eth0 inet dhcp bond-master bond0 bond-primary eth0 eth1 auto eth1 iface eth1 inet manual bond-master bond0 bond-primary eth0 eth1
Diese Variante funktionierte nicht immer. Für die MAC-Adresse von eth0 wird dabei eine IP Adresse bereit gestellt. Die Mac-Adresse von eth1 wird nicht mit einer IP-Adresse versorgt.
auto bond0 iface bond0 inet dhcp bond-slaves none bond-mode active-backup bond-miimon 100 auto eth0 iface eth0 inet manual bond-master bond0 bond-primary eth0 eth1 auto eth1 iface eth1 inet manual bond-master bond0 bond-primary eth0 eth1
Die letzte Variante, die genau der Beschreibung aus linux-doc entspricht, funktionierte leider gar nicht bei mir.
Hardwareunabhängiges Image
- Aus Gründen der Hochverfügbarkeit kann es nötig sein, ein Image zu bauen, welches auch auf anderen, baugleichen Rechnern läuft.
- Dabei kann dieses Image sowohl ein NFS-Filesystem als auch ein Fibre-Channel-Filesystem sein. Wichtig ist, dass dieses Image bei Hardwareausfall auf einem anderen, baugleichen Rechner läuft.
- Damit dies gewährleistet ist muss die MAC-Adresse aus der Konfiguration der Netzwerkkarte entfernt werden und durch Hardwaremerkmale ersetzt werden. Dazu müssen die entsprechenden Merkmale ermittelt werden.
Dies Kann mit folgendem Befehl beispielsweise erfolgen:
for I in {0,1,2,3,4,5,6,7} do echo eth$I udevadm info -a -p /sys/class/net/eth$I | grep KERNELS udevadm info -a -p /sys/class/net/eth$I | grep 'ATTR{dev_id}' udevadm info -a -p /sys/class/net/eth$I | grep 'ATTR{type}' done
Wichtig ist dabei, dass Merkmale gewählt werden, die nur auf diese Hardwareelemente (Netzwerkanschlüsse) zutreffen.
Im obrigen Beispiel kommt es zu folgender Ausgabe:
eth0 KERNELS=="0000:04:00.0" KERNELS=="0000:00:02.2" KERNELS=="pci0000:00" ATTR{dev_id}=="0x0" ATTR{type}=="1" eth1 KERNELS=="0000:04:00.1" KERNELS=="0000:00:02.2" KERNELS=="pci0000:00" ATTR{dev_id}=="0x0" ATTR{type}=="1" …
Daraus sollte dann die Definition von /etc/udev/rules.d/70-persistent-net.rules überschrieben werden.
# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:02.2/0000:04:00.0 (igb) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="0000:04:00.0", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:02.2/0000:04:00.1 (igb) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="0000:04:00.1", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
...
Mittels
sudo service udev restart
wird die Änderung getestet bzw. wirksam.
Fehlerbehebung
Problembeschreibung
Wenn man mehrere Netzwerkkarten des gleichen Typs einsetzt, kann es passieren, dass die Netzwerkkarten neu benannt werden. Ein
# ifconfig -a
liefert dann z.B. einen Eintrag wie:
[...] eth?_rename [...]
Um dies zu vermeiden, muss die Datei /etc/network/interfaces editiert werden.
Im Abschnitt bonding muss die Angabe für eine MAC eingefügt werden:
auto bond0 iface bond0 inet static ... hwaddress ether {MAC-ADRESSE} ...
Bitte keine MAC von einer vorhandenen Karte benutzen, sondern selber eine setzen.
TMP
Bonding Arten
- mode=0 (balance-rr)
- mode=1 (active-backup)
- mode=2 (balance-xor)
- mode=3 (broadcast)
- mode=4 (802.3ad) (siehe dazu Link Aggregation und LACP Grundlagen)
- mode=5 (balance-tlb)
- mode=6 (balance-alb)
Konfiguration Debian 5.0 Lenny und neuer
In diesem Beispiel zeigen wir eine Konfiguration mit mode 4 (802.3ad).
Für die Link Aggregation nutzen wir:
- eth0 und
- eth1
/etc/network/interfaces
enthält die folgende Konfiguration:
auto lo bond0 iface bond0 inet static address 10.10.10.174 netmask 255.255.255.0 network 10.10.10.0 gateway 10.10.10.1 slaves eth0 eth1 bond_mode 802.3ad
Als Gegenstelle verwenden wir den Switch eines Intel Modular Servers. Eth0 und eth1 des Servers sind mit den LAN-Ports 1 und 2 am Modular Server Switch verbunden. Diese beide LAN-Ports sind für die Link Aggregation konfiguriert. Details dazu siehe Link Aggregation beim Modular Server und Link Aggregation Lastverteilung Test Modular Server Switch.