
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*/patches
Verzeichnis 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 nouveau
mit 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 wine
zusammen mit einigen i386-Paketen (die stattdessen heruntergestuft werden sollten). Seien Sie vorsichtig, ppa-purge
wenn 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.