警告

警告

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) が、他の人はインストールしたものによっては、依存関係がひどく壊れてしまう可能性があります。

関連情報