openSUSE 12.3 更新 3.11 RC7 内核和 NVIDIA 325.15 驱动

最近把自己的内核更新到了最新的 3.11 RC7,特此记录以飨来者。

** 下载驱动: **

wget http://cn.download.nvidia.com/XFree86/Linux-x86/325.15/NVIDIA-Linux-x86_64-325.15.run

当然你也可以自己去 NVIDIA 官网 (nvidia.cn) 翻:

「驱动程序」-「全部驱动程序」-「Linux, FreeBSD, and Solaris 驱动程序」,根据系统架构选 x86 或 x86_64 然后下「短寿命分支」,点「下载」后是要你确认的,这里需要注意:

直接点「同意并开始下载」是会在浏览器新标签页打开那个 .run/.bin 驱动的 ,这一定不是你要的,所以请使用「另存为」。

** 升级内核: **

添加 Kernel:HEAD 源:

sudo zypper ar -f http://download.opensuse.org/repositories/Kernel:/HEAD/standard/ Kernel:HEAD
sudo zypper ref

升级内核:

sudo zypper up kernel-desktop kernel-source kernel-devel kernel-desktop-devel

当然你也可以打开 YaST -「软件源」添加源,YaST - 「软件管理」来更新软件包。

** 重启系统: **

在 Grub2 菜单处,按 e 编辑引导菜单,找到这行:

linux /boot/vmlinuz-3.11.0-rc7-2.g7032523-desktop root=UUID=9d003617-abbb-4bb1-a6ef-e866ba1debf2 resume=/dev/disk/by-id/ata-SAMSUNG_HN-M101MBB_S2R8J9BB808817-part1 splash=silent quiet showopts

把 splash=silent 替换成 splash=none,在 showopts 后面加个 3,变成:

linux /boot/vmlinuz-3.11.0-rc7-2.g7032523-desktop root=UUID=9d003617-abbb-4bb1-a6ef-e866ba1debf2 resume=/dev/disk/by-id/ata-SAMSUNG_HN-M101MBB_S2R8J9BB808817-part1 splash=none quiet showopts 3

然后按 F10 引导。

** 处理驱动: **

命令行登录。(输入普通用户名和密码)

如果是正常安装驱动的话,是用

su 
sh NVIDIA-Linux-x86_64-325.15.run

就可以安装驱动的(具体见:https://zh.opensuse.org/SDB:NVIDIA_手动安装)。

但是 325.15 对 3.10 以上的内核支持有点问题,我们需要 patch 一下。

这里为了凸显解决问题的过程,我把实验流程也记录一下。

首先像正常的那样安装,有几个 tricky 的地方:

  • 询问你是否用 DKMS 的时候,选择「no」,因为 NVIDIA 的 dkms 就没好用过。
  • 会有一个提示说你的内核是用 gcc 4.8 编译的,而你现在系统的 gcc 是 4.7,最好不要用不同的 gcc 版本编译内核和驱动,这是正常的,因为 Kernel:HEAD 源是针对 openSUSE Factory 的,openSUSE Factory 的 gcc 是 4.8。这里我们选择「no」,意思是我知道了但是不退出安装。

于是接下来出错了,让你看 /var/log/nvidia-installer.log 查找问题。我们

vi /var/log/nvidia-installer.log

用方向键滚动看一下日志。

error: ‘num_physpages’ undeclared (first use in this function)

是这个错误,于是祭出 Google,搜索「3.11 nvidia num_physpages",就找到了强大的 devtalk.nvidia.com (NVIDIA 的开发论坛):

devtalk.nvidia.com/default/topic/572088/ptoblem-with-nvidia-driver-on-linux-3-10-git/

--- a/kernel/nv-linux.h
+++ b/kernel/nv-linux.h
@@ -957,7 +957,11 @@ static inline int nv_execute_on_all_cpus
 #endif
 
 #if !defined(NV_VMWARE)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+#define NV_NUM_PHYSPAGES                get_num_physpages()
+#else
 #define NV_NUM_PHYSPAGES                num_physpages
+#endif
 #define NV_GET_CURRENT_PROCESS()        current->tgid
 #define NV_IN_ATOMIC()                  in_atomic()
 #define NV_LOCAL_BH_DISABLE()           local_bh_disable()

于是我们做一下,首先要解压驱动,使用

sh NVIDIA-Linux-x86_64-325.15.run --extract-only

就把驱动解压开了,然后

cd NVIDIA-Linux-x86_64-325.15/kernel
vi nv-linux.h

按 PgDn 键翻页到 950 行左右,就看到上面那个补丁的内容了,+ 号表示你要添加的。

按 i 键编辑,输入那些东西,然后按 :wq 保存退出。

接着

cd …

回到解压的驱动根目录,运行

./nvidia-installer

就可以重新运行驱动安装了,这次就会成功了。

** 屏蔽开源模块: **

编辑 /etc/modprobe.d/50-blacklist.conf

vi /etc/modprobe.d/50-blacklist.conf

按 PgDn 滚动到最后,按 i 键输入,添加这些内容

# with NVIDIA comericial driver installed, nouveau must be blacklisted
blacklist nouveau

然后 :wq 保存退出。

** 再次重启: **

shutdown -r now

** 清理: **

NVIDIA-Linux-x86_64-325.15.run
NVIDIA-Linux-x86_64-325.15 文件夹

都可以删除。

打开 YaST 软件管理,搜索 kernel,然后切换到「版本」选项卡,那些旧内核版本前面的勾点两下变成红叉,就把它们也清理掉了。

Enjoy

1赞

谢谢楼主,装上 3.11 内核。感觉笔记本温度要下降一点。