.. title: Galère avec les drivers NVidia sous Linux? :name: galère-avec-les-drivers-nvidia-sous-linux `Retour à la page Systèmes <../systeme.html>`__ `Motivation <#motivation>`__ `Prérequis <#prerequis>`__ `Le principe <#principe>`__ - `Suivre les changements de code <#init>`__ - `Changer ou Patcher le code <#changer>`__ - `Archiver le patch <#archiver>`__ `Exemple <#exemple>`__ .. _motivation: Motivation ---------- NVidia met quelques jours (et parfois beaucoup plus) pour publier des versions de ses drivers qui soient compatibles avec les derniers noyaux Linux. Les adaptations d'une version de noyau à l'autre ne concernent cependant que quelques appels système, que l'on peut adapter manuellement. | Cet article a été entamé le 20/10/2013 sur une distribution Fedora 18 avec un bureau GNOME 3.6. | L'auteur l'a fait (une fois de plus) pour résoudre rapidement son propre problème, et n'exclut nullement qu'il existe des solutions plus élégantes. Les pistes proposées ici sont directement inspirées des discussions du `forum NVidia/Linux `__ (NVIDIA/DevZone/Forums/GPU Unix/Linux) .. _prerequis: Prérequis --------- Afin d'éviter les malentendus, voici ce qui est supposé à propos du lecteur: - Familier avec l'installation standard de drivers NVidia sous Linux (à partir du .run) - Avec une connaissance minimale des outils courants du monde GNU/Linux: ``git``, ``patch``, ``diff`` ... - Avec quelques connaissances en programmation C (utile pour comprendre les messages d'erreur). .. _principe: Le principe ----------- .. _prendre-un-driver-de-base: Prendre un driver de base ~~~~~~~~~~~~~~~~~~~~~~~~~ Télécharger le driver ``drvversion.run``\ qui fonctionnait sur le noyau le plus récent: c'est lui que l'on va essayer de patcher. Puis extraire les sources (eh oui il y a une option pour ça) .. code:: bash % ./drvversion.run -x % cd drvversion .. _init: Suivre les changements de code ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ On peut utiliser git pour suivre les changements de code (une autre méthode consisterait à ré-extraire les sources ailleurs à partir du .run, puis à faire un diff) .. code:: bash % git init . % cd kernel/ % git add *.c *.h % git commit -a .. _changer: Changer ou Patcher le code ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: bash % who -r run-level 3 2013-03-10 14:18 last=3 % cd drvversion % ./nvidia-installer % #Si ça marche passer à la section qui suit ... % #Sinon: % # Chercher 'error:' dans /var/log/nvidia-installer.log % # corriger les erreurs mentionnées dans /var/log/nvidia-installer.log % # --* patch -p1 % # --* ou bien bricolage manuel .. _archiver: Archiver le patch ~~~~~~~~~~~~~~~~~ .. code:: bash % git commit -a % git diff HEAD > mon-patch.txt Donner un nom raisonnable au patch, comme ``NVidia_drvversion_noyau.patch`` .. _exemple: Exemple ------- Voici ce que j'ai fait pour faire fonctionner le driver 319.17 sur un noyau 3.11.4 .. _essai-naïf: Essai naïf ~~~~~~~~~~ .. code:: bash % ./NVIDIA-Linux-x86-319.17.run -x % cd NVIDIA-Linux-x86-319.17 % ./nvidia-installer Après échec de l'installation, ``nvidia-installer.log`` contient: .. code:: bash NVIDIA-Linux-x86_64-325.08/kernel/nv-i2c.c:252:14: error: void value not ignored as it ought to be .. _recherche-dune-solution-prète-à-consommer: Recherche d'une solution prète à consommer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Une recherche Google sur le message d'erreur envoie rapidement à la page `de forum `__ où l'intervenant du 7/2/2013 à 5h36 propose un patch (adapté de 319.23) pour compiler le driver 319.17 sur un noyau 3.10. `nvidia-drivers-linux-3.10.patch.txt `__ | Le noyau 3.10 n'est évidemment pas 3.11.4, mais on s'en rapproche. | On commence donc par essayer d'appliquer le patch: .. code:: bash patch --dry-run -p1 < nvidia-drivers-linux-3.10.patch.txt patching file kernel/nv-i2c.c patching file kernel/nv-procfs.c Hunk #9 FAILED at 424. 1 out of 15 hunks FAILED -- saving rejects to file kernel/nv-procfs.c.rej Qu'est-ce que ça veut dire? - nv-i2c.c a été modifié comme il faut. - Dans nv-procfs.c, 14 modifications ont bien été faites, sauf une - La modification qui n'a pas pu être appliquée est décrite dans nv-procfs.c.rej .. code:: bash git commit -a -m 'patch1-fail9' On édite "à la main" nv-procfs.c selon les indications de nv-procfs.c.rej, puis on contrôle que les modifications n'ont pas été oubliées .. code:: bash % git diff >modifs.txt % diff modifs.txt nv-procfs.c.rej 1,5c1,3 < diff --git a/kernel/nv-procfs.c b/kernel/nv-procfs.c < index 8a16c8d..e754e9f 100644 < --- a/kernel/nv-procfs.c < +++ b/kernel/nv-procfs.c < @@ -424,122 +424,81 @@ done: --- > --- kernel/nv-procfs.c 2013-04-26 00:22:30.000000000 -0400 > +++ kernel/nv-procfs.c 2013-05-22 04:52:45.229495748 -0400 > @@ -424,121 +502,80 @@ 47d44 < 104a102,103 > - > - bytes_left = (NV_PROC_WRITE_BUFFER_SIZE - nvfp->off - 1); 107,108d105 < - bytes_left = (NV_PROC_WRITE_BUFFER_SIZE - nvfp->off - 1); < - Il semble vraiment que la différence ne tenait qu'à de malheureux espaces blancs. On peut retenir ce changement: .. code:: bash % git commit -a 'patch1-ok' Et on reessaye: .. code:: bash % cd drvversion % ./nvidia-installer Enfer et damnation! Il y a cette fois-ci une erreur dans os-interface.c, où ``num_physpages`` n'est pas défini. .. _bricolage-manuel: Bricolage manuel ~~~~~~~~~~~~~~~~ * Les patches récents trouvés çà et là sur le net suggèrent que ``num_physpages`` doit être remplacé par ``get_num_physpages()`` dans ``nv-linux.h``. * On edite donc le fichier manuellement, et on regarde la différence à la fin: