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

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

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

Фотография автора

Автор: Антон Черноусов
Опубликовано: 2 месяца (последние правки: 0 минут назад) - 0 комментариев
Категории записи: Drivers, Hardware, Linux, Linux kernel, Video


Как это не печально обратная совместимость в современных 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
Пожалуйста, оцените мою статью (всего оценок 2, средняя оценка 3.50):

Комментарии к статье:

Пока комментариев нет

Оставьте комментарий:

обязательно

обязательно (не публикуется)

необязательно

обязательно

обязательно