在12.04中使用支持RandR的nvidia 302.xx beta驱动程序和实时内核

我怎样才能使用最新版本的nvidia驱动程序的302版本(最终支持RandR扩展!)和Precise中的实时内核?

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

警告

这个问题的补丁是针对内核3.4的,下面是一个补丁。 需要一个实时修补的内核3.4。

新的nvidia 302驱动程序需要xorg-server 1.12提供的videoABI,不幸的是,Precise附带了xorg-server 1.11。 以下说明涉及添加xorg-edgers PPA作为软件源以提供xorg-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 -ua/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  + #include  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  + #include  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 -ua/nv-linux.hb/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 ,因为它与multiarch不相容 (如PPA警告中所示); 在我的情况下,结果是一个非问题(我只是重新安装wine ),但其他人可能最终依赖于他们安装的东西严重破坏依赖。