Estou no processo de atualizar minha Ethernet para 10 Gbps para acelerar a conectividade da minha rede local. Infelizmente, uma máquina na minha rede ficou sem slots PCIe, então um adaptador PCIe nativo de 10 GbE não é uma opção. Um adaptador USB é a única alternativa viável - como switches Ethernet de 5 Gbps e adaptadores USB são difíceis de encontrar e caros, a decisão foi tomada para executar o servidor com dois adaptadores Ethernet de 2,5 Gbps para USB 3 baseados no chipset Realtek RTL8156, que está prontamente disponível. Então, eles estão juntos no nível Ethernet usando agregação de link em um LAG/LACP e conectados a um switch de 2,5/10 Gbps.
Esses adaptadores USB podem ser reconhecidos pelo Linux como os seguintes. Eu também determinei de antemão que ambos os adaptadores podem operar independentemente a 2,5 Gbps atribuindo um endereço IP a cada NIC e executando um teste iperf3.
$ dmesg
[ 5.118103] usb 4-4: new SuperSpeed USB device number 2 using xhci_hcd
[ 5.138434] usb 4-4: New USB device found, idVendor=0bda, idProduct=8156, bcdDevice=31.04
[ 5.138436] usb 4-4: New USB device strings: Mfr=1, Product=2, SerialNumber=6
[ 5.138438] usb 4-4: Product: USB 10/100/1G/2.5G LAN
[ 5.138439] usb 4-4: Manufacturer: Realtek
[ 5.138440] usb 4-4: SerialNumber: 401300ÿÿÿÿ
[ 6.970319] cdc_ncm 4-4:2.0: MAC-Address: 00:e0:4c:68:10:e6
[ 6.970325] cdc_ncm 4-4:2.0: setting rx_max = 16384
[ 6.970356] cdc_ncm 4-4:2.0: setting tx_max = 16384
[ 6.984099] cdc_ncm 4-4:2.0 eth0: register 'cdc_ncm' at 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
A máquina em questão está executando um hipervisor Linux (Proxmox), e duas interfaces de rede são reconhecidas como enx00e04c680152 e enx00e04c6810e6 (acredito que udev/systemd gerou os nomes com base em seus endereços MAC). Para unir duas interfaces, no Proxmox usei as seguintes configurações:
Linux Bond
* Name: bond0
* Autostart: Yes
* Slaves: enx00e04c680152 enx00e04c6810e6
* Mode: LACP (802.3ad)
* Hash policy: layer3+4
No switch, criei um Port Channel Group com LACP habilitado no modo Ativo e selecionei duas portas de 2,5 Gbps que estavam conectadas ao servidor. O Linux também relata que ambas as placas são detectadas e vinculadas de sua própria perspectiva:
# 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
Infelizmente, por algum motivo, o Linux não consegue estabelecer um link LACP com o switch, não importa o que aconteça. O kernel do Linux continua me dizendo que "Nenhuma resposta 802.3ad do parceiro de link para nenhum adaptador no vínculo".
# dmesg
[ 1004.491253] bond0: Warning: No 802.3ad response from the link partner for any adapters in the bond
[ 1034.527234] bond0: Warning: No 802.3ad response from the link partner for any adapters in the bond
[ 1064.547217] bond0: Warning: No 802.3ad response from the link partner for any adapters in the bond
O arquivo de status /proc/net/bonding/bond0
mostra que o IEEE 802.3ad está ativo, mas um link não foi estabelecido com sucesso. Isso pode ser visto pelo fato de que o "ID do agregador" para ambas as NICs são diferentes, e que ambas entraram no estado "churned", o que significa essencialmente que o link falhou,
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v6.1.15-1-pve
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer3+4 (1)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Peer Notification Delay (ms): 0
802.3ad info
LACP active: on
LACP rate: slow
Min links: 0
Aggregator selection policy (ad_select): stable
System priority: 65535
System MAC address: 8a:f5:1c:f4:8b:70
Active Aggregator Info:
Aggregator ID: 1
Number of ports: 1
Actor Key: 10
Partner Key: 1
Partner Mac Address: 00:00:00:00:00:00
Slave Interface: enx00e04c680152
MII Status: up
Speed: 2500 Mbps
Duplex: half
Link Failure Count: 0
Permanent HW addr: 00:e0:4c:68:01:52
Slave queue ID: 0
Aggregator ID: 1
Actor Churn State: none
Partner Churn State: churned
Actor Churned Count: 0
Partner Churned Count: 1
details actor lacp pdu:
system priority: 65535
system mac address: 8a:f5:1c:f4:8b:70
port key: 10
port priority: 255
port number: 1
port state: 77
details partner lacp pdu:
system priority: 65535
system mac address: 00:00:00:00:00:00
oper key: 1
port priority: 255
port number: 1
port state: 1
Slave Interface: enx00e04c6810e6
MII Status: up
Speed: 2500 Mbps
Duplex: half
Link Failure Count: 0
Permanent HW addr: 00:e0:4c:68:10:e6
Slave queue ID: 0
Aggregator ID: 2
Actor Churn State: churned
Partner Churn State: churned
Actor Churned Count: 1
Partner Churned Count: 1
details actor lacp pdu:
system priority: 65535
system mac address: 8a:f5:1c:f4:8b:70
port key: 10
port priority: 255
port number: 2
port state: 69
details partner lacp pdu:
system priority: 65535
system mac address: 00:00:00:00:00:00
oper key: 1
port priority: 255
port number: 1
port state: 1
Resumo
Esses adaptadores de rede devem ser alternados para o modo específico do fornecedor (bConfigurationValue: 1) e controlados pelo driver Linux
r8152
. O modo padrão (bConfigurationValue: 2) com ocdc_ncm
driver genérico tem funcionalidade limitada, então nem todos os recursos funcionarão corretamente.Análise
Após vários dias de solução de problemas, finalmente determinei a causa raiz. A pista é a informação de hardware relatada por
ethtool
:Observe como informações importantes de hardware, como autonegociação ou modos de link suportados, não estão disponíveis no driver do dispositivo. Observe também como o driver afirma que o adaptador está sendo executado em half-duplex de 2,5 Gbps, o que é incomum. Suspeito que
bonding
o módulo do Linux não funcione devido a informações de hardware incompletas ou suporte a recursos.Após investigação mais aprofundada, descobri que, por padrão, esses adaptadores USB Realtek de 2,5 Gbps estavam sendo executados no modo genérico USB CDC-NCM. Este é um modo padrão definido pelo USB, mas apenas funcionalidade limitada está disponível. Para habilitar todos os recursos de hardware desses adaptadores, é preciso alterná-los do modo padrão (bConfigurationValue: 2) para o modo específico do fornecedor (bConfigurationValue: 1). O modo atual pode ser verificado examinando o arquivo
bConfigurationValue
em/sys/bus/usb/devices/
.Primeiro, examine o hardware USB via
lsusb
elsusb -t
:Pode-se ver que o driver
cdc_ncm
é usado.Em seguida, certifique-se de que está olhando para o dispositivo correto em
/sys/bus/usb/devices
(você precisa ajustar/2-2/
e4-4
de acordo com a saída delsusb -t
) verificando o conteúdo demanufacturer
primeiro, deve serRealtek
. Em seguida, examine obConfigurationValue
no mesmo diretório.O
bConfigurationValue
is2
, que significa que está no modo CDC_NCM. Para alternar manualmente o modo para depuração, execute:Após a troca, o Linux começará a controlá-los usando o
r8152
driver, em vez docdc_ncm
driver genérico. Emdmesg
, pode-se ver:lsusb -t
também informará quer8152
agora está encarregado dos adaptadores de rede.Se os adaptadores puderem ser reconhecidos pelo r8152, crie uma regra udev para aplicá-la automaticamente (observe que, neste ponto, todos os adaptadores foram desconectados do modo de vinculação, portanto, a vinculação não funcionará a menos que você a recrie manualmente, então é mais fácil apenas adicionar uma regra udev e reinicializar).
Solução
Primeiro, encontre o VID e o PID do adaptador de rede, que podem variar dependendo da marca.
Em seguida, crie a seguinte regra udev:
Salve a regra como um arquivo como
/etc/udev/rules.d/90-usb-r8152-ethernet.rules
, e reinicia o sistema. Note que deve-se ajustar oidVendor
eidProduct
aqui para corresponder ao VID e PID listados porlsusb
.Após a troca,
ethtool
é possível obter informações de hardware sobre o adaptador:O LACP também pode ser estabelecido: