Еще полгода назад я подарил себе не совсем обычную сетевую карту.

Intel i350-T4

Конечно, для домашнего применения толку от нее не будет никакого, а вот для среднестатистического сервера она может стать приятным дополнением. Гигабитного порта не всегда достаточно для реализации всех замыслов. И тут на помощь может прийти многопортовая сетевая карта. Я же решил усложнить задачу. Мне нужна не просто агрегация нескольких гигабитных портов в один логический линк, но и возможность создать несколько интерфейсов в разных VLAN поверх такого линка.

На сервере волею судеб оказалась FreeBSD 9.1.
C:\>uname -a
FreeBSD k-42.ru 9.1-RELEASE-p9 FreeBSD 9.1-RELEASE-p9 #0: Fri Dec 13 13:34:05 NOVT 2013     root@k-42.ru:/sys/amd64/compile/Onyx  amd64

После подключения сетевой карты она определилась как четыре порта:
C:\>ifconfig | grep flags
igb0: flags=8c02<BROADCAST,OACTIVE,SIMPLEX,MULTICAST> metric 0 mtu 1500
igb1: flags=8c02<BROADCAST,OACTIVE,SIMPLEX,MULTICAST> metric 0 mtu 1500
igb2: flags=8c02<BROADCAST,OACTIVE,SIMPLEX,MULTICAST> metric 0 mtu 1500
igb3: flags=8c02<BROADCAST,OACTIVE,SIMPLEX,MULTICAST> metric 0 mtu 1500

Замечательно. Теперь нужно из первых двух портов создать агрегированный линк под управлением протокола LACP до ближайшего коммутатора и создать интерфейс в VLAN 222. Первым делом необходимо настроить коммутатор. В данном случае им оказался ZyXEL 4728. Заходим через веб-интерфейс в Advanced Application - VLAN - Static VLAN и создаем VLAN под номером 222. Подаем его с тэгом в порты 11 и 12 (к которым у нас будет подключен сервер) и в порт 10G (который соединяет коммутатор с ядром сети).

ZyXEL 4728 LACP
В настройках порта (Advanced Application - VLAN - VLAN Port Settings) запрещаем нетэгированные пакеты с портов 11 и 12.

ZyXEL 4728 LACPТеперь переходим к настройкам агрегированного линка. Заходим в Advanced Application - Link Aggregation и создаем линк T1, в который включаем порты 11 и 12. Ставим балансировку по IP-адресам источника и получателя.

ZyXEL 4728 LACPДалее направляемся в меню LACP. Активируем протокол, оставляем приоритет 65535, чтобы параметры LACP определял сервер. Если вы хотите, чтобы управление агрегированным линком происходило со стороны коммутатора - имеет смысл поставить приоритет 1.

ZyXEL 4728 LACPКоммутатор настроен. Теперь можно переходить к настройке сервера. В арсенале FreeBSD есть драйвер lagg, с помощью которого реализуется функционал агрегированных линков и LACP. В стандартном ядре этого драйвера нет, поэтому необходимо либо пересобрать ядро с параметром device lagg, либо добавить строчку if_lagg_load="YES" в файл /boot/loader.conf.

После прочтения man lagg и изучения примеров в rc.conf  появились следующие строчки:
ifconfig_igb0="up"
ifconfig_igb1="up"
cloned_interfaces="lagg0 lagg0.222"
ifconfig_lagg0="laggproto lacp laggport igb0 laggport igb1"
ifconfig_lagg0_222=" inet 31.13.177.77 netmask 255.255.255.252"
defaultrouter="31.13.177.78"

Как это ни странно, но с таким конфигом агрегированный канал поднялся в режиме failover вместо lacp, при этом сеть не работала. Выяснилось, что на интерфейс lagg обязательно надо вешать IP-адрес. Поскольку я запретил нетэгированные пакеты на агрегированном линке со стороны коммутатора - можно удовлетворить причуду lagg-драйвера FreeBSD и повесить любой IP-адрес:
ifconfig_lagg0="laggproto lacp laggport igb0 laggport igb1 192.168.0.88 netmask 255.255.255.0"

С обновленным конфигом поднялся LACP и заработала сеть. Но мне захотелось большего. А именно MTU 9000. Если уж сетевая карта и коммутатор поддерживают Jumbo Frames - грех этим не воспользоваться. Казалось бы, что нет ничего проще. Добавляем в конфиг правильный MTU:
ifconfig_igb0="up mtu 9000"
ifconfig_igb1="up mtu 9000"
cloned_interfaces="lagg0 lagg0.222"
ifconfig_lagg0="laggproto lacp laggport igb0 laggport igb1 192.168.0.88 netmask 255.255.255.0"
ifconfig_lagg0_222=" inet 31.13.177.77 netmask 255.255.255.252"
defaultrouter="31.13.177.78"

И видим развалившийся lagg0 :). На консоли я заметил странные сообщения:
igb1: Could not setup receive structures

Выяснилось, что это махровая проблема, известная еще со времен чипсетов Intel 825xx. Для лечения нужно уменьшить размер очереди igb и увеличить максимальное количество mbuf-кластеров.

/boot/loader.conf:
hw.igb.num_queues=3

/etc/sysctl.conf:
kern.ipc.nmbclusters=262144
kern.ipc.nmbjumbop=262144

После перезагрузки системы с указанными выше параметрами агрегированный линк заработал в полную силу.