El Bonding es una técnica que consiste, básicamente, en
configurar dos tarjetas de red con la misma IP. Al hacer esto, conseguimos que
ambas tarjetas trabajen como una sola produciendo redundancia con balanceo de
carga y tolerancia a fallos en la interface. Es posible hacerlo con más
tarjetas, pero yo personalmente no lo he probado.
Este documento lo he desarrollado conforme a una
instalación de openSUSE Linux 10.2 sobre un servidor IBM Netfinity 5100 type
8658-21Y, con dos tarjetas de red: la primera es la que trae el equipo de
fábrica integrada en la placa madre y la segunda es una Intel PRO/1000 MT
Server Adapter.
También lo probé, anteriormente, con openSUSE Linux 10.0
sobre servidor un IBM eServer xSeries 206 type 8482-3MG, con dos tarjetas de
red: la primera es la que trae el equipo de fábrica integrada en la placa madre
(IBM 82547GI Gigabit Ethernet Controller) y la segunda es una Intel PRO/1000 MT
Server Adapter (módulo e1000 del kernel, la misma que usé en la instalación
referenciada en el párrafo anterior).
En ambas instalaciones ha funcionado perfectamente, tanto
al iniciarse los equipos como en tiempo de ejecución (no han dado ningún tipo
de problema).
Para hacer bonding con dichas tarjetas y que se active
durante el arranque, al ser un kernel que usa “sysconfig” hay que hacer los
siguientes pasos:
1.- El kernel debe soportar “bonding” (compilar el kernel
o mediante módulos del kernel). En la instalación no tuve que hacer nada
especial y el kernel se instaló con soporte para bonding por defecto. Partí de
una instalación con “sistema gráfico mínimo sin KDE” añadiéndole “Herramientas
de Desarrollo y Compilación” y algunos paquetes que no vienen al caso.
2.- Editamos el fichero “/etc/modprobe.conf.local” y
añadimos las siguientes líneas:
- alias bond0 bonding
- options bond0 mode=modo miimon=100
- install bond0 /sbin/modprobe bonding –o bond0 mode=modo miimon=100
- options bond0 mode=modo miimon=100
- install bond0 /sbin/modprobe bonding –o bond0 mode=modo miimon=100
Nota: mode=modo debe corresponderse con los modos
aceptados por el “bonding”:
- mode=0 o mode=balance-rr: Configura una política de
round-robin para la tolerancia de fallas y balanceo de cargas. Las
transmisiones son recibidas y enviadas secuencialmente en cada interfaz esclava
vinculada comenzando con la primera disponible.
- mode=1 o mode=balance-xor : Configura una política
de respaldo activa para la tolerancia de fallas. Las transmisiones son
recibidas y enviadas a través de la primera interfaz esclava vinculada
disponible. Sólo se utiliza otra interfaz esclava vinculada si la interfaz
esclava activa falla.
- mode=2 o mode=balance-xor: Configura una política XOR
(o-exclusivo) para la tolerancia de fallas y el balanceo de cargas. Usando este
método la interfaz coincide la dirección MAC de las peticiones entrantes con la
dirección MAC de una de las NICs esclava. Una vez que se establece el enlace,
las transmisiones son enviadas secuencialmente comenzando con la primera
interfaz disponible.
- mode=3 o mode=broadcast: Configura una política de
difusión para la tolerancia de fallas. Las transmisiones son enviadas en todas
las interfaces esclavas.
- mode=4 o mode=802.3ad: Configura una política de
agregación de enlace dinámico IEEE 802.3ad. Crea grupos de agregación que
comparten las mismas especificaciones de velocidad y duplex. Transmite y recibe
en todos los esclavos en el agregador activo. Requiere de un switch que sea
conforme con 802.3ad.
- mode=5 o mode=balace-tbl: Configura una política de
balanceo de carga de transmisión (Transmit Load Balancing, TLB) para la
tolerancia de fallas y el balanceo de cargas. El tráfico saliente es
distribuido de acuerdo a la carga actual en cada interfaz esclava. El esclavo
actual recibe el tráfico entrante. Si el eslavo receptor falla, otro esclavo
toma la dirección MAC del esclavo fallido.
- mode=6 o mode=balance-alb: Configura una política de
balanceo de cargas activa (Active Load Balancing, ALB) para la tolerancia de
fallas y el balanceo de cargas. Incluye el balanceo de cargas de transmisión y
recepción para el tráfico IPV4. Se logra el balanceo de las cargas recibidas a
través de la negociación ARP.
miimon= — Especifica (en milisegundos) la frecuencia en
que ocurre la supervisión MII. Esto es útil si se requiere gran disponibilidad
porque MII es utilizado para verificar que la NIC está activa.
Para verificar que el controlador para un NIC particular
es compatible con la herramienta MII, escriba el comando siguiente como root:
ethtool
<interfaz_red> | grep “Link detected:”
Si se soporta MII, el comando devuelve:
Link detected: yes
Grabamos los cambios.
3.- Se configuran ambas tarjetas, mediante “yast”, con
“DHCP” para que genere los ficheros “ifcgf-eth-id-xx:xx:xx:xx:xx:xx” (uno por
cada tarjeta de red). Anotamos las líneas _nm_name=’bus-pci-xxxx:xx:xx.x” de
cada fichero (por ejemplo: para la eth0 “bus-pci-0000:02:01.0” y para la eth1
“bus-pci-0000:03:01.0”; en mi caso).
4.- En el directorio “/etc/sysconfig/network”, creamos un
directorio (por ejemplo “copia”) y copiamos los dos ficheros
“ifcfg-eth-id-xx:xx:xx:xx:xx:xx” que se han generado en el paso anterior. Esto
es sólo como copia de respaldo y si se quiere hacer, puesto que se pueden
volver a generar borrándolos y entrando de nuevo en el yast (paso 3).
5.- Copiamos el fichero “ifcfg-eth-id-xx:xx:xx:xx:xx:xx”
(que se corresponde con la tarjeta “eth0”, que es la IBM 82547GI) con el
comando “cp ifcfg-eth-id-xx:xx:xx:xx:xx:xx ifcfg-bond0”, que es el que usaremos
para crear la interfaz del bonding. Posteriormente borramos ambos
"ifcfg-eth-id-.....".
6.- Editamos el fichero “ifcfg-bond0” y vemos que el
contenido es similar al siguiente:
BOOTPROTO=’dhcp’
BROADCAST=’’
IPADDR=’’
MTU=’’
NETMASK=’’
NETWORK=’’
REMOTE_IPADDR=’’
STARTMODE=’auto’
UNIQUE=’rBUF.qW72CX+fPoA’
_nm_name=’bus-pci-0000:02:01.1’
USERCONTROL=’no’
BROADCAST=’’
IPADDR=’’
MTU=’’
NETMASK=’’
NETWORK=’’
REMOTE_IPADDR=’’
STARTMODE=’auto’
UNIQUE=’rBUF.qW72CX+fPoA’
_nm_name=’bus-pci-0000:02:01.1’
USERCONTROL=’no’
7.- Hacemos los
siguientes cambios:
BOOTPROTO=’static’
BROADCAST=’192.168.1.255’
IPADDR=’192.168.1.40’
MTU=’’
NETMASK=’255.255.255.0’
NETWORK=’192.168.1.0’
REMOTE_IPADDR=’’
START_MODE=’onboot’
BONDING_MASTER=’yes’
UNIQUE=’rBUF.qW72CX+fPoA’
_nm_name=’bus-pci-0000:02:01.1’
BONDING_SLAVE0=’bus-pci-0000:02:01.1’
BONDING_SLAVE1=’bus-pci-0000:03:01.1’
BONDING_MODULE_OPTS=’mode=modo miimon=100 use_carrier=0’
BROADCAST=’192.168.1.255’
IPADDR=’192.168.1.40’
MTU=’’
NETMASK=’255.255.255.0’
NETWORK=’192.168.1.0’
REMOTE_IPADDR=’’
START_MODE=’onboot’
BONDING_MASTER=’yes’
UNIQUE=’rBUF.qW72CX+fPoA’
_nm_name=’bus-pci-0000:02:01.1’
BONDING_SLAVE0=’bus-pci-0000:02:01.1’
BONDING_SLAVE1=’bus-pci-0000:03:01.1’
BONDING_MODULE_OPTS=’mode=modo miimon=100 use_carrier=0’
NOTA: En negrita están marcados los cambios y en itálica
las líneas añadidas a mano. Las opciones de BONDING_MODULE_OPTS deben
corresponderse con las líneas añadidas al "modprobe.conf.local" del
punto 2 de este artículo, tanto para "mode" como para
"miimon".
Las líneas BROADCAST, IPADDR y NETWORK debes adaptarla a
las IP’s de tu red en caso de que no coincidan con las aquí mostradas. El
contenido de BONDING_SLAVE... no se debe copiar literalmente de éste artículo,
sino conservar el que genere tu sistema.
8.- Una vez hechos los cambios, los grabamos y copiamos
el fichero en el directorio “copia” y borramos los ficheros “ifcfg-eth-id-xx:xx:xx:xx:xx:xx”
que se generaron por el “yast” para ambas tarjetas de red.
9.- Reiniciamos el equipo para que active los cambios y
observamos que se ejecuta todo correctamente; hay veces que en el arranque se
ve que falla el servicio “network”, pero si entramos como “root” y ejecutamos
el comando “ifconfig” y sale aproximadamente lo siguiente:
bond0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.168.1.40 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: xx::xxx:xxxx:xxxx:xxx/xx Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:xxxx errors:0 dropped:0 overruns:0 frame:0
TX packets:xxxx errors:0 dropped:0 overruns:0 carrier:0
collisions:xx txqueuelen:0
RX bytes:xxxxxxxx (xxx.x Kb) TX bytes:xxxxxx (xxx.x Kb)
inet addr:192.168.1.40 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: xx::xxx:xxxx:xxxx:xxx/xx Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:xxxx errors:0 dropped:0 overruns:0 frame:0
TX packets:xxxx errors:0 dropped:0 overruns:0 carrier:0
collisions:xx txqueuelen:0
RX bytes:xxxxxxxx (xxx.x Kb) TX bytes:xxxxxx (xxx.x Kb)
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet6 addr: xx::xxx:xxxx:xxxx:xxx/xx Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:xxxx errors:0 dropped:0 overruns:0 frame:0
TX packets:xxxx errors:0 dropped:0 overruns:0 carrier:0
collisions:xx txqueuelen:0
RX bytes:xxxxxxxx (xxx.x Kb) TX bytes:xxxxxx (xxx.x Kb)
Base address:XxXXXX Memory:xxxxxxxx-xxxxxxxx
inet6 addr: xx::xxx:xxxx:xxxx:xxx/xx Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:xxxx errors:0 dropped:0 overruns:0 frame:0
TX packets:xxxx errors:0 dropped:0 overruns:0 carrier:0
collisions:xx txqueuelen:0
RX bytes:xxxxxxxx (xxx.x Kb) TX bytes:xxxxxx (xxx.x Kb)
Base address:XxXXXX Memory:xxxxxxxx-xxxxxxxx
eth1 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet6 addr: xx::xxx:xxxx:xxxx:xxx/xx Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:xxxx errors:0 dropped:0 overruns:0 frame:0
TX packets:xxxx errors:0 dropped:0 overruns:0 carrier:0
collisions:xx txqueuelen:0
RX bytes:xxxxxxxx (xxx.x Kb) TX bytes:xxxxxx (xxx.x Kb)
Base address:XxXXXX Memory:xxxxxxxx-xxxxxxxx
inet6 addr: xx::xxx:xxxx:xxxx:xxx/xx Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:xxxx errors:0 dropped:0 overruns:0 frame:0
TX packets:xxxx errors:0 dropped:0 overruns:0 carrier:0
collisions:xx txqueuelen:0
RX bytes:xxxxxxxx (xxx.x Kb) TX bytes:xxxxxx (xxx.x Kb)
Base address:XxXXXX Memory:xxxxxxxx-xxxxxxxx
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::x/xx Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:xxxx errors:0 dropped:0 overruns:0 frame:0
TX packets:xxxx errors:0 dropped:0 overruns:0 carrier:0
collisions:xx txqueuelen:0
RX bytes:xxxxxxxx (xxx.x Kb) TX bytes:xxxxxx (xxx.x Kb)
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::x/xx Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:xxxx errors:0 dropped:0 overruns:0 frame:0
TX packets:xxxx errors:0 dropped:0 overruns:0 carrier:0
collisions:xx txqueuelen:0
RX bytes:xxxxxxxx (xxx.x Kb) TX bytes:xxxxxx (xxx.x Kb)
quiere decir que todo está correcto y se ha levantado el
“bonding” sin problema.
Si el enrutamiento está bien configurado y ejecutamos el
comando “route –n” nos debe salir aproximadamente lo siguiente (192.168.1.X se
corresponde con la IP de nuestra puerta de enlace de salida al exterior, como
por ejemplo Internet; o con el router que nos comunica con el resto de las
subredes de la WAN):
Kernel IP routing
table
Destination Gateway 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.X 0.0.0.0 UG 0 0 0 bond0
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.X 0.0.0.0 UG 0 0 0 bond0
No hay comentarios:
Publicar un comentario