Linux-драйверы для 40-гигабитных сетевых карт от Intel:
- Драйвер называется i40e.
- Знаменит своей кривизной, например, https://www.spinics.net/lists/netdev/msg458258.html «Linux 4.12+ memory leak on router with i40e NICs».
Существующие варианты драйвера:
- в стандартном ядре;
- на сайте Интела;
- на 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).
Где его скачать?
- https://gist.github.com/ilyaevseev/defbb0846b18aa9500a650f9ac2dcff1#file-00-autoinstall-i40e-driver-sh.
- Внутри INSTALL_ME_SO='...' приведена команда для быстрой установки, которую достаточно скопировать в консоль root'a и нажать Enter.
Как его вызвать вручную?
- /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.