HOWTO Настройка Bonding

Материал из Gentoo Linux Wiki

Перейти к: навигация, поиск
Вернуться в раздел руководства

Содержание

[править] Кратко о статье

Предо мной встала задача установки двух сетевых интерфейсов в режим работы "как один". В терминологии Windows это звучит как teaming, а в терминологии Linux - Bonding.

Этот режим может использоваться для нескольких целей. Наиболее очевидные:

  • Отказоустойчивость - если вылетает одна сетевая карта, то автоматически перейти на использование другой прозрачно для пользователей
  • Увеличение пропускной способности - пропускная способность обеих сетевых карт суммируется

Обе поставленые задачи можно выполнить в Linux при помощи модуля bonding.

Так как руководства по настройке его в Gentoo на Русском языке я не нашел - пишу эту статью.

ВАЖНО: В случае увеличения пропускной нагрузки оба сетевых интерфейса желательно подключить к одному свичу.

Примечание: Не стоит забывать о том, что данная конструкция при распределении сетевого трафика на оба интерфейса будет работать только на оборудовании Канального уровня и выше. Тоесть на свичах, роутерах и т.д. Но НЕ на хабах, которые являются устройствами Физического уровня.

На хабах допустимым являтеся только режим active-backup (mode=1), а повышать производительность сети лучше заменой хаба на свич ;)

Примечание: При написании статьи считается, что объединияются интерфейсы eth0 и eth1.

[править] Необходимые программы

Нам понадобится утилита: emerge ifenslave Так же для сборки ядра нам понадобится (хотя оно уже должно быть): emerge gentoolkit sys-kernel/gentoo-sources

[править] Подготовка ядра

Для начала нам необходимо проверить наличие модуля bonding в ядре. Сделать это можно командой: modprobe bonding она не должна выдать на экран никаких сообщений об ошибке и отработать тихо и бесшумно. После этого модуль bonding должен появиться в списке модулей: lsmod | grep bonding Вы должны увидеть нечто похожее на следующее:

bonding                63464  0

Если это произошло, то ядро нам трогать не нужно.

В противном случае добавляем при помощи genkernel --menuconfig all опцию Networking support > Network device support > Bonding driver support (опция CONFIG_BONDING=m в файле /usr/src/linux/.config). С моей точки зрения эту плюшку удобнее компилировать модулем. Тогда можно будет обойтись без перезагрузки.

После этого необходимо загрузить модуль при помощи уже упоминавшейся комманды modprobe bonding

[править] Проверить наличие настроек модуля bonding

Необходимо проверить наличие настроек модуля bonding. У меня они были по умолчанию. Я их такими и оставил:

Файл: /etc/modules.d/bond
alias bond0 bonding
options bond0 mode=0 miimon=100

Параметры, передаваемые модулю:

  • mode

Указывает режим работы

    • mode=0 - Round robin

Круговой, циклически использует физические интерфейсы для передачи пакетов. Рекомендован для включения "по умолчанию". Этот режим работает с максимальной отдачей

    • mode=1 - Active-backup

Горячая замена. Работает только один интерфейс, при выходе из строя основного, автоматичеки подключает резервный взамен отказавшего. Этот режим целесообразно использовать для повышения отказоустойчивости, также только этот режим возможен при подключении сервера через Hub

    • mode=2 - XOR

Исключение. Режим, в котором физический интерфейс для передачи пакета расчитывается по формуле «(src hw addr XOR dst hw addr) % slave cnt», где «src hw addr» и «dst hw addr» - MAC-адреса отправителя и получателя, а slave – число работающих физических интерфейсов. Интерфейс отправляющий пакет зависит от MAC адреса получателя, соответсвенно каждый физический сетевой интерфейс отправляет пакеты только определенной группе MAC адрессов всего адресного пространства сети, благодаря чему происходит равномерное распределение нагрузки.

  • miimon

Число мс – как часто производится мониторинг MII статуса. 0 – мониторинг отключен. Рекомендуемое значение 100 мс.

  • downdelay

Задержка в мс с момента обнаружения исчезновения связи, до момента реального отключения канала. Используется для фильтрации кратковременных сбоев к примеру после замены сетевого кабеля. По умолчанию используется 0 – нет задержки.

  • updelay

Похоже на downdelay, но поправка идет на включению, на тот случай, если есть проблемы с задержкой загрузки switch или другого оборудования. Питание порта влючается зразу, но обмен пакетами до полной загрузки устройства невозможен.

Подробнее можно ознакомиться в Linux Ethernet Bonding Driver mini-howto

[править] Автоматическая загрузка модуля (если bonding скомпилирован как модуль)

Модуль bonding нужно загружать при загрузке системы. Для этого нужно добавить в файл /etc/modules.autoload.d/kernel-2.6 строку:

Файл: /etc/modules.autoload.d/kernel-2.6
bonding

[править] Настройка интерфейсов

Нужно добавить и настроить интерфейс bond0 как обычный сетевой интерфейс:

Файл: /etc/conf.d/net
modules=( "bonding" )
iface_bond0="172.16.1.2 broadcast 172.16.255.255 netmask 255.255.0.0"
gateway="bond0/172.16.1.1"
Предупреждение: Все приведенные параметры интерфеса являются вымышленными. Любые совпадения просьба считать случайностью.

Так же необходимо создать ссылку на скрипт запуска интерфейса: ln -s /etc/init.d/net.eth0 /etc/init.d/net.bond0

Примечание: В последних версиях sys-apps/baselayout правильнее создавать симлинки на интерфейс net.lo, который является основным скриптом для запуска сетевых интерфейсов, а не на net.eth0.

И установить запуск интерфейсов при загрузке:

Code: root@localhost:~
rc-update add net.bond0 default
rc-update del net.eth0
rc-update del net.eth1

Помимо этого необходимо вписать в файл /etc/conf.d/local.start строку для автоматического запуска интерфейса при загрузке системы:

Файл: /etc/conf.d/local.start
ifenslave bond0 eth0 eth1

[править] Включение интерфейса

Чтобы запустить интерфейс bond0 и подключить интерфейсы eth0 и eth1 к bond0 без перезагрузки необходимо выполнить следующие команды:

Code: root@localhost:~
/etc/init.d/net.bond0 start
ifenslave bond0 eth0 eth1

[править] Результат

В результате у нас должен появиться интерфейс bond0, использующий для отправки/получения данных интерфейсы eth0 и eth1.

Результат комманды ifconfig должен быть примерно таким: ifconfig

bond0     Link encap:Ethernet  HWaddr 00:20:ED:52:58:E5
          inet addr:172.16.1.2  Bcast:172.16.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:7137 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1488 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:658029 (642.6 Kb)  TX bytes:140750 (137.4 Kb)
eth0      Link encap:Ethernet  HWaddr 00:20:ED:52:58:E5
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:7137 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1489 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:658029 (642.6 Kb)  TX bytes:140844 (137.5 Kb)
          Base address:0xdc00 Memory:febe0000-fec00000
eth1      Link encap:Ethernet  HWaddr 00:20:ED:52:58:E5
          UP BROADCAST SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:540 (540.0 b)  TX bytes:540 (540.0 b)
Примечание: У меня интерфейс eth1 физически отключен от сети

А результат команды route должен быть примерно таким: route

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.0.0      *               255.255.0.0     U     0      0        0 bond0
loopback        localhost       255.0.0.0       UG    0      0        0 lo
default         172.16.1.1      0.0.0.0         UG    0      0        0 bond0

[править] Источники

В процессе работы опирался на следующие источники:

Личные инструменты
На других языках