Preciseのリアルタイムカーネルでnvidiaドライバーの302バージョン(最終的にRandR拡張機能をサポートします!)の最近のベータ版を使用するにはどうすればよいですか?
この質問 には、RTパッチで3.4カーネルの現在のバージョンを有効にする情報が含まれています。ただし、nvidiaのインストーラーではなくパッケージマネージャーを使用してnvidiaドライバーをインストールする(パッケージ管理システムがファイルを上書きするためにインストールが頻繁に中断する)答えを探しています。
この質問 のパッチはカーネル3.4用であり、以下も同様です。リアルタイムパッチカーネル3.4が必要です。
新しいnvidia 302ドライバーには、xorg-server 1.12が提供するビデオABIが必要ですが、残念ながらPreciseにはxorg-server 1.11が付属しています。次の手順では、x--server 1.12を提供するソフトウェアソースとして xorg-edgers PPA を追加します。これにより、特定の破損リスクが生じます。アンインストール手順は下部にありますが、問題がある可能性がある場合はそれらを読んでください。
一時ディレクトリを作成し、次のように変更します。
mkdir -p ~/tmp/nvidia_302_fixrt && cd ~/tmp/nvidia_302_fixrt
Nvidia-graphics-driver_302 * here の下にあるPreciseのパッケージを参照して、xorg-edgers PPAからnvidia-current_302 * .debをダウンロードします。この記事の執筆時点で、直接ダウンロードは次の方法で実行できます。
wget https://launchpad.net/~xorg-edgers/+archive/ppa/+files/nvidia-current_302.17-0ubuntu1~xedgers~precise1_AMD64.deb
次を使用して.debを抽出します。
dpkg-deb -x nvidia-current_*.deb deb_contents && dpkg-deb --control nvidia-current_*.deb deb_contents/DEBIAN
ターミナルに次を貼り付けて、パッチをdeb_contents/usr/src/nvidia-current*/patches
ディレクトリに追加します。
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
これをターミナルに貼り付けてdkms.confにパッチを追加します。
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
以下を発行して、deb_contents/DEBIAN/controlのバージョン番号を変更します。
sed -i 's/^\(Version: .*\)$/\1+rtfix/' deb_contents/DEBIAN/control
以下を使用してドライバーを再パッケージ化します。
dpkg -b deb_contents nvidia-current_$(sed -n 's/^\(Version: *\)//p' deb_contents/DEBIAN/control)_AMD64.deb
Xorg-edgers PPAを追加します。
Sudo add-apt-repository ppa:xorg-edgers/ppa && Sudo apt-get update && Sudo apt-get dist-upgrade
ローカルで変更された.debをインストールします。
Sudo dpkg -i nvidia-current_*+rtfix_*.deb
Xorg-edgers PPAは、新しいバージョンのnvidiaドライバーがリリースされると更新されます。新しいリリースごとに上記の再パッケージング手順を繰り返す必要があります。
次のようにして、nouveau
ドライバーに戻すことができます。
Sudo apt-get remove nvidia-current
Sudo apt-get install ppa-purge
Sudo ppa-purge ppa:xorg-edgers/ppa
私の場合、このプロセスではwine
をいくつかのi386パッケージ(代わりにダウングレードする必要があります)とともにアンインストールしました。 AMD64を使用している場合は、がmultiarchとうまくいかないため、ppa-purge
に注意してください(PPA警告に示されているように)。私の場合、結果は問題ではありませんでした(私はwine
を再インストールしました)が、インストールしたものによっては依存関係がひどく壊れてしまう可能性があります。