Зачастую в большой локальной сети необходимо для сервера увеличить пропускную способность и повысить отказоустойчивость. Это полезно так же для кластеров, ведь канал передачи данных зависит от количества сетевых интерфейсов умноженных на ширину их канала. Таким образом можно получить 0.1 и 100 Gbit/s канал (в зависимости от технологий связи и ширины каждого канала).
Суть идеи состоит в том, что все сетевые объединяются в “ствол” и на выходе видно только один интерфейс - bond, с одной конфигурацией и ip.
Вот пример:
У нас 3 сетевых карты. Каждой присвоен свой ip через dhcp:
/etc/conf.d/net
#Следующие три строки обязательны, иначе bond может не запуститься
modules_eth0=( "!plug" )
modules_eth1=( "!plug" )
modules_eth2=( "dhcp" )
#Можно и статичные ip присвоить, но не будем сейчас усложнять задачу
config_eth0=( "dhcp" )
config_eth1=( "dhcp" )
config_eth2=( "dhcp" )
Но каждый из этих интерфейсов обменивается данными только если идёт запрос на конкретный ip, в крайнем случае используется самый первый.
Для начала, необходимо проверить/установить пакет ifenslave
#emerge -av ifenslave
После установки (если она требовалась) нужно добавить модуль в ядро и создать дополнительный интерфейс в /etc/init.d/, который назовём bond0:
#modprobe bonding
//Ошибок возникнуть не должно, в противном случае попробуйте переустановить ifenslave
#ln /etc/init.d/net.{lo,bond0}
//Раньше ссылку делали на eth0, но позже стали менять на lo, так как это всё же правильнее.
Теперь осталось только лишь настроить сам интерфейс и указать зависимости:
/etc/conf.d/net
#Старую конфигурацию не трогаем, так там всё правильно, добавляем новые строки.
#Вписываем интерфейсы, которые надо собрать
slaves_bond0="eth0 eth1 eth2"
#Настраиваем bond0, допустим через dhcp, но вы можете всё прописать сами
config_bond0=( "dhcp" )
#и указываем зависимости, т.к. им надо ещё запуститься! :)
depend_bond0() {
need net.eth0 net.eth1 net.eth2
}
По умолчанию, bond0 будет иметь такой же MAC, как и у eth0.
Собственно осталось только заставить всё это работать.
//Не знаю кому как, а мне удобнее добавлять его в level "boot"
#rc-update add net.bond0 boot
#rc-update del net.eth0 default
#rc-update del net.eth1 default
#rc-update del net.eth2 default
#/etc/init.d/net.bond0 start
Если всё заработало без ошибок, значит всё настроено правильно и при условии, что у наших карт была пропускная способность в 1 Gbit/s, то мы получили канал в 3 Gbit/s.
В случае отказа одного из интерфейсов это скажется пожалуй только на скорости передачи, но сеть будет по прежнему работать.
P.S.: Если найдёте ошибки, пишите - подправлю.