Драйвер i40e

21 ноября 2018

Linux-драйверы для 40-гигабитных сетевых карт от Intel:

Существующие варианты драйвера:

  • в стандартном ядре;
  • на сайте Интела;
  • на SourceForge.

Драйвер в стандартном ядре:

  • В ядро входит вариант с суффиксом «k».
  • Находится в https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/net/ethernet/intel/i40e.
  • Обычно имеет более старую версию, чем вариант на сайте Интела, но иногда случается наоборот.
  • Например, в ядро 4.12 вошла версия 2.1.14-k, в то время как у Интела и на SF была выложена только 2.0.26.

На сайте Интела:

  • Домашняя страница: https://downloadcenter.intel.com/download/24411/Intel-Network-Adapter-Driver-for-PCIe-40-Gigabit-Ethernet-Network-Connections-Under-Linux-.
  • Драйверы с суффиксом «k» и без него отличаются не только версией:
    • драйвер в ядре расчитан только на ту версию ядра, в которую входит;
    • драйвер на сайте Интела должен уметь компилироваться со всеми версиями ядер, начиная с 2.6.32.
  • Для этой цели в его исходники включены два больших файла, которых нет в драйвере стандартного ядра: kcompat.c и kcompat.h.
    • назначение kcompat: прятать в себе различия разных версий ядра от остальной части драйвера;
    • иногда kcompat не поспевает за свежими версиями ядер и нам приходилось дорабатывать его самостоятельно: https://sourceforge.net/p/e1000/patches/37/.

На SourceForge:

  • Страница: https://sourceforge.net/projects/e1000/files/i40e%20stable/.
  • Фактически представляет из себя архивное зеркало интеловского сайта. Обновляется с задержкой, поэтому особого смысла не имеет.
  • Формально в разделе «Support» можно сообщать об ошибках и предлагать исправления, по факту вероятность реакции, тем более позитивной, почти нулевая.

Что делает наш сценарий?

  • проверяет, что в системе есть 40-гигабитная сетевая карта Intel, иначе завершается;
  • проверяет, что установлены средства сборки, т.е. пакет kernel*-devel, версия которого совпадает с версией ядра, иначе завершается;
  • ищет на сайте Интела нужную версию драйвера — либо явно указанную, либо самую последнюю;
  • скачивает её;
  • собирает драйвер;
  • инсталлирует его;
  • при необходимости пересобирает initramfs (через dracut).

Где его скачать?

Как его вызвать вручную?

  • /etc/kernel/postinst.d/00-autoinstall-i40e-driver.sh [версия-ядра [версия-драйвера]] && depmod -a && dracut -f;
  • По умолчанию используются установленное ядро (при вызове из /sbin/new-kernel-pkg — устанавливаемое) и последний драйвер.

Как он вызывается автоматически?

  • В состав CentOS входит утилита /sbin/new-kernel-pkg, которую вызывают:
    • высокоуровневые утилиты /bin/kernel-install и /sbin/installkernel;
    • секция %postinstall всех RPM-пакетов с ядром.
  • /sbin/new-kernel-pkg вызывает все сценарии из каталога /etc/kernel/postinst.d, включая наш 00-autoinstall-i40e-driver.sh
  • Важно:
    • вместе с ядром необходимо также устанавливать kernel-devel соответствующей версии, иначе сценарий не сможет собрать драйвер;
    • на примере установки ядра из ELRepo: yum install --enablerepo=elrepo-kernel kernel-lt-devel kernel-lt && grub2 set default 0.

Почему мы не стали использовать DKMS или kmod?

  • Лень:
    • для DKMS пришлось бы собирать RPM-пакет с драйвером при выходе очередной версии драйвера;
    • для kmod пришлось бы собирать RPM-пакет с драйвером при выходе очередной версии драйвера и очередной версии ядра.
  • Нынешний вариант требует меньше всего телодвижений:
    • один раз выполнить команду установки сценария Chef'ом;
    • не забывать устанавливать kernel*-devel вместе с kernel.


← Назад в Блог