Home   Profil   Fun
#79 Linux  22.07.2009

Bündelung von Netzwerkkarten


Für höheren Durchsatz oder Ausfallsicherheit lassen sich mehrere Netzwerkkarten zu einem virtuellen Netzwerkinterface zusammenschließen. Verschiedene Algorithmen stehen zur Verfügung, um den Datenverkehr auf beide Leitungen zu verteilen. Bei manchen sind bestimmte Vorraussetzungen auf dem Switch notwendig bei anderen nicht. Ich verwende hier im Beispiel "balance-rr", wobei die Last per round-robin auf beide Leitungen verteilt wird.
Das schöne ist, man kann einfach beliebig Netzkabel ziehen und wieder einstecken. Solange immer mindestens ein Netzwerkkabel angeschlossen ist, gibt es keine sichtbare Unterbrechung des Datenstroms. Man hat also Redundanz und höheren Durchsatz, der Switch erfordert keine besonderen Einstellungen. Andere Algorithmen verwenden z.B. die zweite Leitung als Backup, verwenden sie aber nicht.

Dieses Beispiel sieht wie folgt aus:
Statische IP 192.168.1.35 auf dem virtuellen bonding-Interface bond0
Algorithmus balance-rr
Der gesamte Datenverkehr wird über bond0 geroutet.

Am einfachsten ist es, erstmal per Yast die Netzwerkkarten auf dhcp zu konfigurieren, damit man entsprechende Dateien in /etc/sysconfig/network erhält.
Diese werden wie folgt geändert (in meinem Beispiel sieht das so aus, das muss natürlich individuell angepasst werden):
# cat /etc/sysconfig/network/ifcfg-eth-id-00\:00\:cb\:69\:06\:ca
BOOTPROTO='static'
BROADCAST=''
ETHTOOL_OPTIONS=''
IPADDR=''
MTU=''
NAME='Realtek RT8139'
NETMASK='255.255.255.0'
NETWORK=''
REMOTE_IPADDR=''
STARTMODE='auto'
UNIQUE='JNkJ.IQxIdIhhuH7'
USERCONTROL='no'
_nm_name='bus-pci-0000:05:04.0'

# cat /etc/sysconfig/network/ifcfg-eth-id-00\:11\:85\:0f\:18\:cd
BOOTPROTO='static'
BROADCAST=''
ETHTOOL_OPTIONS=''
IPADDR=''
MTU=''
NAME='Hewlett-Packard Company HP d530 CMT (DG746A)'
NETMASK='255.255.255.0'
NETWORK=''
REMOTE_IPADDR=''
STARTMODE='auto'
UNIQUE='rBUF.7LBxAzvZZlA'
USERCONTROL='no'
_nm_name='bus-pci-0000:05:02.0'

Anschließend wird die Datei ifcfg-bond0 neu erstellt:
# cat /etc/sysconfig/network/ifcfg-bond0
BOOTPROTO='static'
BROADCAST='192.168.1.255'
IPADDR='192.168.1.35'
NETMASK='255.255.255.0'
NETWORK='192.168.1.0'
REMOTE_IPADDR=
STARTMODE='onboot'
BONDING_MASTER='yes'
BONDING_MODULE_OPTS='mode=balance-rr miimon=100'
BONDING_SLAVE0='eth0'
BONDING_SLAVE1='eth1'
# oder BONDING_SLAVE0='hwcfg-bus-pci-0000:05:02.0'
#      BONDING_SLAVE1='hwcfg-bus-pci-0000:05:04.0'


Damit alles über bond0 geroutet wird, muss eine Route entsprechend fest eingetragen werden:
# cat /etc/sysconfig/network/routes:
default 192.168.1.1 - bond0


Änderungen an /etc/modprobe.conf.local sind nicht notwendig.


Das ganze sollte dann so aussehen:
gpfs:~ # ip a
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth1: <BROADCAST,MULTICAST,SLAVE,UP> mtu 1500 qdisc pfifo_fast master bond0 qlen 1000
    link/ether 00:11:85:0f:18:cd brd ff:ff:ff:ff:ff:ff
    inet6 fe80::211:85ff:fe0f:18cd/64 scope link
       valid_lft forever preferred_lft forever
3: eth0: <BROADCAST,MULTICAST,SLAVE,UP> mtu 1500 qdisc pfifo_fast master bond0 qlen 1000
    link/ether 00:11:85:0f:18:cd brd ff:ff:ff:ff:ff:ff
    inet6 fe80::211:85ff:fe0f:18cd/64 scope link
       valid_lft forever preferred_lft forever
5: sit0: <NOARP> mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0
6: bond0: <BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue
    link/ether 00:11:85:0f:18:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.35/24 brd 192.168.1.255 scope global bond0
    inet6 fe80::200:ff:fe00:0/64 scope link
       valid_lft forever preferred_lft forever

gpfs:~ # route -n
Kernel IP Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 bond0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 bond0


Achtung! Wenn man an diesem Punkt das Netzwerk herunterfährt oder versucht den Server zu booten, hängt das ganze System. Das heist man kann den Stromstecker ziehen. Der Grund ist, dass das Netzwerk-Startskript zuerst versucht bond0 herunterzufahren, aber ohne die Slaves vorher zu detachen.
Daher ist es unbedingt notwendig das Startskript anzupassen:

In /etc/init.d/network, ab Zeile 820
von:
        stop)

                echo Shutting down network interfaces:

                if [ -z "$INTERFACE" ] ; then
nach:
        stop)
                echo Shutting down network interfaces:

                echo "First detach bonding slaves from master:"
                echo "ifenslave -d bond0 eth0"
                ifenslave -d bond0 eth0
                echo "ifenslave -d bond0 eth1"
                ifenslave -d bond0 eth1

                if [ -z "$INTERFACE" ] ; then


Ich habe hier der Einfachheit halber ifenslave für beide Slaves hardcoded eingetragen. Eine generische Lösung ist natürlich immer schöner, aber so funktioniert es.


SLES Administration