This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
software:freebsd:lagg_on_netgraph [2022/02/04 18:33] – removed - external edit (Unknown date) 127.0.0.1 | software:freebsd:lagg_on_netgraph [2022/02/05 04:36] (current) – root | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== ng_lagg - if_lagg on netgraph ====== | ||
+ | По неизвестной причине использование **if_lagg** и двух сетевых адаптеров igb на FreeBSD 10.1 amd64 приводило к большой нагрузке на CPU, потере пакетов и потере связи при приёме мультикаста с битрейтом свыше 100 мегабит.\\ | ||
+ | Реализация объединения сетевых адаптеров средствами netgraph не подвержена подобной проблеме.\\ | ||
+ | Результат совместим с **if_vlan** и по сути мало чем отличается от других интерфейсов в системе.\\ | ||
+ | **Cкрипт**: | ||
+ | **rc.d скрипт**: | ||
+ | |||
+ | ===== Использование ===== | ||
+ | ==== Создание LAGG интерфейса и добавление сетевых адаптеров ==== | ||
+ | < | ||
+ | Создаст интерфейс **ngeth0** (**ngethX** - если X-1 существует), | ||
+ | Также будет сгенерирован и установлен случайный мак адрес.\\ | ||
+ | |||
+ | < | ||
+ | Создаст интерфейс с именем **xxxLAGG**, | ||
+ | Имя интерфейса произвольное.\\ | ||
+ | |||
+ | == ВАЖНО! == | ||
+ | - Имя интерфейса не должно содержать: | ||
+ | - Максимальное количество интерфейсов в LAGG - 64. Это ограничение обусловлено константой **NG_ONE2MANY_MAX_LINKS** в файле / | ||
+ | - В LAGG на базе netgraph можно добавлять только сетевые интерфейсы к которые работают с нодой **ng_ether**. Список доступных интерфейсов можно увидеть так: | ||
+ | < | ||
+ | Если ничего нет, то убедитесь что нода **ng_ether** загружена, | ||
+ | < | ||
+ | |||
+ | |||
+ | ==== Удаление LAGG интерфейса ==== | ||
+ | < | ||
+ | или | ||
+ | < | ||
+ | в зависимости от названия интерфейса. | ||
+ | |||
+ | |||
+ | ==== Добавление интерфейса в существующий LAGG ==== | ||
+ | < | ||
+ | |||
+ | |||
+ | ==== Удаление интерфейса из LAGG ==== | ||
+ | < | ||
+ | |||
+ | == ВАЖНО! == | ||
+ | Проверки на принадлежность интерфейса к какому либо lagg на базе netgrapf не производится.\\ | ||
+ | Код просто отключает lower хук интерфейса не производя никаких проверок.\\ | ||
+ | |||
+ | |||
+ | ==== rc.d скрипт ==== | ||
+ | Для того чтобы интерфейс создавался при загрузке автоматически нужно: | ||
+ | - сохранить rc.d скрипт [[http:// | ||
+ | - сохранить скрипт [[http:// | ||
+ | - разрешить выполнение обоих скриптов (chmod +x) | ||
+ | - добавить в / | ||
+ | < | ||
+ | ng_lagg_interfaces=" | ||
+ | ng_lagg_lagg0=" | ||
+ | ng_lagg_xyzlagg=" | ||
+ | ifconfig_lagg0=" | ||
+ | ifconfig_xyzlagg=" | ||
+ | |||
+ | vlans_lagg0=" | ||
+ | create_args_vlan1234=" | ||
+ | ifconfig_vlan1234=" | ||
+ | </ | ||
+ | |||
+ | |||
+ | === Замечания === | ||
+ | - Можно создавать сколько угодно интерфейсов, | ||
+ | - Нельзя давать имена интерфейсам " | ||
+ | |||
+ | |||
+ | ===== Этапы создания lagg на простом примере ===== | ||
+ | - Загружаем модуль **ng_ether**, | ||
+ | - Инициализируем/ | ||
+ | - Включаем неразборчивый режим на сетевых интерфейсах: | ||
+ | - Отключаем автоматической выставление mac адреса в исходящих пакетах на данных сетевых адаптерах. | ||
+ | - Создаём и подключаем ноду **one2many** к хуку **lower** на интерфейсе **igb0** хуком many0. | ||
+ | - Даём имя созданной ноде: **lagg0**. | ||
+ | - Подключаем ноду **lagg0** к хуку **lower** на интерфейсе **igb1** хуком **many1**. | ||
+ | - Создаём и подключаем ноду **vlan** к хуку **one** ноды **lagg0**. На этот хук будут поступать пакеты с хуков **manyX** и наоборот. | ||
+ | - Даём имя созданной ноде: **lagg0_vlan**. | ||
+ | - Создаём и подключаем ноду **eiface** к хуку **vlan21** ноды **lagg0_vlan**. Теперь сетевой Интерфейс создан, | ||
+ | - Переименовываем созданный сетевой интерфейс **ngeth0** в **ngvlan21** (будет отображаться в выводе **ifconfig**). | ||
+ | - Настраиваем mac и ip адреса на интерфейсе **ngvlan21**. | ||
+ | - Добавляем фильтр в ноду **lagg0_vlan**, | ||
+ | |||
+ | |||
+ | ==== Замечания ==== | ||
+ | * Настройка **one2many** отсутствует потому что после создания нода работает в режиме NG_ONE2MANY_XMIT_ROUNDROBIN для исходящего трафика, | ||
+ | * **ng_one2many** можно заменить на **ng_bpf**, и с помощью ассемблера BPF реализовать распределение исходящих пакетов по L2/L3/L4 адресам. Пример использования **ng_bpf**: [[software: | ||
+ | |||
+ | |||
+ | ==== Скрипт - для двух сетевых интерфейсов ==== | ||
+ | < | ||
+ | |||
+ | 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: | ||
+ | ifconfig ngeth0 name ngvlan21 | ||
+ | ifconfig ngvlan21 link 00: | ||
+ | ifconfig ngvlan21 inet 192.168.0.20 netmask 255.255.255.0 | ||
+ | ngctl msg lagg0_vlan: addfilter '{ vid=21 hook=" | ||
+ | |||
+ | |||
+ | ===== Литература ===== | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | |||
+ | |||
+ | |||
+ | {{tag> |