Advertencia

Advertencia

¿Cómo puedo usar la versión beta reciente de la versión 302 del controlador nvidia (¡que finalmente admite la extensión RandR!) con un kernel en tiempo real en Precise?

Esta preguntacontiene información sobre cómo habilitar la versión 295 actual para el kernel 3.4 con el parche RT. Pero estoy buscando una respuesta que instale el controlador de nvidia usando el administrador de paquetes en lugar del instalador de nvidia (cuyas instalaciones se interrumpen de vez en cuando debido a que el sistema de administración de paquetes sobrescribe archivos).

Respuesta1

Advertencia

el parche enesta preguntaes para el kernel 3.4, al igual que el siguiente; Se requiere un kernel 3.4 con parches en tiempo real.

El nuevo controlador nvidia 302 requiere la ABI de video que proporciona xorg-server 1.12 y, desafortunadamente, Precise viene con xorg-server 1.11. Las siguientes instrucciones implican agregar elPPA de xorg-edgerscomo fuente de software para proporcionar xorg-server 1.12, y esto plantea un cierto riesgo de rotura. Las instrucciones de desinstalación se encuentran en la parte inferior, pero léalas detenidamente para detectar posibles problemas.

Instrucciones

Modificar el controlador nvidia empaquetado

  • Cree un directorio temporal y cámbielo con:


    mkdir -p ~/tmp/nvidia_302_fixrt && cd ~/tmp/nvidia_302_fixrt
    
  • Descargue nvidia-current_302*.deb del PPA xorg-edgers explorando los paquetes de Precise en nvidia-graphics-driver_302*aquí. Al momento de escribir este artículo, se puede realizar una descarga directa con:

    wget https://launchpad.net/~xorg-edgers/+archive/ppa/+files/nvidia-current_302.17-0ubuntu1~xedgers~precise1_amd64.deb
    
  • Extraiga el .deb con:

    dpkg-deb -x nvidia-current_*.deb deb_contents && dpkg-deb --control nvidia-current_*.deb deb_contents/DEBIAN
    
  • Agregue el parche al deb_contents/usr/src/nvidia-current*/patchesdirectorio pegando lo siguiente en una terminal:

    d=$(echo deb_contents/usr/src/nvidia-current*/patches) ; cat > $d/buildfix_kernel_rt_3.4.patch <<'EOF'
    diff -u a/conftest.sh b/conftest.sh
    --- a/conftest.sh       2012-05-03 09:49:19.582854050 +0100
    +++ b/conftest.sh       2012-05-03 09:52:58.524101586 +0100
    @@ -95,7 +95,7 @@
             fi
         fi
    
    -    CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
    +    CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS"
    
         test_xen
    
    @@ -965,11 +965,12 @@
                 #
                 echo "$CONFTEST_PREAMBLE
                 #include <linux/acpi.h>
    +            #include <acpi/acpixf.h>
                 void conftest_acpi_walk_namespace(void) {
                     acpi_walk_namespace();
                 }" > conftest$$.c
    
    -            $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
    +            #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
                 rm -f conftest$$.c
    
                 if [ -f conftest$$.o ]; then
    @@ -980,6 +981,7 @@
    
                 echo "$CONFTEST_PREAMBLE
                 #include <linux/acpi.h>
    +            #include <acpi/acpixf.h>
                 void conftest_acpi_walk_namespace(void) {
                     acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);
                 }" > conftest$$.c
    @@ -1604,6 +1606,9 @@
                 fi
             fi
    
    +        RET=0
    +        SELECTED_MAKEFILE=Makefile.kbuild
    +
             if [ "$RET" = "0" ]; then
                 ln -s $SELECTED_MAKEFILE Makefile
                 exit 0
    diff -u a/nv-linux.h b/nv-linux.h
    --- a/nv-linux.h        2012-05-03 09:49:19.622853547 +0100
    +++ b/nv-linux.h        2012-05-03 09:56:12.045668690 +0100
    @@ -291,7 +291,18 @@
     #endif
     #endif
    
    -#if defined(CONFIG_PREEMPT_RT)
    +#if defined(CONFIG_PREEMPT_RT_FULL)
    +typedef raw_spinlock_t            nv_spinlock_t;
    +#define NV_SPIN_LOCK_INIT(lock)   raw_spin_lock_init(lock)
    +#define NV_SPIN_LOCK_IRQ(lock)    raw_spin_lock_irq(lock)
    +#define NV_SPIN_UNLOCK_IRQ(lock)  raw_spin_unlock_irq(lock)
    +#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)
    +#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \
    +   raw_spin_unlock_irqrestore(lock,flags)
    +#define NV_SPIN_LOCK(lock)        raw_spin_lock(lock)
    +#define NV_SPIN_UNLOCK(lock)      raw_spin_unlock(lock)
    +#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)
    +#elif defined(CONFIG_PREEMPT_RT)
     typedef atomic_spinlock_t         nv_spinlock_t;
     #define NV_SPIN_LOCK_INIT(lock)   atomic_spin_lock_init(lock)
     #define NV_SPIN_LOCK_IRQ(lock)    atomic_spin_lock_irq(lock)
    @@ -954,7 +965,9 @@
         return ret;
     }
    
    -#if defined(CONFIG_PREEMPT_RT)
    +#if defined(CONFIG_PREEMPT_RT_FULL)
    +#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
    +#elif defined(CONFIG_PREEMPT_RT)
     #define NV_INIT_MUTEX(mutex) semaphore_init(mutex)
     #else
     #if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
    EOF
    
  • Agregue el parche a dkms.conf pegando esto en una terminal:

    d=$(echo deb_contents/usr/src/nvidia-current*) ; cat >> $d/dkms.conf <<'EOF'
    PATCH_MATCH[1]="^3\.4.*(rt|realtime)"
    PATCH[1]="buildfix_kernel_rt_3.4.patch"
    EOF
    
  • Modifique el número de versión en deb_contents/DEBIAN/control emitiendo:

    
sed -i 's/^\(Version: .*\)$/\1+rtfix/' deb_contents/DEBIAN/control
    
  • Vuelva a empaquetar el controlador con:

    
dpkg -b deb_contents nvidia-current_$(sed -n 's/^\(Version: *\)//p' deb_contents/DEBIAN/control)_amd64.deb
    

Instalación del PPA y el controlador modificado

  • Agregue el PPA de xorg-edgers:

    
sudo add-apt-repository ppa:xorg-edgers/ppa && sudo apt-get update && sudo apt-get dist-upgrade
    
  • Instale el .deb modificado localmente con:


    sudo dpkg -i nvidia-current_*+rtfix_*.deb
    

Mantenerse al día

El PPA xorg-edgers se actualizará con versiones más nuevas del controlador nvidia a medida que se publiquen; deberá repetir las instrucciones de reempaquetado anteriores con cada nueva versión.

Desinstalar

deberíapoder volver al nouveaucontrolador con lo siguiente:

    sudo apt-get remove nvidia-current
    sudo apt-get install ppa-purge
    sudo ppa-purge ppa:xorg-edgers/ppa

En mi caso, este proceso implicó la desinstalación winejunto con algunos paquetes i386 (que deberían haberse degradado). Tenga cuidado ppa-purgesi tiene AMD64 ya queno se lleva bien con multiarca(como se indica en las advertencias del PPA); en mi caso, el resultado no fue un problema (simplemente lo reinstalé wine), pero otras personas podrían terminar con dependencias muy rotas dependiendo de lo que hayan instalado.

información relacionada