[[Vorlage(Kopie, Netzwerkkarten_bündeln)]] [[Vorlage(Getestet, )]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Hinweis Diese Anleitung funktioniert nur bei Ubuntu 16.04, da spätere Ubuntu-Versionen zur Netzwerkkonfiguration nicht mehr '''ifupdown''', sondern '''NetworkManager''' oder '''systemd-networkd''' verwenden. }}} {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] }}} [[Inhaltsverzeichnis(1)]] [[Bild(Wiki/Icons/Oxygen/network-wired.png, 48, align=left)]] [[Bild(Wiki/Icons/Oxygen/network-wired.png, 48, align=left)]] 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. = Installation = Folgendes Paket muss installiert [1] werden: {{{#!vorlage Paketinstallation ifenslave, universe }}} Gegebenenfalls werden noch die folgenden Programme benötigt: {{{#!vorlage Paketinstallation net-tools, universe, 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, universe, ein 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:]. }}} Optional ist das folgende Programm: {{{#!vorlage Paketinstallation bmon, Bandwith Monitor, ein Programm, das die Datenübertragungsraten pro Gerät in Echtzeit anzeigen kann. }}} = 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: {{{#!vorlage Befehl 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]: {{{#!vorlage Befehl find /lib/modules/`uname -r` -iname bonding* }}} Ausgabe: {{{ /lib/modules/2.6.20-16-server/kernel/drivers/net/bonding/bonding.ko }}} = Benutzung/Konfiguration = Zuerst werden alle Netzwerkkarten im zukünftigen Verbund deaktiviert: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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: {{{#!vorlage 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: {{{#!vorlage Befehl 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. Die zur Verfügung stehenden Modi sind im Folgenden aufgelistet. ||<-4 rowclass="titel" :> '''Bonding Modi''' || || '''Modus'''||'''Bezeichnung'''||'''Zweck'''||'''Beschreibung'''|| ||0||balance-rr||Lastverteilung & Ausfallsicherheit||Die genutzte Netzwerkschnittstelle wird im [wikipedia:Round_Robin_(Informatik):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 [wikipedia:Switch_(Computertechnik):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: {{{#!vorlage Paketinstallation moreutils, universe }}} 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 Die Schnittstellendefinition wird in '''/etc/network/interfaces''' ergänzt bzw. modifiziert: {{{ 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: {{{#!vorlage Befehl 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 {{{#!vorlage Befehl 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 {{{#!vorlage Befehl sudo ifconfig -a }}} liefert dann z.B. einen Eintrag wie: {{{ [...] eth?_rename [...] }}} Um dies zu vermeiden muss die Datei [:interfaces:/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 {[mark]MAC-ADRESSE[/mark]} ... }}} Bitte keine MAC von einer vorhandenen Karte benutzen, sondern selber eine setzen. = Links = * [ubuntu_doc:community/UbuntuBonding:Bonding] {en} - Ubuntu Community Documentation * [debian:Bonding:] {en} im Debian Wiki * [http://web.archive.org/web/20111105062131/http://www.5dollarwhitebox.org/wiki/index.php/Howtos_NIC_Bonding_Debian NIC Bonding Debian] {en} * [http://www.nwlab.net/art/teaming/nic-teaming.html Lastverteilung und Ausfallsicherheit mit mehreren Netzwerkkarten] {de} * [http://www.linux-magazin.de/heft_abo/ausgaben/2004/07/doppelt_reissfest Doppelt reissfest] {de} - Linux-Magazin, 07/2004 * [http://www.linuxhorizon.ro/bonding.html Erläuterung der verschieden Modi auf LINUX Horizon] {en} * [http://blog.brightbox.co.uk/posts/howto-do-ethernet-bonding-on-ubuntu-properly] {en} * [https://www.kernel.org/doc/Documentation/networking/bonding.txt bonding.txt (Kernel.org Documentation)] {en} * [http://blog.netways.de/2012/11/21/bonding-unter-ubuntu-12-04-1 Bonding unter Ubuntu 12.04.1] {de} # tag: Netzwerk, Server, bonding