Comment utiliser la version bêta récente de la version 302 du pilote nvidia (qui prend enfin en charge l'extension RandR!) Avec un noyau temps réel dans Precise?
Cette question contient des informations sur l'activation de la version 295 actuelle du noyau 3.4 avec le correctif RT. Mais je cherche une réponse qui installe le pilote nvidia à l'aide du gestionnaire de paquets plutôt que du programme d'installation de nvidia (dont les installations s'arrêtent de temps en temps à cause du remplacement du système de gestion des paquets).
Le correctif dans cette question est destiné au noyau 3.4, de même que celui ci-dessous; un noyau 3.4 en temps réel corrigé est requis.
Le nouveau pilote nvidia 302 nécessite l’ABI vidéo fournie par xorg-server 1.12. Malheureusement, Precise est livré avec xorg-server 1.11. Les instructions suivantes impliquent l'ajout de xorg-edgers PPA en tant que source logicielle pour fournir xorg-server 1.12, ce qui présente un certain risque de défaillance. Les instructions de désinstallation sont en bas, mais lisez-les à la recherche d'éventuels hoquets.
Créez un répertoire temporaire et changez-le avec:
mkdir -p ~/tmp/nvidia_302_fixrt && cd ~/tmp/nvidia_302_fixrt
Téléchargez le fichier nvidia-current_302 * .deb depuis le PPA de xorg-edgers en parcourant les packages de Precise sous nvidia-graphics-driver_302 * ici . Au moment d'écrire ces lignes, un téléchargement direct peut être effectué avec:
wget https://launchpad.net/~xorg-edgers/+archive/ppa/+files/nvidia-current_302.17-0ubuntu1~xedgers~precise1_AMD64.deb
Extrayez le .deb avec:
dpkg-deb -x nvidia-current_*.deb deb_contents && dpkg-deb --control nvidia-current_*.deb deb_contents/DEBIAN
Ajoutez le patch dans le répertoire deb_contents/usr/src/nvidia-current*/patches
en collant les éléments suivants dans un 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
Ajoutez le patch à dkms.conf en le collant dans un 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
Modifiez le numéro de version dans deb_contents/DEBIAN/control en indiquant:
sed -i 's/^\(Version: .*\)$/\1+rtfix/' deb_contents/DEBIAN/control
Reconditionnez le pilote avec:
dpkg -b deb_contents nvidia-current_$(sed -n 's/^\(Version: *\)//p' deb_contents/DEBIAN/control)_AMD64.deb
Ajoutez le PPA xorg-edgers:
Sudo add-apt-repository ppa:xorg-edgers/ppa && Sudo apt-get update && Sudo apt-get dist-upgrade
Installez le .deb modifié localement avec:
Sudo dpkg -i nvidia-current_*+rtfix_*.deb
Le PPA de xorg-edgers mettra à jour les versions les plus récentes du pilote nvidia au fur et à mesure de leur sortie; vous devrez répéter les instructions de réemballage ci-dessus à chaque nouvelle version.
Vous devriez pouvoir revenir au pilote nouveau
avec les éléments suivants:
Sudo apt-get remove nvidia-current
Sudo apt-get install ppa-purge
Sudo ppa-purge ppa:xorg-edgers/ppa
Dans mon cas, ce processus impliquait de désinstaller wine
ainsi que des packages i386 (qui auraient dû être rétrogradés à la place). Méfiez-vous de ppa-purge
si vous êtes sur AMD64 car il ne s'entend pas bien avec multiarch (comme indiqué dans les avertissements PPA); dans mon cas, le résultat n'était pas un problème (j'ai simplement réinstallé wine
), mais d'autres personnes pourraient se retrouver avec des dépendances gravement endommagées, en fonction de ce qu'elles ont installé.