Для соединения пары домашних серверов мне захотелось выйти за пределы привычных 1Гбит/с и при этом сильно не переплачивать за сетевое оборудование. На известном сайте были приобретены недорогие серверные адаптеры HP 764285-B21, по сути являющиеся ОЕМ аналогами Mellanox ConnectX-3 Pro, и QFSP+ медный кабель (DAC). Эти двухпортовые адаптеры могут работать на скоростях 10 и 40 Гбит/с в режиме Ethernet портов и до 56 Гбит/с в режиме InfiniBand. Низкая цена на вторичном рынке обусловлена нестандартным интерфейсом HP FlexibleLOM, разъем которого хотя и похож на стандартный PCIe x8, но имеет иное расположение линий PCIe и поэтому может использоваться только в совместимых серверах HP. Тем не менее выход есть - Tobias Schramm спроектировал специальный адаптер для установки карт HP FlexibleLOM в обычный слот PCIe. Я заказал платы адаптера на jlcpcb.com и 8х коннекторы на алиэкспресс. После монтажа коннектора на плату адаптера и установки всей конструкции в слот она успешно определилась как устройство на шине PCIe:
lspci | grep Mellanox
23:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
Однако после установки Ethernet драйвера Mellanox (я использовал Ubuntu 16.04 и 20.04, предполагаю для других версий и для Windows порядок действий будет аналогичен) Ethernet интерфейсы не появились в системе. Это означало, что драйвер по какой-либо причине не смог распознать адаптер и скорее всего потребуется перешивка. Изучая вывод dmesg можно примерно установить причину ошибки, в моём случае в прошивке адаптеров была включена опция SR-IOV, несовместимая с используемой материнской платой.
Для перешивки адаптера скачиваем и распаковываем Mellanox firmware tools для вашей ОС. Установку производим с ключом --oem (sudo ./install --oem), это позволит сразу установить дополнительные утилиты для сборки новой прошивки.
После установки MFT определяем текущую версию прошивки:
mlxfwmanager -d 23:00.0
Querying Mellanox devices firmware ...
Device #1:
----------
Device Type: ConnectX3Pro
Part Number: 764285-B21_Ax
Description: HP InfiniBand FDR/Ethernet 10Gb/40Gb 2-port 544+FLR-QSFP Adapter
PSID: HP_1380110017
PCI Device Name: 23:00.0
Port1 MAC: 24be05c557c1
Port2 MAC: 24be05c557c2
Versions: Current Available
FW 2.42.5700 N/A
Status: No matching image found
...и делаем бэкап текущей прошивки и конфигурации адаптера:
flint -d 23:00.0 ri original_firmware.bin
flint -d 23:00.0 dc original_config.ini
Изучив раздел [HCA] файла конфигурации находим требуемый параметр sriov_en и, предварительно скопировав конфигурацию в новый файл new_config.ini, выставляем ему нулевое значение. Также проверяем, что eth_xfi_en равен единице - это позволит активировать Ethernet режим портов:
[HCA]
...
eth_xfi_en = 1
sriov_en = 0
...
Далее нам потребуется исходный файл прошивки .mlx для нашего чипсета (в моём случае это ConnectX-3 Pro), как выяснилось раньше их можно было свободно скачать с сайта Mellanox, однако сейчас лавочку прикрыли, оставив только готовые бинарные прошивки, которые, к сожалению, нам не подходят. В результате поисков мне удалось найти прямую ссылку на скачивание исходной прошивки предыдущей версии 2.36:
wget http://www.mellanox.com/downloads/firmware/ConnectX3Pro-rel-2_36_5000-web.tgz
Распаковываем архив и извлекаем искомый fw-ConnectX3Pro-rel.mlx, затем собираем новую прошивку с помощью mlxburn:
mlxburn -fw fw-ConnectX3Pro-rel.mlx -conf new_config.ini -wrimage new_firmware.bin
На всякий случай проверяем новую прошивку:
flint -i new_firmware.bin verify
FS2 failsafe image. Start address: 0x0. Chunk size 0x80000:
NOTE: The addresses below are contiguous logical addresses. Physical addresses on
flash may be different, based on the image start address and chunk size
/0x00000038-0x0000065b (0x000624)/ (BOOT2) - OK
/0x0000065c-0x00002b9b (0x002540)/ (BOOT2) - OK
/0x00002b9c-0x00003b27 (0x000f8c)/ (Configuration) - OK
/0x00003b28-0x00003b6b (0x000044)/ (GUID) - OK
/0x00003b6c-0x00003cc3 (0x000158)/ (Image Info) - OK
/0x00003cc4-0x00010fc3 (0x00d300)/ (DDR) - OK
/0x00010fc4-0x00012027 (0x001064)/ (DDR) - OK
/0x00012028-0x000123f7 (0x0003d0)/ (DDR) - OK
/0x000123f8-0x0005008b (0x03dc94)/ (DDR) - OK
/0x0005008c-0x00054f0f (0x004e84)/ (DDR) - OK
/0x00054f10-0x00059103 (0x0041f4)/ (DDR) - OK
/0x00059104-0x00059bfb (0x000af8)/ (DDR) - OK
/0x00059bfc-0x0008915f (0x02f564)/ (DDR) - OK
/0x00089160-0x0008cd0b (0x003bac)/ (DDR) - OK
/0x0008cd0c-0x000a1d7f (0x015074)/ (DDR) - OK
/0x000a1d80-0x000a1e87 (0x000108)/ (DDR) - OK
/0x000a1e88-0x000a6a8b (0x004c04)/ (DDR) - OK
/0x000a6a8c-0x000a827b (0x0017f0)/ (Configuration) - OK
/0x000a827c-0x000a82ef (0x000074)/ (Jump addresses) - OK
/0x000a82f0-0x000a8e03 (0x000b14)/ (FW Configuration) - OK
/0x00000000-0x000a8e03 (0x0a8e04)/ (Full Image) - OK
-I- FW image verification succeeded. Image is bootable.
...и затем прошиваем в адаптер:
flint -d 23:00.0 -i new_firmware.bin -allow_psid_change burn
Current FW version on flash: 2.42.5700
New FW version: 2.36.5000
Note: The new FW version is older than the current FW version on flash.
Do you want to continue ? (y/n) [n] : y
Burning FS2 FW image without signatures - OK
Restoring signature - OK
После перешивки адаптера обязательно перезагружаем сервер.
В моём случае после всех вышеперечисленных манипуляций драйвер mlx4_core успешно распознал адаптер и сетевые интерфейсы появились в системе. Для ускорения процесса загрузки я дополнительно отключил boot options:
mlxconfig -d 23:00.0 set BOOT_OPTION_ROM_EN_P1=false
mlxconfig -d 23:00.0 set BOOT_OPTION_ROM_EN_P2=false
mlxconfig -d 23:00.0 set LEGACY_BOOT_PROTOCOL_P1=0
mlxconfig -d 23:00.0 set LEGACY_BOOT_PROTOCOL_P2=0
...и удалил BootROM:
flint -d 23:00.0 --allow_rom_change drom
Кроме того, если не планируется использование интерфейсов InfiniBand, можно принудительно перевести оба порта в режим Ethernet:
mlxconfig -d 23:00.0 set LINK_TYPE_P1=2
mlxconfig -d 23:00.0 set LINK_TYPE_P2=2