Driver NVIDIA avec un kernel > 2.6.20

Après avoir apssé l'àprès midi à essayer de compiler un module NVIDIA pour le kernel 2.6.21, j'ai pensé qu'il serait de bon gout d'expliquer la façon de procéder. ce n'est certainement pas la meilleure méthoden que je vais détailler ici, mais elle à le mérite de foctionner, et puis c'est la seule que j'ai trouvé.

J'ai trouvé pas mal d'infos ici: http://www.everlong.org/blog/index.php/2007/05/13/307-le-module-binaire-nvidia-avec-les-noyaux-linux-recents

NOTE: avec cette procédure, je n'arrive pas a faire fonctionner le driver xorg GLX

Versions valides

Cette procédure est valide avec ces versions de softs. Elle fonctionne très certainement avec d'autres versions, mais ce n'est pas testé.

  • Kernel:2.6.21-2-686 (debian)
  • Sources kernel:linux-2.6.21.7
  • Driver NVIDIA:NVIDIA-Linux-x86-100.14.19-pkg1.run
  • OS:Debian testing valide au 20/10/2007

Supprimer l'erreur "GPL-incompatible..."

Si vous êtes arrivés ici, c'est surrement grace à ce merveilleux message d'erreur:
FATAL: modpost: GPL-incompatible module nvidia.ko uses GPL-only symbol 'paravirt_ops'
Si ce n'est pas le cas, je vais quand même expliquer comment guérir le système.

Il faut télécharger les sources correspondantes aux kernel ici: www.kernel.org. Vous pouvez trouver votre version de kernel avec la commande uname -a. Puis, il faut recupérer le driver NVIDIA ici: /www.nvidia.com. Décompressez les sources du kernel dans /usr/src/, un repertoire linux-2.6.21.7 ou equivalent sera créé. Creez un lien symbolique dans /lib/modules/2.6.21-2-686 ou equivalent qui pointe sur les sources ainsi decompressées: ln -sf /usr/src/linux-2.6.21.7 build L'installateur nvidia trouvera ainsi les header necessaires à sa compilation.

Nous allons maintenant guérir les sources du kernel afin de supprimer le message d'erreur. Il faut donc aller dans le répertoire /usr/src/linux-2.6.21.7/scripts/mod/ et effacer le fichier modpost. Il faut editer le fichier modpost.c, recherche les lignes:

              if (!mod->gpl_compatible)
                        check_for_gpl_usage(exp->export, basename, exp->name);

et les commenter de la maniere suivante:

//              if (!mod->gpl_compatible)
//                        check_for_gpl_usage(exp->export, basename, exp->name);

Il faut maintenant recompiler le binaire modpost en allant dans le repertoire /usr/src/linux-2.6.21.7/ et en lançant la commande make. lorsque la ligne HOSTLD scripts/mod/modpost s'affiche, vous pouvvez interropre la compilation à l'aide d'un "CTRL+C"

athlon64:/usr/src/linux-2.6.21.7# make
  CHK     include/linux/version.h
  CHK     include/linux/utsrelease.h
  HOSTLD  scripts/mod/modpost
  CHK     include/linux/compile.h
make[1]: *** [fs/affs] Interruption
make: *** [fs] Interruption

Compiler le driver NVIDIA

Copier le driver NVIDIA dans /usr/src, et executez ./NVIDIA-Linux-x86-100.14.19-pkg1.run -x afin d'extraire les sources du driver. un répertoire NVIDIA-Linux-x86-100.14.19-pkg1 est ainsi créé. Allez dans le répertoire /usr/src/NVIDIA-Linux-x86-100.14.19-pkg1/usr/src/nv, lancer la commande make, effacez ensuite le fichier makefile de la maniere suivante: rm makefile, et relancez la commande make. Après quelques dizaines de secondes, la compilation devrait se terminer avec une belle erreur. Quoi qu'il en soit, il faut recompiler le module a la main. Il faut effacer le module compilé rm rm nvidia.ko, trouver le mappage en mémoire de la fonction paravirt_ops de la manière suivante: PARAVIRT_OPS=$(grep "D paravirt_ops" /boot/System.map-`uname -r` | colrm 9), et relinker le module de cette manière ld -m elf_i386 --defsym paravirt_ops=0x${PARAVIRT_OPS} -r -o nvidia.ko nvidia.o nvidia.mod.o

Installer tout ce petit monde

Tout d'abord installer et tester le module compilé: cp nvidia.ko /lib/modules/2.6.21-2-686/kernel/drivers/video/nvidia.ko, puis modprobe nvidia pour tester le bon fonctionnement. Il faut ensuite installer les libs NVIDIA qui sont fournies avec le kernel et qui n'on pas étés installés a cause de l'erreur de compilation. Tout se passe dans le répertoire /usr/src/NVIDIA-Linux-x86-100.14.19-pkg1/usr/, il faut effectuer quelques copies: cp -rav include /usr/, cp -rav share /usr/, cp -rav lib /usr/ et cp -rav X11R6 /usr/.

fin

Voila, c'est fini, après avoir redemarré X, tout devrait fonctionner.