Установка старых проприетарных драйверов Nvidia версии 340.104 для свежих Linux-ядер 4.13 и 4.14

Использовать или не использовать Open Source - версии Nvidia драйверов входящие в поставку ядра, это конечно личное дело каждого, тем более, что старые видео-карты уже очень даже неплохо поддерживаются, но я все же отдаю предпочтение проприетарным драйверам от Nvidia. Кому как не производителю оборудования лучше доверить написание драйверов.

 
 
Логотип GITA-DEV

Автор: Черноусов Антон aka Gita-Dev
Опубликовано: 12 Мар 2018 (последние правки 1 месяц)

compile dev git install kernel nvidia видео

Как это не печально обратная совместимость в современных Linux-ядрах довольно часто не поддерживается и ряд устаревшего оборудования вы можете использовать только со старой версией ядра. Я с этим сталкиваюсь довольно часто, так как у меня имеется небольшой парк старых, но при этом вполне себе рабочих "печатных машинок".

Сборка старых Nvidia-драйверов для нового ядра

После обнаружений уязвимостей в процессорах Intel и AMD которые были у всех на слуху я естественно захотел обновить ядра на этих старичках до актуальных версий и столкнулся с тем, что не смог собрать собрать вполне успешно работавшие драйвера на видео и несколько WIFI-свистков. Проблема с WIFI-свистками решилась обновлением драйверов из Git-разработчика который выпустил патчи совместимости, а с проприетарными драйверами для Nvidia пришлось повозиться.

Представляю вашему вниманию решение которое я нашел в статье: https://devtalk.nvidia.com/default/topic/1025051/fully-working-patches-2-of-them-for-nvidia-driver-340-104-compiler-installer-file-and-linux-kernels-4-13-amp-4-14/?offset=7

Попытка собрать драйвера Nvidia версии 340.104 для свежих Linux-ядер 4.13 и 4.14 завершается ошибкой:

/usr/src/NVIDIA-Linux-x86_64-340.104/kernel/nv-drm.c:186:5: error: implicit declaration of function ‘drm_pci_exit’ [-Werror=implicit-function-declaration]
     drm_pci_exit(&nv_drm_driver, pci_driver);

Это ошика проявляется при сборке драйверов для старых видюх на новых драйверах 4.13 и 4.14, вам потребуется внесение правок в исходные коды при помощи двух патчей:

nv_patch_340.104_linux_kernel_4.13

--- kernel/uvm/nvidia_uvm_lite.c
+++ kernel/uvm/nvidia_uvm_lite.c
@@ -818,8 +818,15 @@ done:
 }

 #if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
 int _fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+#else
+int _fault(struct vm_fault *vmf)
+#endif
 {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+    struct vm_area_struct *vma = vmf->vma;
+#endif
 #if defined(NV_VM_FAULT_HAS_ADDRESS)
     unsigned long vaddr = vmf->address;
 #else
@@ -866,7 +873,11 @@ static struct vm_operations_struct uvmlite_vma_ops =
 // it's dealing with anonymous mapping (see handle_pte_fault).
 //
 #if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
 int _sigbus_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+#else
+int _sigbus_fault(struct vm_fault *vmf)
+#endif
 {
     vmf->page = NULL;
     return VM_FAULT_SIGBUS;

nv_patch_340.104_linux_kernel_4.14

--- kernel/uvm/nvidia_uvm_lite.c
+++ kernel/uvm/nvidia_uvm_lite.c
@@ -818,8 +818,15 @@ done:
 }

 #if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
 int _fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+#else
+int _fault(struct vm_fault *vmf)
+#endif
 {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+    struct vm_area_struct *vma = vmf->vma;
+#endif
 #if defined(NV_VM_FAULT_HAS_ADDRESS)
     unsigned long vaddr = vmf->address;
 #else
@@ -866,7 +873,11 @@ static struct vm_operations_struct uvmlite_vma_ops =
 // it's dealing with anonymous mapping (see handle_pte_fault).
 //
 #if defined(NV_VM_OPERATIONS_STRUCT_HAS_FAULT)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
 int _sigbus_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+#else
+int _sigbus_fault(struct vm_fault *vmf)
+#endif
 {
     vmf->page = NULL;
     return VM_FAULT_SIGBUS;
--- kernel/nv-drm.c    2017-09-21 12:58:23.901972670 +0200
+++ kernel/nv-drm.c    2017-09-21 13:07:32.418269409 +0200
@@ -173,7 +173,7 @@
 {
     int ret = 0;
 #if defined(NV_DRM_AVAILABLE)
-    ret = drm_pci_init(&nv_drm_driver, pci_driver);
+    ret = drm_legacy_pci_init(&nv_drm_driver, pci_driver);
 #endif
     return ret;
 }
@@ -183,7 +183,7 @@
 )
 {
 #if defined(NV_DRM_AVAILABLE)
-    drm_pci_exit(&nv_drm_driver, pci_driver);
+    drm_legacy_pci_exit(&nv_drm_driver, pci_driver);
 #endif
 }

Для применения патчей пожно пойти двумя путями:

1. Распаковать драйвера Nvidia, запустив их с ключом -x (# ./NVIDIA-Linux-x86_64-340.104.run -x), после чего скопировать патчи в корень каталога и выполнить команды:

# patch --dry-run -p0 < nv_patch_340.104_linux_kernel_4.13

или

# patch --dry-run -p0 < nv_patch_340.104_linux_kernel_4.14

для разных версий ядра (4.13 или 4.14). После применения патчей запустите инсталлятор из корня распакованного архива командой:

# ./nvidia-installer

2. Можно собрать уже пропатченный пакет драйверов (удобно при массовой установке).

Положите в каталог с драйверами пакет патча и выполните команду:

# ./NVIDIA-Linux-x86_64-340.104.run --apply-patch nv_patch_340.104_linux_kernel_4.14

В результате вы получите бинарный файл (NVIDIA-Linux-x86_64-340.104-custom.run) уже включающий в себя необходимые патчи и вы можете просто запустить его в обычном режиме и провести установку:

# ./NVIDIA-Linux-x86_64-340.104-custom.run

Похожие статьи

Сборка пакета FFmpeg из исходных кодов (с поддержкой CUDA)

Сборка пакета FFmpeg из исходных кодов (с поддержкой CUDA)

Использование аппаратного ускорения позволяет значительно ускорить операции обработки видео, но штатное ПО входящее в поставку дистрибутива Ubuntu Linux не поддерживает аппаратное кодирование/декодирование видео и для активации поддержки NVENCODE вам потребуется собрать FFMPEG из исходных кодов.


Скрипты для автоматической сборки Kdenlive из GIT-репозитария с поддержкой CUDA

Скрипты для автоматической сборки Kdenlive из GIT-репозитария с поддержкой CUDA

Как вы наверное знаете, я иногда подготавливаю видео, для своего видео блога в видео-редакторе Kdenlive и в нескольких прошлых статьях я уже рассказывал как можно немного ускорить создание видео-клипов в этом редакторе, но сегодня я пошел дальше и немного модифицировал скрипты автоматизированной сборки Kdenlive для поддержки CUDA.


Отзывы и комментарии