最近把自己的内核更新到了最新的 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