Warnung

Warnung

Wie kann ich die aktuelle Betaversion 302 des Nvidia-Treibers (der endlich die RandR-Erweiterung unterstützt!) mit einem Echtzeitkernel in Precise verwenden?

Diese Frageenthält Informationen zum Aktivieren der aktuellen Version 295 für den 3.4-Kernel mit dem RT-Patch. Ich suche jedoch nach einer Antwort, die den NVIDIA-Treiber mithilfe des Paketmanagers und nicht des NVIDIA-Installationsprogramms installiert (dessen Installationen ab und zu abbrechen, weil das Paketverwaltungssystem Dateien überschreibt).

Antwort1

Warnung

Der Patch indiese Frageist für Kernel 3.4, ebenso wie das Folgende; ein mit Echtzeit-Patches versehener Kernel 3.4 ist erforderlich.

Der neue NVIDIA 302-Treiber erfordert die Video-ABI, die xorg-server 1.12 bereitstellt, und leider wird Precise mit xorg-server 1.11 ausgeliefert. Die folgenden Anweisungen beinhalten das Hinzufügen derxorg-edgers PPAals Softwarequelle, um xorg-server 1.12 bereitzustellen, und dies birgt ein gewisses Risiko von Störungen. Die Deinstallationsanweisungen finden Sie unten, aber lesen Sie sie dort gründlich durch, um mögliche Probleme zu vermeiden.

Anweisungen

Ändern des gepackten NVIDIA-Treibers

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


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

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

    dpkg-deb -x nvidia-current_*.deb deb_contents && dpkg-deb --control nvidia-current_*.deb deb_contents/DEBIAN
    
  • Fügen Sie den Patch zum 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 Folgendes 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
    
  • Verpacken Sie den Treiber neu mit:

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

Installieren des PPA und des geänderten Treibers

  • Fügen Sie 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-Datei mit:


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

Auf dem Laufenden gehalten werden

Das xorg-edgers PPA wird mit neueren Versionen des NVIDIA-Treibers aktualisiert, sobald diese herauskommen. Sie müssen die oben stehenden Anweisungen zum Neuverpacken bei jeder neuen Version wiederholen.

Deinstallation

DusollenSie können nouveaumit Folgendem auf den Treiber zurückgreifen:

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

In meinem Fall umfasste dieser Vorgang die Deinstallation winezusammen mit einigen i386-Paketen (die stattdessen heruntergestuft werden sollten). Seien Sie vorsichtig, ppa-purgewenn Sie amd64 verwenden, da esverträgt sich nicht gut mit Multiarch(wie in den PPA-Warnungen angegeben); in meinem Fall gab es kein Problem (ich habe es einfach neu installiert wine), bei anderen Personen kann es jedoch, abhängig von der installierten Version, zu stark beschädigten Abhängigkeiten kommen.

verwandte Informationen