Вопрос или проблема
Я обновляю свой Ethernet до 10 Гбит/с, чтобы ускорить соединение в моей локальной сети. К сожалению, на машине в моей сети закончилось место для слотов PCIe, поэтому использование родного адаптера 10 GbE PCIe невозможно. Адаптер USB — единственная разумная альтернатива. Поскольку Ethernet коммутаторы и адаптеры USB на 5 Гбит/с сложно найти и они дорогие, было принято решение запустить сервер с двумя адаптерами Ethernet 2,5 Гбит/с на USB 3, основанными на чипсете Realtek RTL8156, которые легко доступны. Затем их соединяют на уровне Ethernet с помощью агрегации канала в LAG/LACP и подключают к коммутатору на 2,5/10 Гбит/с.
Эти USB адаптеры могут быть распознаны Linux следующим образом. Я также заранее определил, что оба адаптера могут работать независимо на 2,5 Гбит/с, назначив каждому сетевому интерфейсу IP-адрес и выполнив тест iperf3.
$ dmesg
[ 5.118103] usb 4-4: новое устройство SuperSpeed USB номер 2 с использованием xhci_hcd
[ 5.138434] usb 4-4: Найдено новое USB устройство, idVendor=0bda, idProduct=8156, bcdDevice=31.04
[ 5.138436] usb 4-4: Новые строки USB устройства: Mfr=1, Product=2, SerialNumber=6
[ 5.138438] usb 4-4: Продукт: USB 10/100/1G/2.5G LAN
[ 5.138439] usb 4-4: Производитель: Realtek
[ 5.138440] usb 4-4: Серийный номер: 401300ÿÿÿÿ
[ 6.970319] cdc_ncm 4-4:2.0: MAC-Адрес: 00:e0:4c:68:10:e6
[ 6.970325] cdc_ncm 4-4:2.0: установка rx_max = 16384
[ 6.970356] cdc_ncm 4-4:2.0: установка tx_max = 16384
[ 6.984099] cdc_ncm 4-4:2.0 eth0: зарегистрирован 'cdc_ncm' на usb-0000:0a:00.3-4, CDC NCM (NO ZLP), 00:e0:4c:68:10:e6
# lsusb
Bus 004 Device 002: ID 0bda:8156 Realtek Semiconductor Corp. USB 10/100/1G/2.5G LAN
Bus 002 Device 002: ID 0bda:8156 Realtek Semiconductor Corp. USB 10/100/1G/2.5G LAN
На рассматриваемой машине запущен гипервизор Linux (Proxmox), и два сетевых интерфейса распознаются как enx00e04c680152 и enx00e04c6810e6 (я полагаю, что udev/systemd сгенерировали имена на основе их MAC-адресов). Чтобы объединить два интерфейса, в Proxmox я использовал следующие настройки:
Linux Bond
* Имя: bond0
* Автозапуск: Да
* Слоты: enx00e04c680152 enx00e04c6810e6
* Режим: LACP (802.3ad)
* Политика хэширования: layer3+4
На коммутаторе я создал группу портов с активным режимом LACP и выбрал два порта 2,5 Гбит/с, которые были подключены к серверу. Linux также сообщает, что обе карты обнаружены и объединены с его собственной точки зрения:
# ip link | grep enx
3: enx00e04c6810e6: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP mode DEFAULT group default qlen 1000
4: enx00e04c680152: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP mode DEFAULT group default qlen 1000
К сожалению, по какой-то причине Linux не может установить соединение LACP с коммутатором, каким бы образом это ни делалось, ядро Linux продолжает сообщать мне: “Нет ответа 802.3ad от партнера по линку для любых адаптеров в объединении”.
# dmesg
[ 1004.491253] bond0: Предупреждение: Нет 802.3ad ответа от партнера по линку для любых адаптеров в объединении
[ 1034.527234] bond0: Предупреждение: Нет 802.3ad ответа от партнера по линку для любых адаптеров в объединении
[ 1064.547217] bond0: Предупреждение: Нет 802.3ad ответа от партнера по линку для любых адаптеров в объединении
Файл состояния /proc/net/bonding/bond0
показывает, что IEEE 802.3ad активен, но соединение не было успешно установлено. Это можно увидеть по тому, что “Aggregator ID” для обоих NIC различен и что оба они вошли в “чурнед” состояние, что, по сути, означает, что соединение не удалось.
# cat /proc/net/bonding/bond0
Драйвер агрегации Ethernet Channel Bonding: v6.1.15-1-pve
Режим агрегации: IEEE 802.3ad Динамическая агрегация связи
Политика хэширования передачи: layer3+4 (1)
Статус MII: up
Интервал опроса MII (мс): 100
Время задержки (мс): 0
Время задержки отключения (мс): 0
Время задержки уведомления партнера (мс): 0
Информация 802.3ad
LACP активно: включен
Скорость LACP: медленная
Минимальные ссылки: 0
Политика выбора агрегатора (ad_select): стабильная
Приоритет системы: 65535
MAC-адрес системы: 8a:f5:1c:f4:8b:70
Информация активного агрегатора:
ID агрегатора: 1
Количество портов: 1
Ключ участника: 10
Ключ партнера: 1
MAC-адрес партнера: 00:00:00:00:00:00
Рабочий интерфейс: enx00e04c680152
Статус MII: up
Скорость: 2500 Мбит/с
Дуплекс: половина
Количество неудач соединения: 0
Постоянный HW addr: 00:e0:4c:68:01:52
Идентификатор очереди слейва: 0
ID агрегатора: 1
Состояние участника: none
Состояние партнера: churned
Количество частичностей участника: 0
Количество частичностей партнера: 1
подробности pdu актера lacp:
приоритет системы: 65535
MAC-адрес системы: 8a:f5:1c:f4:8b:70
порт ключ: 10
приоритет порта: 255
номер порта: 1
состояние порта: 77
подробности партнера pdu lacp:
приоритет системы: 65535
MAC-адрес системы: 00:00:00:00:00:00
операционный ключ: 1
приоритет порта: 255
номер порта: 1
состояние порта: 1
Рабочий интерфейс: enx00e04c6810e6
Статус MII: up
Скорость: 2500 Мбит/с
Дуплекс: половина
Количество неудач соединения: 0
Постоянный HW addr: 00:e0:4c:68:10:e6
Идентификатор очереди слейва: 0
ID агрегатора: 2
Состояние участника: churned
Состояние партнера: churned
Количество частичностей участника: 1
Количество частичностей партнера: 1
подробности pdu актера lacp:
приоритет системы: 65535
MAC-адрес системы: 8a:f5:1c:f4:8b:70
порт ключ: 10
приоритет порта: 255
номер порта: 2
состояние порта: 69
подробности партнера pdu lacp:
приоритет системы: 65535
MAC-адрес системы: 00:00:00:00:00:00
операционный ключ: 1
приоритет порта: 255
номер порта: 1
состояние порта: 1
Итог
Эти сетевые адаптеры должны работать в специфическом для вендора режиме (bConfigurationValue: 1) и контролироваться драйвером Linux r8152
. Режим по умолчанию (bConfigurationValue: 2) с общим драйвером cdc_ncm
имеет ограниченную функциональность, поэтому не все функции будут работать правильно.
Анализ
После нескольких дней устранения неполадок я в конечном итоге определил коренную причину. Указание на это — информация о железе, сообщаемая ethtool
:
# ethtool enx00e04c6810e6
Настройки для enx00e04c6810e6:
Поддерживаемые порты: [ ]
Поддерживаемые режимы связи: Не сообщается
Поддержка использования фреймов паузы: Нет
Поддержка автоматической настройки: Нет
Поддерживаемые режимы FEC: Не сообщается
Рекламируемые режимы связи: Не сообщается
Рекламируемое использование фреймов паузы: Нет
Рекламируемая автоматическая настройка: Нет
Рекламируемые режимы FEC: Не сообщаются
Скорость: 2500Mb/s
Дуплекс: Половина
Автоматическая настройка: отключена
Порт: Перекрученная пара
PHYAD: 0
Приемник: внутренний
MDI-X: Неизвестно
Текущий уровень сообщения: 0x00000007 (7)
drv probe link
Связь обнаружена: да
Заметьте, насколько важна информация о железе, такая как автоматическая настройка или поддерживаемые режимы связи, которые недоступны из драйвера устройства. Также обратите внимание, что драйвер утверждает, что адаптер работает на 2,5 Гбит/с в половинном дуплексе, что необычно. Я подозреваю, что модуль bonding
в Linux не работает из-за неполной информации о железе или поддержки функций.
При дальнейших исследованиях я обнаружил, что по умолчанию эти USB-адаптеры Realtek на 2,5 Гбит/с работали в стандартном режиме USB CDC-NCM. Это стандартный режим, определенный USB, но доступны только ограниченные функции. Чтобы включить полные аппаратные функции этих адаптеров, их необходимо переключить из стандартного режима (bConfigurationValue: 2) в специфицированный производителем режим (bConfigurationValue: 1). Текущий режим можно проверить, просматривая файл bConfigurationValue
в /sys/bus/usb/devices/
.
Сначала изучите USB-аппаратное обеспечение через lsusb
и lsusb -t
:
# lsusb
Bus 004 Device 002: ID 0bda:8156 Realtek Semiconductor Corp. USB 10/100/1G/2.5G LAN
Bus 002 Device 002: ID 0bda:8156 Realtek Semiconductor Corp. USB 10/100/1G/2.5G LAN
# lsusb -t
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
|__ Port 4: Dev 2, If 0, Class=Communications, Driver=cdc_ncm, 5000M
|__ Port 4: Dev 2, If 1, Class=CDC Data, Driver=cdc_ncm, 5000M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/3p, 10000M
|__ Port 2: Dev 2, If 0, Class=Communications, Driver=cdc_ncm, 5000M
|__ Port 2: Dev 2, If 1, Class=CDC Data, Driver=cdc_ncm, 5000M
Можно увидеть, что используется драйвер cdc_ncm
.
Затем убедитесь, что вы смотрите на правильное устройство в /sys/bus/usb/devices
(вам нужно будет настроить /2-2/
и 4-4
в соответствии с выводом lsusb -t
), проверив содержание manufacturer
сначала, оно должно быть Realtek
. Затем проверьте bConfigurationValue
в той же директории.
# cat /sys/bus/usb/devices/2-2/manufacturer
Realtek
# cat /sys/bus/usb/devices/2-2/bConfigurationValue
2
# cat /sys/bus/usb/devices/4-4/manufacturer
Realtek
# cat /sys/bus/usb/devices/4-4/bConfigurationValue
2
bConfigurationValue
равен 2
, что означает, что он работает в режиме CDC_NCM. Чтобы вручную переключить режим для отладки, выполните:
# echo 1 > /sys/bus/usb/devices/2-2/bConfigurationValue
# echo 1 > /sys/bus/usb/devices/4-4/bConfigurationValue
После переключения Linux начнет управлять ими с помощью драйвера r8152
, а не общего драйвера cdc_ncm
. В dmesg
можно увидеть:
[ 8439.270745] r8152 2-2:1.0: load rtl8156b-2 v1 04/15/21 успешно
[ 8439.397031] r8152 2-2:1.0 (безымянный сетевой_устройство) (не инициализировано): netif_napi_add_weight() вызван с весом 256
[ 8439.397202] r8152 2-2:1.0 eth0: v1.12.13
[ 8439.397220] usbcore: зарегистрирован новый интерфейсный драйвер r8152
[ 8439.399436] r8152 2-2:1.0 enx00e04c680152: переименован из eth0
[ 8505.003557] r8152 4-4:1.0: load rtl8156b-2 v1 04/15/21 успешно
[ 8505.044832] r8152 4-4:1.0 eth0: v1.12.13
[ 8505.047901] r8152 4-4:1.0 enx00e04c6810e6: переименован из eth0
lsusb -t
также будет сообщать, что r8152
теперь отвечает за сетевые адаптеры.
# lsusb -t
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 10000M
|__ Port 4: Dev 2, If 0, Class=Vendor Specific Class, Driver=r8152, 5000M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/3p, 10000M
|__ Port 2: Dev 2, If 0, Class=Vendor Specific Class, Driver=r8152, 5000M
Если адаптеры могут быть распознаны r8152, создайте правило udev, чтобы применить его автоматически (учтите, что на данный момент все адаптеры были отключены от режима агрегации, поэтому агрегация не будет работать, если вы не воссоздадите ее вручную, поэтому проще просто добавить правило udev и перезагрузить).
Решение
Сначала найдите VID и PID сетевого адаптера, которые могут различаться в зависимости от бренда.
# lsusb
Bus 004 Device 002: ID 0bda:8156 Realtek Semiconductor Corp. USB 10/100/1G/2.5G LAN
Bus 002 Device 002: ID 0bda:8156 Realtek Semiconductor Corp. USB 10/100/1G/2.5G LAN
Затем создайте следующее правило udev:
ACTION=="add", SUBSYSTEMS=="usb", ATTR{idVendor}=="0bda", ATTR{idProduct}=="8156", ATTR{bConfigurationValue}="1"
Сохраните правило как файл, например /etc/udev/rules.d/90-usb-r8152-ethernet.rules
, и перезагрузите систему. Учтите, что вам нужно настроить idVendor
и idProduct
, чтобы они соответствовали VID и PID, указанным в lsusb
.
После переключения ethtool
сможет получить информацию об оборудовании адаптера:
# ethtool enx00e04c680152
Настройки для enx00e04c680152:
Поддерживаемые порты: [ TP MII ]
Поддерживаемые режимы связи: 10baseT/Половина 10baseT/Полный
100baseT/Половина 100baseT/Полный
1000baseT/Половина 1000baseT/Полный
2500baseT/Полный
Поддержка использования фреймов паузы: Нет
Поддержка автоматической настройки: Да
Поддерживаемые режимы FEC: Не сообщается
Рекламируемые режимы связи: 10baseT/Половина 10baseT/Полный
100baseT/Половина 100baseT/Полный
1000baseT/Полный
2500baseT/Полный
Рекламируемое использование фреймов паузы: Нет
Рекламируемая автоматическая настройка: Да
Рекламируемые режимы FEC: Не сообщаются
Режимы связи, рекламируемые партнером: 10baseT/Половина 10baseT/Полный
100baseT/Половина 100baseT/Полный
1000baseT/Полный
2500baseT/Полный
Рекламируемое использование фреймов паузы партнером: Нет
Рекламируемая автоматическая настройка партнером: Да
Рекламируемые режимы FEC партнером: Не сообщается
Скорость: 2500Mb/s
Дуплекс: Полный
Автоматическая настройка: включена
Порт: MII
PHYAD: 32
Приемник: внутренний
Поддержка Wake-on: pumbg
Wake-on: g
Текущий уровень сообщения: 0x00007fff (32767)
drv probe link timer ifdown ifup rx_err tx_err tx_queued intr tx_done rx_status pktdata hw wol
Связь обнаружена: да
LACP также может быть установлен:
# cat /proc/net/bonding/bond0
Драйвер агрегации Ethernet Channel Bonding: v6.1.15-1-pve
Режим агрегации: IEEE 802.3ad Динамическая агрегация связи
Политика хэширования передачи: layer3+4 (1)
Статус MII: up
Интервал опроса MII (мс): 100
Время задержки (мс): 0
Время задержки отключения (мс): 0
Время задержки уведомления партнера (мс): 0
Информация 802.3ad
LACP активно: включено
Скорость LACP: медленная
Минимальные ссылки: 0
Политика выбора агрегатора (ad_select): стабильная
Приоритет системы: 65535
MAC-адрес системы: 8a:f5:1c:f4:8b:70
Информация активного агрегатора:
ID агрегатора: 1
Количество портов: 2
Ключ участника: 11
Ключ партнера: 1
MAC-адрес партнера: 8c:1f:64:9a:c2:5f
Рабочий интерфейс: enx00e04c680152
Статус MII: up
Скорость: 2500 Мбит/с
Дуплекс: полный
Количество неудач соединения: 0
Постоянный HW addr: 00:e0:4c:68:01:52
Идентификатор очереди слейва: 0
ID агрегатора: 1
Состояние участника: monitoring
Состояние партнера: monitoring
Количество частичностей участника: 0
Количество частичностей партнера: 1
подробности pdu актера lacp:
приоритет системы: 65535
MAC-адрес системы: 8a:f5:1c:f4:8b:70
порт ключ: 11
приоритет порта: 255
номер порта: 1
состояние порта: 61
подробности партнера pdu lacp:
приоритет системы: 65535
MAC-адрес системы: 8c:1f:64:9a:c2:5f
операционный ключ: 1
приоритет порта: 32768
номер порта: 2
состояние порта: 61
Рабочий интерфейс: enx00e04c6810e6
Статус MII: up
Скорость: 2500 Мбит/с
Дуплекс: полный
Количество неудач соединения: 0
Постоянный HW addr: 00:e0:4c:68:10:e6
Идентификатор очереди слейва: 0
ID агрегатора: 1
Состояние участника: monitoring
Состояние партнера: monitoring
Количество частичностей участника: 1
Количество частичностей партнера: 1
подробности pdu актера lacp:
приоритет системы: 65535
MAC-адрес системы: 8a:f5:1c:f4:8b:70
порт ключ: 11
приоритет порта: 255
номер порта: 2
состояние порта: 61
подробности партнера pdu lacp:
приоритет системы: 65535
MAC-адрес системы: 8c:1f:64:9a:c2:5f
операционный ключ: 1
приоритет порта: 32768
номер порта: 3
состояние порта: 61
Ответ или решение
Ответ на вопрос: Проблема с агрегированием двух адаптеров Ethernet Realtek RTL8156 через LACP на Linux
Введение
При использовании двух адаптеров Ethernet Realtek RTL8156 на 2,5 Гбит/с через USB для достижения более высокой скорости сетевого соединения с использованием агрегирования каналов (LACP), вы столкнулись с проблемой установки LACP-соединения. Linux не может установить LACP-соединение и сообщает об ошибке "No 802.3ad response from the link partner for any adapters in the bond".
Анализ проблемы
Причина данной проблемы заключается в том, что адаптеры работают в стандартном режиме USB CDC-NCM, что ограничивает функциональность устройства. В этом режиме не поддерживаются все функции, необходимые для корректного агрегирования каналов через LACP. Вам нужно переключить адаптеры на специальный режим работы с использованием драйвера r8152
, который обеспечит полную функциональность адаптеров.
Шаги для решения проблемы
-
Проверка текущего режима устройства
Убедитесь, что адаптеры работают в режиме CDC-NCM. Это можно сделать с помощью команд:lsusb lsusb -t
Убедитесь, что вы видите драйвер
cdc_ncm
. Для дальнейшего анализа проверьте файлbConfigurationValue
:cat /sys/bus/usb/devices/2-2/bConfigurationValue cat /sys/bus/usb/devices/4-4/bConfigurationValue
Если значение равно
2
, это указывает на то, что адаптеры работают в режиме CDC-NCM. -
Переключение режима устройства
Чтобы переключить адаптеры на специальный режим с использованием драйвераr8152
, выполните следующие команды:echo 1 > /sys/bus/usb/devices/2-2/bConfigurationValue echo 1 > /sys/bus/usb/devices/4-4/bConfigurationValue
После переключения значение
bConfigurationValue
должно измениться на1
, и вdmesg
вы должны увидеть сообщения о загрузке драйвераr8152
для обоих адаптеров. -
Создание правила udev для автоматизации переключения
Для того чтобы при каждом запуске системы адаптеры автоматически использовали драйверr8152
, создайте правило udev. Для этого откройте текстовый редактор и создайте файл, например,/etc/udev/rules.d/90-usb-r8152-ethernet.rules
с следующим содержанием:ACTION=="add", SUBSYSTEMS=="usb", ATTR{idVendor}=="0bda", ATTR{idProduct}=="8156", ATTR{bConfigurationValue}="1"
Не забудьте перезагрузить систему или перезапустить udev, чтобы активировать новое правило.
-
Проверка работы адаптеров и LACP
После выполненных шагов, проверьте состояние адаптеров с помощью команды:ethtool enx00e04c680152
Проверьте, отображает ли инструмент информацию о поддерживаемых режимах и обладает ли он полной функциональностью. Затем вы снова можете создать агрегированный интерфейс
bond0
в Proxmox, а в «/proc/net/bonding/bond0» должны быть отображены корректные настройки и состояния для обоих адаптеров.
Заключение
Следуя указанным шагам, вы должны быть в состоянии решить проблему с невозможностью установления LACP-соединения между адаптерами Realtek RTL8156. Если все сделано правильно, устройства будут работать в полнодуплексном режиме и будут правильно отчетливо функционировать в связке через LACP, что повысит пропускную способность вашей сети.