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

7

Wie kann ich die aktuelle Beta der 302-Version des NVIDIA-Treibers (der 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 RT-Patch. Ich suche jedoch nach einer Antwort, bei der der NVIDIA-Treiber mithilfe des Paketmanagers und nicht mithilfe des Installationsprogramms von NVIDIA installiert wird (dessen Installationen aufgrund des Überschreibens von Dateien durch das Paketverwaltungssystem immer wieder unterbrochen werden).

pablomme
quelle

Antworten:

4

Warnung

Der Patch in dieser Frage bezieht sich auf Kernel 3.4, ebenso wie der folgende. Ein in Echtzeit gepatchter Kernel 3.4 ist erforderlich.

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

Anleitung

Ändern des gepackten NVIDIA-Treibers

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


    mkdir -p ~/tmp/nvidia_302_fixrt && cd ~/tmp/nvidia_302_fixrt
    
  • Laden Sie die Datei nvidia-current_302 * .deb von der xorg-edgers-PPA 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
    
  • Extrahieren Sie 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 dem deb_contents/usr/src/nvidia-current*/patchesVerzeichnis 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 ausgeben:

    
sed -i 's/^\(Version: .*\)$/\1+rtfix/' deb_contents/DEBIAN/control
    
  • Packen Sie den Treiber neu ein 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ügen Sie die 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 wird 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, wie nouveaufolgt zum Treiber zurückzukehren:

    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 winezusammen mit einigen i386-Paketen (die stattdessen herabgestuft werden sollten). Seien Sie vorsichtig, ppa-purgewenn Sie auf amd64 sind, da es mit Multiarch nicht gut zurechtkommt (wie in den PPA-Warnungen angegeben). In meinem Fall war das Ergebnis kein Problem (ich habe es einfach neu installiert wine), aber andere Benutzer haben möglicherweise stark unterbrochene Abhängigkeiten, je nachdem, was sie installiert haben.

pablomme
quelle
Benötigt dies tatsächlich einen 3.4-Kernel oder würde ein 3.2-Kernel, der mit den Echtzeiterweiterungen gepatcht ist, ausreichen? Mühe, relevante Erwähnung in den Versionshinweisen zu finden ...
David Fraser
2
Der Patch, mit dem die NVIDIA-Kernel-Oberfläche gut mit einem RT-gepatchten Kernel funktioniert, funktioniert für 3.4, nicht jedoch für 3.2. Es sollte möglich sein, den Patch für 3.2 anzupassen, aber ich habe es nicht versucht, und ich weiß nicht, wie nicht trivial das werden könnte. Kurz gesagt, Sie benötigen 3.4 nicht für seine Funktionen. Es ist nur so, dass ein nvidia + RT-Patch für 3.2 nicht verfügbar ist (wie in "Ich habe keinen mit Google gefunden").
Pablomme