О вреде RTFM: как правильно настраивать link aggregation в FreeBSD

Век живи, век RTFM и все равно LMD
Народная мудрость

В официальной документации на сайте FreeBSD для настройки link aggregation в rc.conf рекомендуется указать следующее:

ifconfig_fxp0="up"
ifconfig_fxp1="up"
cloned_interfaces="lagg0"
ifconfig_lagg0="laggproto lacp laggport fxp0 laggport fxp1 10.0.0.15/24"

Но правильно ли это? Если Вы не планируете использовать 802.1q на агрегированном интерфейсе, то Вам должно быть всё равно и дальше можно не читать.

А если всё же надо?

Тогда, следуя авторской логике, в rc.conf надо будет написать что-то типа:

ifconfig_fxp0="up"
ifconfig_fxp1="up"
cloned_interfaces="lagg0 lagg0.2 lagg0.4"
ifconfig_lagg0="laggproto lacp laggport fxp0 laggport fxp1 up"
ifconfig_lagg0_2="inet 10.0.2.15/24"
ifconfig_lagg0_4="inet 10.0.4.16/24"

Если так и поступить, то операционная система сделает вид, что так и надо, и, не выдав ни одного предупреждения, загрузится.

Но, если внимательно посмотреть, то можно заметить одну маленькую проблему: на тэгированных интерфейсах MTU окажется равным 1496:

lagg0.2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1496

Почему это произошло?

В процессе загрузки ОС сначала создаёт все интерфейсы, перечисленные в cloned_interfaces. Таким образом, на момент создания тэгированных интерфейсов lagg0.2 и lagg0.4 их родительский интерфейс lagg0 еще не имеет ни одного физического порта. Так как теоретически в lagg0 могут быть добавлены интерфейсы, которые не поддерживают длину фрейма 1522 байта, то ОС перестраховывается и уменьшает MTU для тэгированных интерфейсов на 4.

Для того, чтобы этого избежать, на момент создания тэгированных интерфейсов родительский интерфейс уже должен знать свои порты, а для этого добавление портов необходимо перенести на момент создания интерфейса. Правильный rc.conf должен выглядеть так:

ifconfig_fxp0="up"
ifconfig_fxp1="up"
cloned_interfaces="lagg0 lagg0.2 lagg0.4"
create_args_lagg0="laggproto lacp laggport fxp0 laggport fxp1"
ifconfig_lagg0="up"
ifconfig_lagg0_2="inet 10.0.2.15/24"
ifconfig_lagg0_4="inet 10.0.4.16/24"

После загрузки с таким конфигурационным файлом Вы получите корректное значение MTU для тэгированных интерфейсов:

lagg0.2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500

P.S. Если тэгированный интерфейс при загрузке получил MTU 1496, то изменить его на 1500 уже не получится. При этом создаваемые уже после загрузки интерфейсы будут получать MTU 1500.

Коротко о себе:

Работаю в компании Tune-IT и ассистентом кафедры Вычислительной техники в СПбГУИТМО.

Очень люблю команду cat и ставить core solaris.