it-swarm.com.de

Verwenden des RandR-fähigen Beta-Treibers für nvidia 302.xx in Version 12.04 mit einem Echtzeit-Kernel

Wie kann ich die aktuelle Beta-Version der 302-Version des NVIDIA-Treibers (die endlich die RandR-Erweiterung unterstützt!) Mit einem Echtzeit-Kernel in Precise verwenden?

Diese Frage enthält Informationen zum Aktivieren der aktuellen 295-Version für den 3.4-Kernel mit dem Patch RT. Ich suche jedoch nach einer Antwort, bei der der nvidia-Treiber nicht mit dem Installationsprogramm von nvidia, sondern mit dem Paket-Manager installiert wird (dessen Installation aufgrund des Überschreibens von Dateien durch das Paketverwaltungssystem immer wieder unterbrochen wird).

7
pablomme

Warnung

Der Patch in diese Frage ist für Kernel 3.4, und so ist auch der unten stehende; Ein in Echtzeit gepatchter Kernel 3.4 ist erforderlich.

Der neue nvidia 302-Treiber benötigt die von xorg-server 1.12 bereitgestellte Video-ABI, und Precise wird leider mit xorg-server 1.11 ausgeliefert. Die folgenden Anweisungen beinhalten das Hinzufügen von xorg-edgers PPA als Softwarequelle, um xorg-server 1.12 bereitzustellen, und dies birgt ein gewisses Bruchrisiko. Die Anweisungen zur Deinstallation finden Sie unten, aber lesen Sie sie durch, um mögliche Probleme zu erkennen.

Anleitung

Ändern des verpackten NVIDIA-Treibers

  • Erstellen Sie ein temporäres Verzeichnis und wechseln Sie in dieses mit:

    mkdir -p ~/tmp/nvidia_302_fixrt && cd ~/tmp/nvidia_302_fixrt
    
  • Laden Sie die Datei nvidia-current_302 * .deb aus der PPA von xorg-edgers herunter, indem Sie die Pakete für Precise unter nvidia-graphics-driver_302 * hier durchsuchen. Zum Zeitpunkt dieses Schreibens kann ein direkter Download durchgeführt werden mit:

    wget https://launchpad.net/~xorg-edgers/+archive/ppa/+files/nvidia-current_302.17-0ubuntu1~xedgers~precise1_AMD64.deb
    
  • Extrahiere die .deb mit:

    dpkg-deb -x nvidia-current_*.deb deb_contents && dpkg-deb --control nvidia-current_*.deb deb_contents/DEBIAN
    
  • Fügen Sie den Patch zum Verzeichnis deb_contents/usr/src/nvidia-current*/patches hinzu, indem Sie Folgendes in ein Terminal einfügen:

    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
    
  • Fügen Sie den Patch zu dkms.conf hinzu, indem Sie ihn in ein Terminal einfügen:

    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
    
  • Ändern Sie die Versionsnummer in deb_contents/DEBIAN/control, indem Sie Folgendes eingeben:

    
sed -i 's/^\(Version: .*\)$/\1+rtfix/' deb_contents/DEBIAN/control
    
  • Packen Sie den Treiber neu mit:

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

Installieren der PPA und des geänderten Treibers

  • Füge das xorg-edgers PPA hinzu:

    
Sudo add-apt-repository ppa:xorg-edgers/ppa && Sudo apt-get update && Sudo apt-get dist-upgrade
    
  • Installieren Sie die lokal geänderte .deb mit:

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

Auf dem Laufenden gehalten werden

Die xorg-edgers PPA werden mit neueren Versionen des NVIDIA-Treibers aktualisiert, sobald sie herauskommen. Sie müssen die obigen Anweisungen zum erneuten Verpacken bei jeder neuen Version wiederholen.

Deinstallation

Sie sollten in der Lage sein, auf den nouveau -Treiber wie folgt zurückzugreifen:

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

In meinem Fall umfasste dieser Prozess die Deinstallation von wine zusammen mit einigen i386-Paketen (die stattdessen heruntergestuft werden sollten). Seien Sie vorsichtig bei ppa-purge, wenn Sie sich auf AMD64 befinden, da es nicht gut mit Multiarch zurechtkommt (wie in den PPA-Warnungen angegeben); In meinem Fall war das Ergebnis kein Problem (ich habe wine einfach neu installiert), aber abhängig von der installierten Version könnten andere Benutzer schwer beschädigte Abhängigkeiten haben.

4
pablomme