Linux How To - SL5 - Nvidia Driver Installation/Update On SL51 i386
===================================================================

References
----------

- https://wiki.intranet.psi.ch/AIT/Linux/HowToDKMS?skin=clean.nat%2cpsiskin%2cpattern #Update_nvidia_x11_drv_driver_to

- [[DynamicKernelModuleSupportBasics][Dynamic Kernel Module Support (DKMS) Basics]]


Requirements
~~~~~~~~~~~~

DKMS (Dynamic Kernel Module Support) framework has to be installed
before the nvidia RPM installation, because the RPM scripts use it for
proper setup::

    # yum install dkms.noarch


Procedure
~~~~~~~~~

Check what graphic card is in your computer and what driver is
installed::

    # lspci
    ...
    01:00.0 VGA compatible controller: nVidia Corporation G72 [GeForce 7300 LE] (rev a1)

    # less /etc/X11/xorg.conf
    (See the output below at "before nvidia installation".)
    
    # rpm -qa | grep nvid
    (nothing found)

Before beginning with the installation of the new graphics driver,
make a backup of your current `xorg.conf`::

    # cd /etc/X11/
    # cp xorg.conf xorg.conf_bak

Check whether some nvidia driver is available::

    # [root@pc7377 X11]# yum list | grep nvidia
    nvidia-x11-drv.i386                      100.14.19-3.9.slp5     sl51psi

    # [root@pc7377 X11]# yum install nvidia-x11-drv.i386


    ### begin output
    Loading "kernel-module" plugin
    Setting up Install Process
    Setting up repositories
    Reading repository metadata in from local files
    Parsing package install arguments
    Resolving Dependencies
    --> Populating transaction set with selected packages. Please wait.
    ---> Downloading header for nvidia-x11-drv to pack into transaction set.
    nvidia-x11-drv-100.14.19- 100% |=========================|  24 kB    00:00     
    ---> Package nvidia-x11-drv.i386 0:100.14.19-3.9.slp5 set to be updated
    --> Running transaction check
    --> Processing Dependency: dkms for package: nvidia-x11-drv
    --> Restarting Dependency Resolution with new changes.
    --> Populating transaction set with selected packages. Please wait.
    ---> Downloading header for dkms to pack into transaction set.
    dkms-2.0.17.4-1.9.slp5.no 100% |=========================|  36 kB    00:00     
    ---> Package dkms.noarch 0:2.0.17.4-1.9.slp5 set to be updated
    --> Running transaction check
    Beginning Kernel Module Plugin
    Finished Kernel Module Plugin

    Dependencies Resolved

    =============================================================================
     Package                 Arch       Version          Repository        Size 
    =============================================================================
    Installing:
     nvidia-x11-drv          i386       100.14.19-3.9.slp5  sl51psi           7.1 M
    Installing for dependencies:
     dkms                    noarch     2.0.17.4-1.9.slp5  sl51psi            89 k

    Transaction Summary
    =============================================================================
    Install      2 Package(s)         
    Update       0 Package(s)         
    Remove       0 Package(s)         

    Total download size: 7.2 M
    Is this ok [y/N]: y
    Downloading Packages:
    (1/2): nvidia-x11-drv-100 100% |=========================| 7.1 MB    00:00     
    (2/2): dkms-2.0.17.4-1.9. 100% |=========================|  89 kB    00:00     
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
      Installing: dkms                         ######################### [1/2] 
      Installing: nvidia-x11-drv               ######################### [2/2] 

    Installed: nvidia-x11-drv.i386 0:100.14.19-3.9.slp5
    Dependency Installed: dkms.noarch 0:2.0.17.4-1.9.slp5
    Complete!
    [root@pc7377 X11]# dkms status -m nvidia
    nvidia, 100.14.19-3.9.slp5, 2.6.18-92.1.10.el5, i686: installed 
    nvidia, 100.14.19-3.9.slp5, 2.6.18-53.1.4.el5, i686: installed-weak from 2.6.18-92.1.10.el5
    nvidia, 100.14.19-3.9.slp5, 2.6.18-53.1.21.el5, i686: installed-weak from 2.6.18-92.1.10.el5
    [root@pc7377 X11]# rpm -q --scripts nvidia-x11-drv-100
    package nvidia-x11-drv-100 is not installed
    [root@pc7377 X11]# rpm -q --scripts nvidia-x11-drv
    postinstall scriptlet (using /bin/sh):
    /sbin/ldconfig
    # Make sure we have a Files section in xorg.conf, otherwise create an empty one
    XORGCONF=/etc/X11/xorg.conf
    [ -w ${XORGCONF} ] && ! grep -q 'Section "Files"' ${XORGCONF} && \
        echo -e 'Section "Files"\nEndSection' >> ${XORGCONF}
    # Enable the proprietary driver
    /usr/sbin/nvidia-config-display enable || :
    # Add to DKMS registry
    dkms add -m nvidia -v 100.14.19-3.9.slp5 -q || :
    # Rebuild and make available for the currenty running kernel
    dkms build -m nvidia -v 100.14.19-3.9.slp5 -q || :
    dkms install -m nvidia -v 100.14.19-3.9.slp5 -q --force || :
    /sbin/MAKEDEV nvidia
    preuninstall scriptlet (using /bin/sh):
    # Remove all versions from DKMS registry
    dkms remove -m nvidia -v 100.14.19-3.9.slp5 -q --all || :
    # Last removal, disable the proprietary driver
    if [ $1 -eq 0 ]; then
        /usr/sbin/nvidia-config-display disable || :
    fi
    postuninstall program: /sbin/ldconfig
    ### end output

Check the status of the nvidia kernel module.  (From the dkms manpage:
`dkms status` returns the current status of modules, versions and
kernels within the tree as well as whether they have been added, built
or installed.)::

    # dkms status -m nvidia
    nvidia, 100.14.19-3.9.slp5, 2.6.18-92.1.10.el5, i686: installed 
    nvidia, 100.14.19-3.9.slp5, 2.6.18-53.1.4.el5, i686: installed-weak from 2.6.18-92.1.10.el5
    nvidia, 100.14.19-3.9.slp5, 2.6.18-53.1.21.el5, i686: installed-weak from 2.6.18-92.1.10.el5

List the package specific scriptlet(s) that are used as part of the
installation and uninstallation processes::

    # rpm -q --scripts nvidia-x11-drv

    ### begin output
    postinstall scriptlet (using /bin/sh):
    /sbin/ldconfig
    # Make sure we have a Files section in xorg.conf, otherwise create an empty one
    XORGCONF=/etc/X11/xorg.conf
    [ -w ${XORGCONF} ] && ! grep -q 'Section "Files"' ${XORGCONF} && \
        echo -e 'Section "Files"\nEndSection' >> ${XORGCONF}
    # Enable the proprietary driver
    /usr/sbin/nvidia-config-display enable || :
    # Add to DKMS registry
    dkms add -m nvidia -v 100.14.19-3.9.slp5 -q || :
    # Rebuild and make available for the currenty running kernel
    dkms build -m nvidia -v 100.14.19-3.9.slp5 -q || :
    dkms install -m nvidia -v 100.14.19-3.9.slp5 -q --force || :
    /sbin/MAKEDEV nvidia
    preuninstall scriptlet (using /bin/sh):
    # Remove all versions from DKMS registry
    dkms remove -m nvidia -v 100.14.19-3.9.slp5 -q --all || :
    # Last removal, disable the proprietary driver
    if [ $1 -eq 0 ]; then
        /usr/sbin/nvidia-config-display disable || :
    fi
    postuninstall program: /sbin/ldconfig
    ### end output


Check whether your xorg.conf was modified to use the nvidia driver::

    # less /etc/X11/xorg.conf

    ### begin output                                                        
    (after nvidia installation)                                     #       (before nvidia installation)
    # Xorg configuration created by pyxf86config                    #       # Xorg configuration created by pyxf86config
                                                                    #        
    Section "ServerLayout"                                          #        Section "ServerLayout"
            Identifier     "Default Layout"                         #                Identifier     "Default Layout"
            Screen      0  "Screen0" 0 0                            #                Screen      0  "Screen0" 0 0
            InputDevice    "Keyboard0" "CoreKeyboard"               #                InputDevice    "Keyboard0" "CoreKeyboard"
    EndSection                                                      #        EndSection
                                                                    #        
    Section "Files"                                                 #        
            ModulePath   "/usr/lib/xorg/modules/extensions/nvidia"  #        
            ModulePath   "/usr/lib/xorg/modules"                    #        
    EndSection                                                      #        
                                                                    #        
    Section "InputDevice"                                           #        Section "InputDevice"
            Identifier  "Keyboard0"                                 #                Identifier  "Keyboard0"
            Driver      "kbd"                                       #                Driver      "kbd"
            Option      "XkbModel" "pc105"                          #                Option      "XkbModel" "pc105"
            Option      "XkbLayout" "ch"                            #                Option      "XkbLayout" "ch"
            Option      "XkbVariant" "de_nodeadkeys"                #                Option      "XkbVariant" "de_nodeadkeys"
    EndSection                                                      #        EndSection
                                                                    #        
    Section "Device"                                                #        Section "Device"
            Identifier  "Videocard0"                                #                Identifier  "Videocard0"
            Driver      "nvidia"                                    #                Driver      "nv"
    EndSection                                                      #        EndSection
                                                                    #        
    Section "Screen"                                                #        Section "Screen"
            Identifier "Screen0"                                    #                Identifier "Screen0"
            Device     "Videocard0"                                 #                Device     "Videocard0"
            DefaultDepth     24                                     #                DefaultDepth     24
            SubSection "Display"                                    #                SubSection "Display"
                    Viewport   0 0                                  #                        Viewport   0 0
                    Depth     24                                    #                        Depth     24
            EndSubSection                                           #                EndSubSection
    EndSection                                                      #        EndSection
    ### end output                                                  #


Test the module with glxgears for instance::

        [root@pc7377 ~]# glxgears 

        11424 frames in 5.0 seconds = 2284.662 FPS
        11291 frames in 5.0 seconds = 2258.003 FPS
        11244 frames in 5.0 seconds = 2248.682 FPS
        11290 frames in 5.0 seconds = 2257.974 FPS
        12626 frames in 5.0 seconds = 2525.121 FPS
        3439 frames in 5.0 seconds = 687.363 FPS
        964 frames in 5.0 seconds = 192.629 FPS
        964 frames in 5.0 seconds = 192.620 FPS
        1395 frames in 5.0 seconds = 278.978 FPS
        12080 frames in 5.0 seconds = 2415.854 FPS
        11252 frames in 5.0 seconds = 2250.348 FPS


Problem With Automatic Nvidia Driver Update On SL51 i386
--------------------------------------------------------

Problem Description
~~~~~~~~~~~~~~~~~~~

On some systems the automatic nvidia driver update by dkms fails.
Somehow when the new RPM `nvidia-x11-drv-169.12-4.9.slp5` is installed
by yum or rpm, the old nvidia version `100.14.19-3.9.slp5` remains in
dkms status `added`, i.e. the respective directory remains in the dkms
tree, while the original driver sources are removed from `/usr/src/`,
i.e. the RPM `nvidia-x11-drv-100.14.19-3.9.slp5` was removed.

During reboot the service `dkms_autoinstaller` (see `chkconfig
--list`) obviously tries to build the old `100.14.19-3.9.slp5` as well
because it tries to get the file
`/var/lib/dkms/nvidia/100.14.19-3.9.slp5/source/dkms.conf`.  This,
however, fails because the `.../scource` is a symbolic link pointing
to the source directory that was removed during the nvidia RPM update
as mentioned before::

        "source -> /usr/src/nvidia-100.14.19-3.9.slp5"

Though, this basically would not be a problem if dkms was not confused
by the occurences of several nvidia versions in its tree under
`/var/lib/dkms/nvidia/`.

The main questions are:

- Why does the update procedure only partially clean the installation
  environment (under `/usr/src/` it is clean, under
  `/var/lib/dkms/nvidia/` it is not)?

- Why does dkms not properly recognize the new nvidia version only but
  also tries to build modules out of the sources of the older version?


Solution
~~~~~~~~

The problem appears if the nvidia driver RPM is installed or updated
before the dkms framework is ready on the system, because the RPM
scripts invoke a variety of `dkms` commands to install the new driver
into the dkms tree and to remove the old driver version from it. Thus,
one has to install the dkms RPM first, before doing any driver
installation or updates.

Manual Update Using DKMS
~~~~~~~~~~~~~~~~~~~~~~~~

Perform the following steps::

    [root@pc7377 ~]# dkms status -m nvidia
    nvidia, 100.14.19-3.9.slp5, 2.6.18-92.1.10.el5, i686: installed
    nvidia, 100.14.19-3.9.slp5, 2.6.18-92.1.13.el5, i686: installed
    nvidia, 100.14.19-3.9.slp5, 2.6.18-53.1.4.el5, i686: installed-weak from 2.6.18-92.1.10.el5
    nvidia, 100.14.19-3.9.slp5, 2.6.18-53.1.4.el5, i686: installed-weak from 2.6.18-92.1.13.el5
    nvidia, 100.14.19-3.9.slp5, 2.6.18-53.1.21.el5, i686: installed-weak from 2.6.18-92.1.10.el5
    nvidia, 100.14.19-3.9.slp5, 2.6.18-53.1.21.el5, i686: installed-weak from 2.6.18-92.1.13.el5
    nvidia, 100.14.19-3.9.slp5, 2.6.18-92.1.10.el5, i686: installed-weak from 2.6.18-92.1.13.el5

    [root@pc7377 ~]# uname -a
    Linux pc7377 2.6.18-92.1.13.el5 #1 SMP Wed Sep 24 16:44:34 EDT 2008 i686 i686 i386 GNU/Linux

    [root@pc7377 ~]# locate nvidia.ko
    /lib/modules/2.6.18-53.1.21.el5/weak-updates/lib/modules/2.6.18-92.1.10.el5/kernel/drivers/video/nvidia/nvidia.ko
    /lib/modules/2.6.18-53.1.21.el5/weak-updates/lib/modules/2.6.18-92.1.13.el5/kernel/drivers/video/nvidia/nvidia.ko
    /lib/modules/2.6.18-53.1.4.el5/weak-updates/lib/modules/2.6.18-92.1.10.el5/kernel/drivers/video/nvidia/nvidia.ko
    /lib/modules/2.6.18-53.1.4.el5/weak-updates/lib/modules/2.6.18-92.1.13.el5/kernel/drivers/video/nvidia/nvidia.ko
    /lib/modules/2.6.18-92.1.10.el5/kernel/drivers/video/nvidia/nvidia.ko
    /lib/modules/2.6.18-92.1.10.el5/weak-updates/lib/modules/2.6.18-92.1.13.el5/kernel/drivers/video/nvidia/nvidia.ko
    /lib/modules/2.6.18-92.1.13.el5/kernel/drivers/video/nvidia/nvidia.ko
    /var/lib/dkms/nvidia/100.14.19-3.9.slp5/2.6.18-92.1.10.el5/i686/module/nvidia.ko
    /var/lib/dkms/nvidia/100.14.19-3.9.slp5/2.6.18-92.1.13.el5/i686/module/nvidia.ko

    [root@pc7377 ~]# rpm -q nvidia-x11-drv
    nvidia-x11-drv-100.14.19-3.9.slp5

    [root@pc7377 ~]# cp -i /etc/X11/xorg.conf /etc/X11/xorg.conf_orig

    [root@pc7377 ~]# yum --enablerepo=psi-beta update nvidia-x11-drv
    ...
    =============================================================================
     Package                 Arch       Version          Repository        Size
    =============================================================================
    Updating:
     nvidia-x11-drv          i386       169.12-4.9.slp5  psi-beta          9.7 M

    Transaction Summary
    =============================================================================
    Install      0 Package(s)
    Update       1 Package(s)
    Remove       0 Package(s)

    Total download size: 9.7 M
    Is this ok [y/N]: y
    Downloading Packages:
    (1/1): nvidia-x11-drv-169 100% |=========================| 9.7 MB    00:00
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
      Updating  : nvidia-x11-drv               ######################### [1/2]

      Cleanup   : nvidia-x11-drv               ######################### [2/2]

    Updated: nvidia-x11-drv.i386 0:169.12-4.9.slp5


- Note 

  `yum update` takes some time because it invokes dkms, which builds
  the required module(s) on the fly and does the cleaning up, see
  `nvidia.spec` or the output of `rpm -q --scripts RPM`::


    [root@pc7377 nvidia]# rpm -q --scripts nvidia-x11-drv-169.12-4.9.slp5
    postinstall scriptlet (using /bin/sh):
    /sbin/ldconfig
    # Make sure we have a Files section in xorg.conf, otherwise create an empty one
    XORGCONF=/etc/X11/xorg.conf
    [ -w ${XORGCONF} ] && ! grep -q 'Section "Files"' ${XORGCONF} && \
        echo -e 'Section "Files"\nEndSection' >> ${XORGCONF}
    # Enable the proprietary driver
    /usr/sbin/nvidia-config-display enable || :
    # Add to DKMS registry
    dkms add -m nvidia -v 169.12-4.9.slp5 -q || :
    # Rebuild and make available for the currenty running kernel
    dkms build -m nvidia -v 169.12-4.9.slp5 -q || :
    dkms install -m nvidia -v 169.12-4.9.slp5 -q --force || :
    /sbin/MAKEDEV nvidia
    preuninstall scriptlet (using /bin/sh):
    # Remove all versions from DKMS registry
    dkms remove -m nvidia -v 169.12-4.9.slp5 -q --all || :
    # Last removal, disable the proprietary driver
    if [ $1 -eq 0 ]; then
        /usr/sbin/nvidia-config-display disable || :
    fi
    postuninstall program: /sbin/ldconfig


Snapshot of output of `ps auxwf` during `yum update`::

    ...
      \_ /bin/bash
    root     16677  0.0  0.0   5968  1668 pts/1    S    17:25   0:00      |   \_ su -
    root     16681  0.0  0.0   4804  1440 pts/1    S    17:25   0:00      |       \_ -bash
    root     17409  1.6  2.1  55980 44440 pts/1    S+   17:43   0:04      |           \_ /usr/bin/python /usr/bin/yum --enablerepo=psi-beta
    root     17413  0.0  0.0   4452  1028 pts/1    S+   17:44   0:00      |               \_ /bin/sh /var/tmp/rpm-tmp.62532 2
    root     18088  0.0  0.0   5112  1764 pts/1    S+   17:45   0:00      |                   \_ /bin/bash /usr/sbin/dkms install -m nvidia
    root     18188  0.0  0.0   4456  1200 pts/1    S+   17:45   0:00      |                       \_ /bin/bash /sbin/weak-modules --add-modu
    root     19238  0.0  0.0   4460   692 pts/1    S+   17:47   0:00      |                           \_ /bin/bash /sbin/weak-modules --add-
    root     19243  5.5  0.0   2004   452 pts/1    D+   17:47   0:00      |                               \_ zcat /boot/initrd-2.6.18-53.1.4
    root     19244  2.5  0.0   1816   496 pts/1    S+   17:47   0:00      |                               \_ cpio -i
    ...


When the new nvidia RPM was installed the old stuff was not cleaned up
properly, the old module sources remained in the dkms tree under
`/var/lib/dkms/nvidia/` and has to be removed manually::

    [root@pc7377 etc]# dkms status -m nvidia
    nvidia, 100.14.19-3.9.slp5: added
    nvidia, 169.12-4.9.slp5, 2.6.18-92.1.13.el5, i686: installed
    nvidia, 169.12-4.9.slp5, 2.6.18-53.1.4.el5, i686: installed-weak from 2.6.18-92.1.13.el5
    nvidia, 169.12-4.9.slp5, 2.6.18-53.1.21.el5, i686: installed-weak from 2.6.18-92.1.13.el5
    nvidia, 169.12-4.9.slp5, 2.6.18-92.1.10.el5, i686: installed-weak from 2.6.18-92.1.13.el5

    # rm -rf /var/lib/dkms/nvidia/100.14.19-3.9.slp5/
    # dkms status -m nvidia
    nvidia, 169.12-4.9.slp5, 2.6.18-92.1.13.el5, i686: installed
    nvidia, 169.12-4.9.slp5, 2.6.18-53.1.4.el5, i686: installed-weak from 2.6.18-92.1.13.el5
    nvidia, 169.12-4.9.slp5, 2.6.18-53.1.21.el5, i686: installed-weak from 2.6.18-92.1.13.el5
    nvidia, 169.12-4.9.slp5, 2.6.18-92.1.10.el5, i686: installed-weak from 2.6.18-92.1.13.el5

The `.../weak-updates/...` nvidia modules below are symbolic links to
`/lib/modules/2.6.18-92.1.13.el5/kernel/drivers/video/nvidia/nvidia.ko`,
which is identical with
`/var/lib/dkms/nvidia/169.12-4.9.slp5/2.6.18-92.1.13.el5/i686/module/nvidia.ko`::

    [root@pc7377 etc]# updatedb
    [root@pc7377 etc]# locate nvidia.ko
    /lib/modules/2.6.18-53.1.21.el5/weak-updates/lib/modules/2.6.18-92.1.13.el5/kernel/drivers/video/nvidia/nvidia.ko
    /lib/modules/2.6.18-53.1.4.el5/weak-updates/lib/modules/2.6.18-92.1.13.el5/kernel/drivers/video/nvidia/nvidia.ko
    /lib/modules/2.6.18-92.1.10.el5/weak-updates/lib/modules/2.6.18-92.1.13.el5/kernel/drivers/video/nvidia/nvidia.ko
    /lib/modules/2.6.18-92.1.13.el5/kernel/drivers/video/nvidia/nvidia.ko
    /var/lib/dkms/nvidia/169.12-4.9.slp5/2.6.18-92.1.13.el5/i686/module/nvidia.ko


Nvidia related lines in `/var/log/messages`::

    ...
    Oct 23 17:48:12 pc7377 Updated: nvidia-x11-drv.i386 169.12-4.9.slp5
    ...
    Oct 24 11:16:04 pc7377 kernel: NVRM: API mismatch: the client has the version 169.12, but
    Oct 24 11:16:04 pc7377 kernel: NVRM: this kernel module has the version 100.14.19.  Please
    Oct 24 11:16:04 pc7377 kernel: NVRM: make sure that this kernel module and all NVIDIA driver
    Oct 24 11:16:04 pc7377 kernel: NVRM: components have the same version.
    Oct 24 11:16:05 pc7377 gdm[6706]: gdm_slave_xioerror_handler: Fatal X error - Restarting :0
    Oct 24 11:16:09 pc7377 kernel: NVRM: API mismatch: the client has the version 169.12, but
    Oct 24 11:16:09 pc7377 kernel: NVRM: this kernel module has the version 100.14.19.  Please
    Oct 24 11:16:09 pc7377 kernel: NVRM: make sure that this kernel module and all NVIDIA driver
    Oct 24 11:16:09 pc7377 kernel: NVRM: components have the same version.
    Oct 24 11:16:10 pc7377 gdm[3734]: gdm_slave_xioerror_handler: Fatal X error - Restarting :0
    Oct 24 11:16:13 pc7377 kernel: NVRM: API mismatch: the client has the version 169.12, but
    Oct 24 11:16:13 pc7377 kernel: NVRM: this kernel module has the version 100.14.19.  Please
    Oct 24 11:16:13 pc7377 kernel: NVRM: make sure that this kernel module and all NVIDIA driver
    Oct 24 11:16:13 pc7377 kernel: NVRM: components have the same version.
    Oct 24 11:16:14 pc7377 gdm[3752]: gdm_slave_xioerror_handler: Fatal X error - Restarting :0
    Oct 24 11:16:14 pc7377 gdm[6489]: deal_with_x_crashes: Running the XKeepsCrashing script
    ...
    Oct 24 11:27:45 pc7377 kernel: nvidia: module license 'NVIDIA' taints kernel.
    Oct 24 11:27:45 pc7377 kernel: ACPI: PCI Interrupt 0000:01:00.0[A] -> GSI 16 (level, low) -> IRQ 169
    Oct 24 11:27:45 pc7377 kernel: NVRM: loading NVIDIA UNIX x86 Kernel Module  169.12  Thu Feb 14 17:53:07 PST 2008
    ...
