在具有实时内核的 12.04 中使用启用 RandR 的 nvidia 302.xx beta 驱动程序

pab*_*mme 7 packaging nvidia realtime 12.04 randr

如何在 Precise 中使用带有实时内核的 302 版 nvidia 驱动程序(最终支持 RandR 扩展!)的最新测试版?

此问题包含有关使用 RT 补丁为 3.4 内核启用当前 295 版本的信息。但是我正在寻找使用包管理器而不是 nvidia 的安装程序安装 nvidia 驱动程序的答案(由于包管理系统覆盖文件,其安装经常中断)。

pab*_*mme 4

警告

\n\n

这个问题中的补丁是针对内核3.4的,下面的补丁也是如此;需要实时修补的内核 3.4。

\n\n

新的 nvidia 302 驱动程序需要 xorg-server 1.12 提供的视频 ABI,不幸的是 Precise 随 xorg-server 1.11 一起提供。以下说明涉及添加xorg-edgers PPA作为软件源以提供 xorg-server 1.12,这会带来一定的损坏风险。卸载说明位于底部,但请通读它们以防止可能出现的问题。

\n\n

指示

\n\n

修改打包好的nvidia驱动

\n\n
    \n
  • 创建一个临时目录并更改为:\xe2\x80\xa8

    \n\n
    mkdir -p ~/tmp/nvidia_302_fixrt && cd ~/tmp/nvidia_302_fixrt\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 通过浏览 nvidia-graphics-driver_302* 下的 Precise 软件包,从 xorg-edgers PPA 下载 nvidia-current_302* .deb。在撰写本文时,可以通过以下方式执行直接下载:

    \n\n
    wget https://launchpad.net/~xorg-edgers/+archive/ppa/+files/nvidia-current_302.17-0ubuntu1~xedgers~precise1_amd64.deb\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 使用以下命令提取 .deb:

    \n\n
    dpkg-deb -x nvidia-current_*.deb deb_contents && dpkg-deb --control nvidia-current_*.deb deb_contents/DEBIAN\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • deb_contents/usr/src/nvidia-current*/patches通过在终端中粘贴以下内容将补丁添加到目录中:

    \n\n
    d=$(echo deb_contents/usr/src/nvidia-current*/patches) ; cat > $d/buildfix_kernel_rt_3.4.patch <<\'EOF\'\ndiff -u a/conftest.sh b/conftest.sh\n--- a/conftest.sh       2012-05-03 09:49:19.582854050 +0100\n+++ b/conftest.sh       2012-05-03 09:52:58.524101586 +0100\n@@ -95,7 +95,7 @@\n         fi\n     fi\n\n-    CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"\n+    CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS"\n\n     test_xen\n\n@@ -965,11 +965,12 @@\n             #\n             echo "$CONFTEST_PREAMBLE\n             #include <linux/acpi.h>\n+            #include <acpi/acpixf.h>\n             void conftest_acpi_walk_namespace(void) {\n                 acpi_walk_namespace();\n             }" > conftest$$.c\n\n-            $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1\n+            #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1\n             rm -f conftest$$.c\n\n             if [ -f conftest$$.o ]; then\n@@ -980,6 +981,7 @@\n\n             echo "$CONFTEST_PREAMBLE\n             #include <linux/acpi.h>\n+            #include <acpi/acpixf.h>\n             void conftest_acpi_walk_namespace(void) {\n                 acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);\n             }" > conftest$$.c\n@@ -1604,6 +1606,9 @@\n             fi\n         fi\n\n+        RET=0\n+        SELECTED_MAKEFILE=Makefile.kbuild\n+\n         if [ "$RET" = "0" ]; then\n             ln -s $SELECTED_MAKEFILE Makefile\n             exit 0\ndiff -u a/nv-linux.h b/nv-linux.h\n--- a/nv-linux.h        2012-05-03 09:49:19.622853547 +0100\n+++ b/nv-linux.h        2012-05-03 09:56:12.045668690 +0100\n@@ -291,7 +291,18 @@\n #endif\n #endif\n\n-#if defined(CONFIG_PREEMPT_RT)\n+#if defined(CONFIG_PREEMPT_RT_FULL)\n+typedef raw_spinlock_t            nv_spinlock_t;\n+#define NV_SPIN_LOCK_INIT(lock)   raw_spin_lock_init(lock)\n+#define NV_SPIN_LOCK_IRQ(lock)    raw_spin_lock_irq(lock)\n+#define NV_SPIN_UNLOCK_IRQ(lock)  raw_spin_unlock_irq(lock)\n+#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)\n+#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \\\n+   raw_spin_unlock_irqrestore(lock,flags)\n+#define NV_SPIN_LOCK(lock)        raw_spin_lock(lock)\n+#define NV_SPIN_UNLOCK(lock)      raw_spin_unlock(lock)\n+#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)\n+#elif defined(CONFIG_PREEMPT_RT)\n typedef atomic_spinlock_t         nv_spinlock_t;\n #define NV_SPIN_LOCK_INIT(lock)   atomic_spin_lock_init(lock)\n #define NV_SPIN_LOCK_IRQ(lock)    atomic_spin_lock_irq(lock)\n@@ -954,7 +965,9 @@\n     return ret;\n }\n\n-#if defined(CONFIG_PREEMPT_RT)\n+#if defined(CONFIG_PREEMPT_RT_FULL)\n+#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)\n+#elif defined(CONFIG_PREEMPT_RT)\n #define NV_INIT_MUTEX(mutex) semaphore_init(mutex)\n #else\n #if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)\nEOF\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 通过将以下内容粘贴到终端中,将补丁添加到 dkms.conf:

    \n\n
    d=$(echo deb_contents/usr/src/nvidia-current*) ; cat >> $d/dkms.conf <<\'EOF\'\nPATCH_MATCH[1]="^3\\.4.*(rt|realtime)"\nPATCH[1]="buildfix_kernel_rt_3.4.patch"\nEOF\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 通过发出以下命令修改 deb_contents/DEBIAN/control 中的版本号:

    \n\n
    \xe2\x80\xa8sed -i \'s/^\\(Version: .*\\)$/\\1+rtfix/\' deb_contents/DEBIAN/control\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 重新打包驱动程序:

    \n\n
    \xe2\x80\xa8dpkg -b deb_contents nvidia-current_$(sed -n \'s/^\\(Version: *\\)//p\' deb_contents/DEBIAN/control)_amd64.deb\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n

安装 PPA 和修改后的驱动程序

\n\n\n\n

保持最新状态

\n\n

xorg-edgers PPA 将随着 nvidia 驱动程序的新版本发布而更新;您将需要对每个新版本重复上面的重新打包说明。

\n\n

卸载

\n\n

应该能够nouveau使用以下命令恢复驱动程序:

\n\n
    sudo apt-get remove nvidia-current\n    sudo apt-get install ppa-purge\n    sudo ppa-purge ppa:xorg-edgers/ppa\n
Run Code Online (Sandbox Code Playgroud)\n\n

就我而言,这个过程涉及wine与一些 i386 软件包一起卸载(这些软件包应该被降级)。ppa-purge如果您使用的是 amd64,请小心,因为它与多体系结构不能很好地相处(如 PPA 警告中所示);就我而言,结果不是问题(我只是重新安装wine),但其他人可能最终会严重破坏依赖关系,具体取决于他们安装的内容。

\n

  • 使 nvidia 内核接口与 RT 补丁内核完美配合的补丁适用于 3.4,但不适用于 3.2。应该可以针对 3.2 调整补丁,但我还没有尝试过,而且我不知道这会变得多么重要。简而言之,您不需要 3.4 的功能,只是 3.2 没有 nvidia+RT 补丁(如“我还没有通过 google 找到一个补丁”)。 (2认同)