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


Настройка рабочих станций под управлением Ubuntu Linux
compile git kernel linux nvidia видео
 
 

* В этом блоге я описываю свою повседневную рабочую практику, поэтому все статьи в блоге написаны лично мной и при копировании их на свой сайт пожалуйста указывайте ссылку на страницу откуда вы скопировали.
* Если какая-то статья вам помогла, то вы можете дать мне немного денег вместо простого спасибо (ссылка на форму поддержки проекта внизу страницы), если вы что-то не поняли или у вас что-то не получается, то вы можете нанять меня и я вам все подробно расскажу (расценки и ссылки в конце статьи).


(последние правки 1 неделя)

Использовать или не использовать Open Source - версии Nvidia драйверов входящие в поставку ядра, это конечно личное дело каждого, тем более, что старые видео-карты уже очень даже неплохо поддерживаются, но я все же отдаю предпочтение проприетарным драйверам от 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
Моя официальная страница на FaceBook
Мой микроблог в твиттер

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

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

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


Как вы наверное понимаете, бесплатно сейчас работать никто не будет и если ответ на ваш вопрос потребует больше трех минут времени и вам требуется полноценная консультация, то расценки на мои услуги представленны ниже.


Есть вопросы?
Спрашивайте и я обязательно вам отвечу!

* Поля обязательные для заполнения .