
Precise のリアルタイム カーネルで、nvidia ドライバーの最新ベータ版 302 バージョン (ついに RandR 拡張をサポート!) を使用するにはどうすればよいですか?
この質問RT パッチを使用して 3.4 カーネルの現在の 295 バージョンを有効にする方法に関する情報が含まれています。ただし、nvidia のインストーラー (パッケージ管理システムがファイルを上書きするため、インストールが頻繁に中断される) ではなく、パッケージ マネージャーを使用して nvidia ドライバーをインストールする方法を探しています。
答え1
警告
パッチのこの質問はカーネル 3.4 用であり、以下のものも同様です。リアルタイム パッチを適用したカーネル 3.4 が必要です。
新しいnvidia 302ドライバにはxorg-server 1.12が提供するビデオABIが必要ですが、残念ながらPreciseにはxorg-server 1.11が付属しています。以下の手順では、xorg-edgers PPAxorg-server 1.12 を提供するためのソフトウェア ソースとして、これは破損のリスクを伴います。アンインストール手順は下部にありますが、問題が発生する可能性があるので、よく読んでください。
説明書
パッケージ化されたnvidiaドライバの変更
一時ディレクトリを作成し、次のコマンドでそこに移動します。
mkdir -p ~/tmp/nvidia_302_fixrt && cd ~/tmp/nvidia_302_fixrt
nvidia-graphics-driver_302* の下にある 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
PPAと修正されたドライバーのインストール
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をppa-purge
使用している場合は注意してください。マルチアーキテクチャと相性がよくない(PPA の警告に示されているように)。私の場合、結果は問題ありませんでした (単に を再インストールしましたwine
) が、他の人はインストールしたものによっては、依存関係がひどく壊れてしまう可能性があります。