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
[править] Источники
В процессе работы опирался на следующие источники:
- http://www.opennet.ru/tips/info/759.shtml
- http://wiki.gentoo-italia.net/index.php/Bonding:_schede_di_rete_ridondanti_e_load_balancing
- /usr/src/linux/Documentation/networking/bonding.txt - описание модуля ядра. Полезно почитать, если интересует механизм и режимы работы данной конструкции.
