Site Tools


software:freebsd:lagg_on_netgraph

This is an old revision of the document!


ng_lagg - if_lagg on netgraph

По неизвестной причине использование if_lagg и двух сетевых адаптеров igb на FreeBSD 10.1 amd64 приводило к большой нагрузке на CPU, потере пакетов и потере связи.
Реализация объединения сетевых адаптеров средствами netgraph не подвержена подобной проблеме.
Результат совместим с if_vlan и по сути мало чем отличается от других интерфейсов в системе.
Cкрипт: ng_lagg.sh
rc.d скрипт: ng_lagg

Использование

Создание LAGG интерфейса и добавление сетевых адаптеров

ng_lagg.sh start auto em0 em1 igb0

Создаст интерфейс ngeth0 (ngethX - если X-1 существует), добавит в него адаптеры em0,em1 и igb0.
Также будет сгенерирован и установлен случайный мак адрес.

ng_lagg.sh start xxxLAGG em0 em1 igb0

Создаст интерфейс с именем xxxLAGG, остальное как в примере выше.
Имя интерфейса произвольное.

ВАЖНО!

1. Имя интерфейса не должно содержать: “.” и “:”.
Это ограничение netgraph.
Подробнее: man 4 netgraph

2. В LAGG на базе netgraph можно добавлять только сетевые интерфейсы к которые работают с нодой ng_ether.
Список доступных интерфейсов можно увидеть так:

ngctl list | grep ether

Если ничего нет, то убедитесь что нода ng_ether загружена, или загрузите:

kldload ng_ether

Удаление LAGG интерфейса

ng_lagg.sh stop ngeth0

или

ng_lagg.sh stop xxxLAGG

в зависимости от названия интерфейса.

Добавление интерфейса в существующий LAGG

ng_lagg.sh if_add xxxLAGG igb1

Удаление интерфейса из LAGG

ng_lagg.sh if_del em0
ВАЖНО!

Проверки на принадлежность интерфейса к какому либо lagg на базе netgrapf не производится.
Код просто отключает lower хук интерфейса не производя никаких проверок.

rc.d скрипт

Для того чтобы интерфейс создавался при загрузке автоматически нужно:

  1. сохранить rc.d скрипт ng_lagg в /usr/local/etc/rc.d/
  2. сохранить скрипт ng_lagg.sh в /usr/sbin/
  3. разрешить выполнение обоих скриптов (chmod +x)
  4. добавить в /etc/rc.conf или /etc/rc.conf.local разрешение на его запуск и настройки:
ng_lagg_enable="YES"
ng_lagg_command="/usr/sbin/ng_lagg.sh"
ng_lagg_interface="lagg0"
ng_lagg_ports="em0 em1"
ifconfig_lagg0="inet 192.168.11.77 netmask 255.255.255.0"

vlans_lagg0="vlan1234"
create_args_vlan1234="vlan 1234"
ifconfig_vlan1234="inet 192.168.0.77 netmask 255.255.255.0"

Этапы создания lagg на простом примере

  1. Загружаем модуль ng_ether, остальные модули загрузятся автоматически при исполнении команды mkpeer.
  2. Инициализируем/включаем сетевые интерфейсы.
  3. Включаем неразборчивый режим на сетевых интерфейсах: нужно для правильной работы.
  4. Отключаем автоматической выставление mac адреса в исходящих пакетах на данных сетевых адаптерах.
  5. Создаём и подключаем ноду one2many к хуку lower на интерфейсе igb0 хуком many0.
  6. Даём имя созданной ноде: lagg0.
  7. Подключаем ноду lagg0 к хуку lower на интерфейсе igb1 хуком many1.
  8. Создаём и подключаем ноду vlan к хуку one ноды lagg0. На этот хук будут поступать пакеты с хуков manyX и наоборот.
  9. Даём имя созданной ноде: lagg0_vlan.
  10. Создаём и подключаем ноду eiface к хуку vlan21 ноды lagg0_vlan. Теперь сетевой Интерфейс создан, но нужно настроить его и ноду lagg0_vlan чтобы им можно было пользоваться.
  11. Переименовываем созданный сетевой интерфейс ngeth0 в ngvlan21 (будет отображаться в выводе ifconfig).
  12. Настраиваем mac и ip адреса на интерфейсе ngvlan21.
  13. Добавляем фильтр в ноду lagg0_vlan, чтобы пакеты из vlan 21 пересылались через хук vlan21 на интерфейс ngvlan21.

Замечания

  • Настройка one2many отсутствует потому что после создания нода работает в режиме NG_ONE2MANY_XMIT_ROUNDROBIN для исходящего трафика, других приемлемых для lagg режимов у ноды нет.
  • ng_one2many можно заменить на ng_bpf, и с помощью ассемблера BPF реализовать распределение исходящих пакетов по L2/L3/L4 адресам. Пример использования ng_bpf: Замена igmpproxy на netgraph

Скрипт - для двух сетевых интерфейсов

kldload ng_ether

ifconfig igb0 up
ifconfig igb1 up

ngctl msg igb0: setpromisc 1
ngctl msg igb1: setpromisc 1
ngctl msg igb0: setautosrc 0
ngctl msg igb1: setautosrc 0


ngctl mkpeer igb0: one2many lower many0
ngctl name igb0:lower lagg0
ngctl connect igb1: lagg0: lower many1

ngctl mkpeer lagg0: vlan one downstream
ngctl name lagg0:one lagg0_vlan



ngctl mkpeer lagg0_vlan: eiface vlan21 ether
ngctl name lagg0_vlan:vlan21 ngvlan21
ifconfig ngeth0 name ngvlan21
ifconfig ngvlan21 link 00:1a:4d:55:9a:44
ifconfig ngvlan21 inet 192.168.0.20 netmask 255.255.255.0
ngctl msg lagg0_vlan: addfilter '{ vid=21 hook="vlan21" }'

Литература

software/freebsd/lagg_on_netgraph.1437310910.txt.gz · Last modified: 2015/07/19 13:01 by root