Установка драйверов Mellanox ConnectX-4 Lx

Исходные данные

product: MT27710 Family [ConnectX-4 Lx]

Адаптер, который выбрал для прошивки: enp216 расположен на шине pci@0000:d8:00.0 Важно понимать, что мы будем обновлять драйвер адаптера, на котором сейчас НЕ установлено наше ssh-соединение - иными словами - на свободном. Как вариант, можно производить обновление через web-панель IPMI.

Вывод команды lshw -C network следующий:

*-network:1
    description: Ethernet interface
    product: MT27710 Family [ConnectX-4 Lx]
    vendor: Mellanox Technologies
    physical id: 0.1
    bus info: pci@0000:86:00.1
    logical name: enp134s0f1
    version: 00
    serial: 98:03:9b:62:77:c9
    width: 64 bits
    clock: 33MHz
    capabilities: pciexpress vpd msix pm bus_master cap_list rom ethernet physical tp autonegotiation
    configuration: autonegotiation=on broadcast=yes driver=mlx5_core driverversion=5.0-0 firmware=14.23.1020 (MT_2420110004) latency=0 link=no multicast=yes port=twisted pair
    resources: iomemory:385f0-385ef irq:126 memory:385ffa000000-385ffbffffff memory:f0d00000-f0dfffff memory:385ffe000000-385ffe7fffff

 *-network:0
    description: Ethernet interface
    product: MT27710 Family [ConnectX-4 Lx]
    vendor: Mellanox Technologies
    physical id: 0
    **bus info: pci@0000:d8:00.0**
    logical name: **enp216s0f0**
    version: 00
    serial: 98:03:9b:62:35:38
    size: 10Gbit/s
    width: 64 bits
    clock: 33MHz
    capabilities: pciexpress vpd msix pm bus_master cap_list rom ethernet physical fibre autonegotiation
    configuration: autonegotiation=on broadcast=yes driver=mlx5_core driverversion=5.0-0 duplex=full firmware=14.23.1020 (MT_2420110004) latency=0 link=yes multicast=yes port=fibre speed=10Gbit/s
    resources: iomemory:387f0-387ef irq:144 memory:387ffc000000-387ffdffffff memory:fbe00000-fbefffff memory:387ffe800000-387ffeffffff

Firmware

Видим версию firmware: 14.23.1020 (MT_2420110004): driverversion=5.0-0
Версия модуля mlx5_core:

# lsmod | grep mlx5_core
mlx5_core       831488 0
mlxfw         24576 1 mlx5_core
pci_hyperv_intf    16384 1 mlx5_core
tls          77824 1 mlx5_core

Modinfo

Вывод команды modinfo:

# modinfo mlx5_core
filename:    /lib/modules/5.4.17-2011.6.2.el7uek.x86_64/kernel/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko.xz
version:    5.0-0
license:    Dual BSD/GPL
description:  Mellanox 5th generation network adapters (ConnectX series) core driver
author:     Eli Cohen <eli@mellanox.com>
srcversion:   9807DEDCCDAB6BCCE0C5289
alias:     pci:v000015B3d0000A2D6sv*sd*bc*sc*i*
alias:     pci:v000015B3d0000A2D3sv*sd*bc*sc*i*
alias:     pci:v000015B3d0000A2D2sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001021sv*sd*bc*sc*i*
alias:     pci:v000015B3d0000101Fsv*sd*bc*sc*i*
alias:     pci:v000015B3d0000101Esv*sd*bc*sc*i*
alias:     pci:v000015B3d0000101Dsv*sd*bc*sc*i*
alias:      pci:v000015B3d0000101Csv*sd*bc*sc*i*
alias:     pci:v000015B3d0000101Bsv*sd*bc*sc*i*
alias:     pci:v000015B3d0000101Asv*sd*bc*sc*i*
alias:     pci:v000015B3d00001019sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001018sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001017sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001016sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001015sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001014sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001013sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001012sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001011sv*sd*bc*sc*i*
depends:    tls,pci-hyperv-intf,mlxfw
retpoline:   Y
intree:     Y
name:      mlx5_core
vermagic:    5.4.17-2011.6.2.el7uek.x86_64 SMP mod_unload modversions
parm:      debug_mask:debug mask: 1 = dump cmd data, 2 = dump cmd exec time, 3 = both. Default=0 (uint)
parm:      prof_sel:profile selector. Valid range 0 - 2 (uint)

Lspci

Вывод команды lspci

lspci | grep Mellanox
0000:18:00.0 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
0000:18:00.1 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
0000:86:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
0000:86:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
0000:d8:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
0000:d8:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]

Подготовка к установке

Пакеты, которые надо установить для сборки:

yum install libdtrace-ctf pciutils usbutils
yum install gcc make patch gcc-c++ redhat-rpm-config rpm-build
yum install python-devel python-docutils valgrind-devel libdb-devel glib2-devel lsof zlib-devel flex bison numactl-devel libmnl-devel iptables-devel openssl-devel libselinux-devel cmake libtool elfutils-devel libnl3-devel
rpm -i kernel-uek-devel-5.4.17-2011.6.2.el7uek.x86_64.rpm

Установка пакета systemd-devel вызвала трудности:

yum install systemd-devel

Error: Package: systemd-devel-219-62.el7_6.5.x86_64 (updates)
      Requires: systemd = 219-62.el7_6.5
      Removing: systemd-219-62.el7.x86_64 (@anaconda)
        systemd = 219-62.el7
      Updated By: systemd-219-78.el7.x86_64 (salt)
        systemd = 219-78.el7
      Available: systemd-219-62.el7_6.5.x86_64 (updates)
        systemd = 219-62.el7_6.5
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

Обновление firmware (MFT)

Чтобы обновить драйвер на последний, необходимо сначала обновить firmware сетевых адаптеров. Может возникнуть вопрос - почему нельзя было сразу установить новый драйвер, не обновляя firmware? Ответ прост - новая версия драйвера может быть использована только с определенной (относительно новой) версией прошивки.

Установка mft

Сначала необходимо установить утилиту mft-4.20.1-14-x86_64-rpm.tgz (Mellanox Firmware Tools). Для сборки потребуется kernel-devel для нашего ядра.

Ставим mft:

tar xvf mft-4.20.1-14-x86_64-rpm.tgz
cd mft-4.20.1-14-x86_64-rpm
./install.sh

Запускаем эмулятор устройств Mellanox:

mst start
Starting MST (Mellanox Software Tools) driver set
Loading MST PCI module - Success
[warn] mst_pciconf is already loaded, skipping
Create devices
Unloading MST PCI module (unused) - Success

Смотрим устройства:

# ls -l /dev/mst
total 0
crw------- 1 root root 511, 0 Nov 19 13:31 mt4117_pciconf0
crw------- 1 root root 511, 1 Nov 19 13:31 mt4117_pciconf0.1
crw------- 1 root root 511, 2 Nov 19 13:31 mt4117_pciconf1
crw------- 1 root root 511, 3 Nov 19 13:31 mt4117_pciconf1.1
crw------- 1 root root 511, 4 Nov 19 13:31 mt4119_pciconf0
crw------- 1 root root 511, 5 Nov 19 13:31 mt4119_pciconf0.1

Смотрим статус:

# mst status
MST modules:

------------
   MST PCI module is not loaded
  MST PCI configuration module loaded

MST devices:
------------
/dev/mst/mt4117_pciconf0     - PCI configuration cycles access.
                  domain:bus:dev.fn=0000:86:00.0 addr.reg=88 data.reg=92 cr_bar.gw_offset=-1
                  Chip revision is: 00
**/dev/mst/mt4117_pciconf1**     - PCI configuration cycles access.
                  domain:bus:dev.fn=0000:d8:00.0 addr.reg=88 data.reg=92 cr_bar.gw_offset=-1
                  Chip revision is: 00
/dev/mst/mt4119_pciconf0     - PCI configuration cycles access.
                  domain:bus:dev.fn=0000:18:00.0 addr.reg=88 data.reg=92 cr_bar.gw_offset=-1
                  Chip revision is: 00

Таким образом, по шине данных PCI установили, что имя нашего устройства - /dev/mst/mt4117_pciconf1.
Скачиваем здесь прошивку и распаковываем:

unzip fw-ConnectX4Lx-rel-14_31_1014-MCX4121A-XCA_Ax-UEFI-14.24.13-FlexBoot-3.6.403.bin.zip

Резервная копия

Делаем резервную копию текущей версии firmware:

/usr/bin/flint -d /dev/mst/mt4117_pciconf1 ri fw-ConnectX4Lx-backup.bin

Прошивка

Запускаем прошивку под screen:

screen -S burn
/usr/bin/flint -d /dev/mst/mt4117_pciconf1 -i fw-ConnectX4Lx-rel-14_31_1014-MCX4121A-XCA_Ax-UEFI-14.24.13-FlexBoot-3.6.403.bin burn

Current FW version on flash: 14.23.1020
  New FW version:        14.31.1014
FSMST_INITIALIZE -  OK
Writing Boot image component -  OK
-I- To load new FW run mlxfwreset or reboot machine.

Прошивка идет 2-3 минуты. После окончания - перегружаем сервер.

Контроль

Смотрим версию firmware:

# lshw -c network | grep enp216 -B 6 -A 8
 *-network:0
    description: Ethernet interface
    product: MT27710 Family [ConnectX-4 Lx]
    vendor: Mellanox Technologies
    physical id: 0
    bus info: pci@0000:d8:00.0
    logical name: enp216s0f0
    version: 00
    serial: 98:03:9b:62:35:38
    size: 10Gbit/s
    width: 64 bits
    clock: 33MHz
    capabilities: pciexpress vpd msix pm bus_master cap_list rom ethernet physical fibre autonegotiation
    configuration: autonegotiation=on broadcast=yes driver=mlx5_core driverversion=5.0-0 duplex=full firmware=14.31.1014 (MT_2420110004) latency=0 link=yes multicast=yes port=fibre speed=10Gbit/s
    resources: iomemory:387f0-387ef irq:144 memory:387ffc000000-387ffdffffff memory:fbe00000-fbefffff memory:387ffe800000-387ffeffffff

 *-network:1
    description: Ethernet interface
    product: MT27710 Family [ConnectX-4 Lx]
    vendor: Mellanox Technologies
    physical id: 0.1
    bus info: pci@0000:d8:00.1
    logical name: enp216s0f1
    version: 00
    serial: 98:03:9b:62:35:39
    size: 10Gbit/s
    width: 64 bits
    clock: 33MHz
    capabilities: pciexpress vpd msix pm bus_master cap_list rom ethernet physical fibre autonegotiation
    configuration: autonegotiation=on broadcast=yes driver=mlx5_core driverversion=5.0-0 duplex=full firmware=14.31.1014 (MT_2420110004) latency=0 link=yes multicast=yes port=fibre speed=10Gbit/s
    resources: iomemory:387f0-387ef irq:162 memory:387ffa000000-387ffbffffff memory:fbd00000-fbdfffff memory:387ffe000000-387ffe7fffff

Видим, что на указанном адаптере обновилась версия прошивки до 14.31.1014

Прошивка при несовпадении PSID

В некоторых случаях невозможно найти прошивку с таким-же PSID, как текущая прошивка. В частности, был случай с сервером Gigabyte, на котором сетевые адаптеры Mellanox ConnectX-4 Lx были прошиты firmware от компании Baidu: BAI0000000005.
Эти сетевые адаптеры не работали в режиме бонда с коммутатрами Huawei.
Соответствующий образ не удалось найти, а утилита flint не позволяет записать образ в котором PSID отличается от текущего:

flint -d /dev/mst/mt4117_pciconf0 -i MT_2470112034.bin burn
Current FW version on flash:    14.27.4000
New FW version:         14.32.1010

-E- PSID mismatch. The PSID on flash (BAI0000000005) differs from the PSID in the given image (MT_2470112034).
Детальное изучение ключей утилиты flint --help не принесло желаемого результата, а попытка “подменить” значение PSID в bin-файле привела к сообщению об ошибке контрольной суммы (CRC Error). Решить проблему удалось, применив недокументированный ключ -allow_psid_change.
Прошивку в подобном случае можно сделать следующей командой:
flint -d /dev/mst/mt4117_pciconf0 -i MT_2470112034.bin -allow_psid_change burn
В ответ на предупреждение об опасности подобной операции необходимо ответить Y.
После перезвгрузки сервера - сетевой адаптер начал нормально работать.

Обновление драйвера

Теперь можно приступать к собственно обновлению драйвера. Получили последнюю версию драйвера, распаковываем и устанавливаем:

tar xvf MLNX_OFED_SRC-5.8-1.0.1.1.tgz
cd MLNX_OFED_SRC-5.8-1.0.1.1
./install.pl

  1) View OFED Installation Guide
  2) Install OFED Software
  3) Show Installed Software
  4) Configure IPoIB
  5) Uninstall OFED Software
  Q) Exit

OFED Distribution Software Installation Menu

  1) Basic (OFED modules and basic user level libraries)
  2) HPC (OFED modules and libraries, MPI and diagnostic tools)
  3) All packages (all of Basic, HPC)
  4) Customize
  5) Packages required by VMA (IB and Eth)
  6) Packages required by VMA IB
  7) Packages required by VMA Eth
  8) Packages required by Guest OS
  9) Packages required by Hypervisor OS
  10) Packages required by Bluefield OS
  11) Packages required by XLIO
  Q) Exit

Выбираем 1.

....
Running rpmbuild --rebuild --define '_topdir /var/tmp/OFED_topdir' --define '_sourcedir %{_topdir}/SOURCES' --define '_specdir %{_topdir}/SPECS' --define '_srcrpmdir %{_topdir}/SRPMS' --define '_rpmdir %{_topdir}/RPMS' --define 'src_release OFED.5.8.0.4.8.1.kver.5.4.17_2011.6.2.el7uek.x86_64' --define 'KVERSION 5.4.17-2011.6.2.el7uek.x86_64' --define 'K_SRC /lib/modules/5.4.17-2011.6.2.el7uek.x86_64/build' --define '_prefix /usr' '/home/centos/mellanox/MLNX_OFED_SRC-5.8-1.0.1.1/SRPMS/isert-5.8-OFED.5.8.0.4.8.1.src.rpm'

Install isert 5.8 RPM:

Running rpm -iv --nodeps '/home/centos/mellanox/MLNX_OFED_SRC-5.8-1.0.1.1/RPMS/centos-release-7-6.1810.2.el7.centos/x86_64/isert-5.8-OFED.5.8.0.4.8.1.kver.5.4.17_2011.6.2.el7uek.x86_64.x86_64.rpm'

Build mlnx-nvme 5.8 RPM

Running rpmbuild --rebuild --define '_topdir /var/tmp/OFED_topdir' --define '_sourcedir %{_topdir}/SOURCES' --define '_specdir %{_topdir}/SPECS' --define '_srcrpmdir %{_topdir}/SRPMS' --define '_rpmdir %{_topdir}/RPMS' --define 'src_release OFED.5.8.0.4.8.1.kver.5.4.17_2011.6.2.el7uek.x86_64' --define 'KVERSION 5.4.17-2011.6.2.el7uek.x86_64' --define 'K_SRC /lib/modules/5.4.17-2011.6.2.el7uek.x86_64/build' --define '_prefix /usr' '/home/centos/mellanox/MLNX_OFED_SRC-5.8-1.0.1.1/SRPMS/mlnx-nvme-5.8-OFED.5.8.0.4.8.1.src.rpm'

Install mlnx-nvme 5.8 RPM:

Running rpm -iv --nodeps '/home/centos/mellanox/MLNX_OFED_SRC-5.8-1.0.1.1/RPMS/centos-release-7-6.1810.2.el7.centos/x86_64/mlnx-nvme-5.8-OFED.5.8.0.4.8.1.kver.5.4.17_2011.6.2.el7uek.x86_64.x86_64.rpm'

The default IPoIB interface configuration is based on DHCP.
Note that a special patch for DHCP is required for supporting IPoIB.
The patch is available under docs/dhcp
If you do not have DHCP, you must change this configuration in the following steps.
IPoIB interfaces configured successfully
Press any key to continue ...

Device (0000:18:00.0):
    0000:18:00.0 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
    Link Width: x8
    PCI Link Speed: 8GT/s

Device (0000:18:00.1):
    0000:18:00.1 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
    Link Width: x8
    PCI Link Speed: 8GT/s

Device (0000:86:00.0):
    0000:86:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
    Link Width: x8
    PCI Link Speed: 8GT/s

Device (0000:86:00.1):
    0000:86:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
    Link Width: x8
    PCI Link Speed: 8GT/s

Device (0000:d8:00.0):
    0000:d8:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
    Link Width: x8
    PCI Link Speed: 8GT/s

Device (0000:d8:00.1):
    0000:d8:00.1 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
    Link Width: x8
    PCI Link Speed: 8GT/s

You may need to update your initramfs before next boot. To do that, run:
  dracut -f

Installation finished successfully.

Проверяем версию драйвера:

# modinfo mlx5_core
filename:    /lib/modules/5.4.17-2011.6.2.el7uek.x86_64/extra/mlnx-ofa_kernel/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko
alias:     auxiliary:mlx5_core.eth-rep
alias:     auxiliary:mlx5_core.eth
basedon:    Korg 5.17-rc4
**version:    5.8-1.0.1**
license:    Dual BSD/GPL
description:  Mellanox 5th generation network adapters (ConnectX series) core driver
author:     Eli Cohen <eli@mellanox.com>
srcversion:   D17275D2A03B7CB08491355
alias:     pci:v000015B3d0000A2DFsv*sd*bc*sc*i*
alias:     pci:v000015B3d0000A2DCsv*sd*bc*sc*i*
alias:     pci:v000015B3d0000A2D6sv*sd*bc*sc*i*
alias:     pci:v000015B3d0000A2D3sv*sd*bc*sc*i*
alias:     pci:v000015B3d0000A2D2sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001023sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001021sv*sd*bc*sc*i*
alias:     pci:v000015B3d0000101Fsv*sd*bc*sc*i*
alias:     pci:v000015B3d0000101Esv*sd*bc*sc*i*
alias:     pci:v000015B3d0000101Dsv*sd*bc*sc*i*
alias:     pci:v000015B3d0000101Csv*sd*bc*sc*i*
alias:     pci:v000015B3d0000101Bsv*sd*bc*sc*i*
alias:     pci:v000015B3d0000101Asv*sd*bc*sc*i*
alias:     pci:v000015B3d00001019sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001018sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001017sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001016sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001015sv*sd*bc*sc*i*
alias:     pci:v000015B3d00001014sv*sd*bc*sc*i*
alias:      pci:v000015B3d00001013sv*sd*bc*sc*i*
depends:    mlx_compat,tls,auxiliary,mlxdevm,pci-hyperv-intf,mlxfw,psample
retpoline:   Y
name:      mlx5_core
vermagic:    5.4.17-2011.6.2.el7uek.x86_64 SMP mod_unload modversions
parm:      guids:charp
parm:      node_guid:guids configuration. This module parameter will be obsolete!
parm:      num_of_groups:Eswitch offloads number of big groups in FDB table. Valid range 1 - 1024. Default 15 (uint)
parm:      debug_mask:debug mask: 1 = dump cmd data, 2 = dump cmd exec time, 3 = both. Default=0 (uint)
parm:      prof_sel:profile selector. Valid range 0 - 3 (uint)
parm:      probe_vf:probe VFs or not, 0 = not probe, 1 = probe. Default = 1 (bool)

Видим, что версия обновилась до 5.8-1.0.1

Источники

  1. https://network.nvidia.com/support/firmware/nic/
  2. https://www.xmodulo.com/install-device-driver-mellanox-ethernet-card-linux.html
  3. https://docs.nvidia.com/networking/display/MLNXENv490170/Introduction
  4. Драйвер: https://network.nvidia.com/products/ethernet-drivers/linux/mlnx_en/
  5. https://developer.nvidia.com/networking/ethernet-software
  6. Linux driver sources: https://linux.mellanox.com/public/repo/mlnx_ofed/latest/