Ich nutze Debian 4.0 "Etch" mit Kernel 2.6.18-6-686 auf einer schon etwas betagten Maxdata-Maschine. Da sich zwei 100MBit-Netzwerkkarten onboard befinden (e100) und wir auch mehrere Switches haben, war es an der Zeit das Bonding auszuprobieren, um die Ausfallsicherheit zu erhöhen.
Ein sehr gründliche und gut dokumentierte Überblick gibt die Datei
/usr/src/linux-source-2.6.18/Documentation/networking/bonding.txt
aus dem bz2-Archiv mit den Kernelsourcen (linux-source-2.6.18), aber für den Einstieg reichte ein Blick ins Debian-Wiki : http://wiki.debian.org/Bonding
Ich habe folgende Variante des Bondings realisiert bzw. folgende Parameter gesetzt:
- bonding mode=active-backup"fault-tolerance (active-backup or 1) Active-backup policy: Only one slave in the bond is active. A different slave becomes active if, and only if, the active slave fails. The bond's MAC address is externally visible on only one port (network adapter) to avoid confusing the switch."Damit bekomme ich genau das, was ich wollte: Ausfallsicherheit
- miimon=100"Specifies the MII link monitoring frequency in milliseconds. This determines how often the link state of each slave is inspected for link failures. A value of zero disables MII link monitoring. A value of 100 is a good starting point."
- downdelay=200"Specifies the time, in milliseconds, to wait before disabling a slave after a link failure has been detected. This option is only valid for the miimon link monitor. The downdelay value should be a multiple of the miimon value; if not, it will be rounded down to the nearest multiple. The default value is 0."
- updelay=200"Specifies the time, in milliseconds, to wait before enabling a slave after a link recovery has been detected. This option is only valid for the miimon link monitor. The updelay value should be a multiple of the miimon value; if not, it will be rounded down to the nearest multiple. The default value is 0."
- primary=eth0
"A string (eth0, eth2, etc) specifying which slave is the primary device. The specified device will always be the active slave while it is available. Only when the primary is off-line will alternate devices be used. This is useful when one slave is preferred over another, e.g., when one slave has higher throughput than another. The primary option is only valid for active-backup mode."
Damit wird diese Konfiguration gespeichert:
echo "alias bond0 bonding" > /etc/modprobe.d/bonding
echo "options bonding mode=active-backup miimon=100 downdelay=200 \
updelay=200 primary=eth0" >> /etc/modprobe.d/bonding
Update für Debian 6.0 "Squeeze":
(Dateinamen in /etc/modprobe.d/ müssen auf .conf enden)
echo "alias bond0 bonding" > /etc/modprobe.d/bonding.conf
echo "options bonding mode=active-backup miimon=100 downdelay=200 \
updelay=200 primary=eth0" >> /etc/modprobe.d/bonding.conf
Update für Debian 7.0 "Wheezy":
(bond0 wird zu netdev-bond0)
echo "alias netdev-bond0 bonding" > /etc/modprobe.d/bonding.conf
echo "options bonding mode=active-backup miimon=100 downdelay=200 \
updelay=200 primary=eth0" >> /etc/modprobe.d/bonding.conf
eth0 und eth1 wurden an Ports verschiedener Switches angeschlossen. Diese Ports befinden sich (natürlich) im selben VLAN.
Das Paket ifenslave (ifenslave-2.6) wurde installiert:
aptitude install ifenslave
Der Abschnitt für bond0 in /etc/network/interfaces sieht jetzt so aus:
auto bond0
iface bond0 inet static
address 10.49.1.222
netmask 255.255.0.0
network 10.49.0.0
broadcast 10.49.255.255
gateway 10.49.1.10
up /sbin/ifenslave bond0 eth0 eth1
down /sbin/ifenslave -d bond0 eth0 eth1
Mit den Kommandos
ifconfig eth0 down; ifup bond0
habe ich ich (über ssh im laufenden Betrieb!) die neue Netzwerkkonfiguration aktiviert.
Der aktuelle Status des Devices 'bond0' steht in /proc/net/bonding/bond0
cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.0.3 (March 23, 2006)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth0
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 200
Down Delay (ms): 200
Slave Interface: eth0
MII Status: up
Link Failure Count: 2
Permanent HW addr: 00:03:47:bd:64:ee
Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:03:47:bd:64:ef
Bisherige Erfahrungen:
- Die Umschaltung auf das andere Slave-Interface eth1 klappt bei "link down" auf eth0. Im syslog sieht das so aus:
e100: eth0: e100_watchdog: link down
bonding: bond0: link status down for idle interface eth0, disabling it in 200 ms.
bonding: bond0: link status definitely down for interface eth0, disabling it
bonding: bond0: making interface eth1 the new active one.
- Sobald auf dem primären Slave-Interface eth0 der Link wieder da ist, wird nach kurzer Wartezeit (updelay=200) wieder zurückgeschaltet (primary=eth0). Im syslog sieht das so aus:
e100: eth0: e100_watchdog: link up, 100Mbps, full-duplex
bonding: bond0: link status up for interface eth0, enabling it in 200 ms.
bonding: bond0: link status definitely up for interface eth0.
bonding: bond0: making interface eth0 the new active one.
Das Bonding im Modus 'active-backup' mit dem Parameter 'primary=' ist also revertiv.
- Nach der Umschaltung auf das sekundäre Slave-Interface eth1 ist das Interface bond0 weiterhin mit der MAC-Adresse von eth0 aktiv, so dass auch die Einträge in den ARP-Caches anderer Hosts nicht ungültig werden. Lediglich muss der andere Switch die für ihn neue MAC-Adresse am Port von eth1 lernen, was aber durch ein "Gratuitous ARP" unterstützt wird.
Die MAC-Adresse von eth1 wird nie benutzt.