在 Linux 桌面系统下玩了这么久,大部分时间都是使用 Ubuntu,偶尔使用一下 Fedora。我的电脑中安装有多个 Linux 发行版,见这里《在同一个硬盘上安装多个Linux发行版及Fedora 21初体验》。在 Ubuntu 桌面系统中,安装 Nvidia 显卡驱动是分分钟的事,使用起来也一直很顺畅,见这里《桌面美化那点事儿》。然而到了 Fedora 中,则一直是好事多磨。特别是对于 Fedora 21 Workstation 版,在我的笔记本电脑上安装 Nvidia 驱动就没有一次获得好的结果。不管用哪一种方法,过程都很顺利,但是结果总是失败,总是进不了图形界面,总是出现这样的界面:
安装 Nvidia 驱动的三种方法
在 Fedora 中安装 Nvidia 显卡驱动可谓方法众多,我这次采用了三种方法,它们分别是:
- 到 Nvidia 官网下载官方驱动并安装。
- 使用第三方源中的软件包,我这里使用了 rpmfusion 中的 akmod-nvidia 软件包。
- 使用 Bumblebee,Bumblebee 是为解决双显卡切换问题而存在的一个开源产品,在前两个方法失败后,我以为失败的原因是我的笔记本电脑上有 Nvidia GT 720M 显卡和 Intel 集显共存,结果使用 Bumblebee 后,仍然出现同样的结局。
方法1:到 Nvidia 官网下载驱动并安装
直接访问 Nvidia 的官网 www.nvidia.com,找到驱动程序下载的页面,然后选择自己的硬件和软件平台,以便搜索合适的驱动,如下图:
选择最新的 346.47 版进行下载,带 BETA 字样的当然不考虑,如下图:
下载完以后是一个 NVIDIA-Linux-x86_64.346.47.run 文件,可以这样运行它:
运行 Nvidia 官方的这个安装程序需要相当强的心理素质,因为它会依次出现以下错误界面。
出错提示1:
出错提示2:
出错提示3:
出错提示4:
出错提示5:
还好我的内心足够强大,我居然耐着性子一遍一遍运行这个安装程序,直到把所有的这些问题都解决。第 1 个出错提示是说该安装程序必须以 root 权限运行,解决这个问题比较简单,使用sudo ./NVIDIA-Linux-x86_64.346.47.run
命令运行该程序或使用su
命令先切换到 root 用户再运行该程序均可。第 2 个出错提示是说不能在图形界面下安装 Nvidia 的显卡驱动,必须退出 X Server 才行。那么怎么样才能让 Fedora 21 开机后进入字符界面呢?这个问题我在该系列博文的第一篇《玩转Linux系统的方法论》中就有过探讨。不同的 Linux 发行版进入字符界面的方式不一样,Fedora 21 使用的 init 程序是 systemd,所以其进入字符界面的方法是以 root 用户运行systemctl set-default multi-user.target
命令,如下图:
本以为进入字符界面安装该驱动就一帆风顺了,结果发现我还是太天真。果然,第 3 个出错提示很快就出现了,它告诉我们安装这个驱动还要先安装 gcc。这个问题好解决,yum install gcc
搞定。然后再运行安装程序,结果第 4 个出错提示就出来了。太 TM 让人伤心了,该提示是说要安装该驱动必须得有 Linux 内核的源代码。解决这个问题花了我一点时间,本以为yum install kernel-devel
就可以解决问题,结果发现安装的 kernel-devel 的版本和系统本来的 kernel 版本不一致,只好再来一个yum update kernel
才解决问题。
然后,该安装程序顺利运行了,成功的对 Nvidia 驱动进行了编译,产生了相应的内核模块。本以为要大功告成了,结果第 5 条错误提示来了。我勒个去!该错误提示的意思是说 nvidia.ko 模块无法成功加载,那是因为 nouveau 模块还在。要禁掉 nouveau 模块,只需要在 /etc/modprobe.d 目录下建立一个 .conf 文件,在里面写上 blacklist nouveau 即可,这件事 Nvidia 驱动的安装程序已经帮我们做了,但是依然无法阻止 nouveau 模块的加载。为什么呢?那是因为 Linux 启动时会先加载 initramfs 中的模块,如果不更新 initramfs 的话,单纯写 /etc/modprobe.d 目录下的配置文件也没有什么用。在 Fedora 21 中更新 initramfs 使用这个命令dracut --force
。
最后,使用systemctl set-default graphical.target
命令设置让系统开机时进入图形界面,然后reboot
命令重启。如下图:
我怎么知道 Fedora 21 中更新 initramfs 的命令是 dracut 呢?这就是另外一个话题了,方法还是《玩转Linux系统的方法论》中写的方法。首先猜想建立 initramfs 文件或 initrd 文件的命令可能是mkinitramfs
或者mkinitrd
,然后再使用which
命令找出这系统中是否有这两个命令,再然后找出它属于哪个软件包,最后再找出这个软件包的文档即可。下面看看 Ubuntu 和 Fedora 21 要重建 initramfs,分别用什么工具:
虽然最终的结局是无法进入图形界面,但是仍然可以对该安装过程进行一些总结,如下:
- 显卡驱动属于 Linux 内核的内核模块,安装内核模块需要懂一点内核知识;
- 下载 Nvidia 的驱动;
- 需要退出图形界面,进入字符界面,命令为
systemctl set-default multi-user.target
,然后重启系统; - 需要安装 gcc,命令为
yum install gcc
; - 需要内核源代码,命令为
yum install kernel-devel
,而且每一次升级内核,都需要重新编译驱动; - 禁止启动时载入 nouveau 模块,方法为修改
/etc/modprobe.d
目录下的配置文件; - 更新 initramfs,命令为
dracut --force
; - 再次设置启动系统时进入图形界面,命令为
systemctl set-default graphical.target
; - 重启系统,命令为
reboot
;
以上命令都以 root 用户的权限运行。遵循该流程,你将成功得到本文开头所示的那个错误界面。恭喜你,Fedora 21 和 Nvidia 搭配,就是这个结局。
安装NVIDIA官方驱动失败后的补救办法
本次折腾最大的收获就是如何从错误中恢复,再也不是像以前那样一遇到进不了图形界面就重装系统了。方法是这样的,首先,按 Ctrl+Alt+F2 进入另一个控制台,以 root 用户登录。然后,我觉得 Linux 下的程序往往都会提供一点帮助,所以我用NVIDIA-Linux-x86_64-346.47.run -h
(也就是带 -h 选项)运行了一下,果然,该安装程序给出了一个帮助信息。在该帮助信息里面说,如果用 -x
选项运行该程序,就可以对该文件进行解压。然后,我就解压了,进去看了一下,然后就发现更多的帮助信息了。最后,通过运行解压目录中的nvidia-installer --uninstall
命令,我成功将 Nvidia 的驱动删除了。最后,dracut --force
一下让 nouveau 回来,重启一下就行了。如下图:
方法2:安装第三方软件源中的软件包(rpmfusion 源中的 akmod-nvidia)
其实玩 Linux,除了使用发行版官方的软件源之外,偶尔也要用用第三方的软件源,特别是对一些闭源的软件更是如此,比如各种音频、视频解码啊,Flash 播放啊什么的。当然,显卡驱动也是第三方源经常收录的重量级软件了。比较出名的第三方源是 fusion,这里我们使用 rpmfusion,到其官方网站 http://fpmfusion.org 看一下,如下图:
使用第三方源之前,使用yum list
命令找不到和 Nvidia 相关的驱动,然后添加 rpmfusion 源,如下图:
再次使用yum list
搜索 Nvidia 的驱动,得到的结果如下图:
最后,使用yum install akmod-nvidia
进行安装即可。
这里说一下 akmod,前面提到过,对于内核模块来说,每一次升级内核,内核模块都需要重新编译,如果每一次都手动操作的话工作量就太大了,所以需要一个自动化的工具,akmod 就是这样一个工具。和 akmod 功能相同的工具还有 dkms,这个工具我们之前见过,在 Ubuntu 中安装显卡驱动时就会自动安装 dkms,VirtualBox 虚拟机也会使用 dkms 管理它的内核模块。详见《虚拟机体验之VirtualBox篇——性能强大的经典架构》。
安装玩 akmod-nvidia 之后,依然需要在 /etc/modprobe.d 中增加一个文件,在里面写上 blacklist nouveau 来禁止加载 nouveau 驱动,然后使用 dracut --force
重建 initramfs。否则 nvidia 驱动无法加载。
本以为使用第三方源的软件包应该可以成功的,因为软件源里面的软件往往经过测试,是比较成熟的。但是很不幸,还是失败了。
安装 akmod-nvidia 失败后的补救办法
这个就比较简单了,按 Ctrl+Alt+F2 进入另一个控制台,以 root 用户登录,将相应的软件包删除即可。不过需要注意的是,不仅要删除 akmod-nvidia,还要删除 xorg-x11-drv-nvidia。命令为yum erase akmod-nvidia xorg-x11-drv-nvidia
,运行效果如下图:
方法3:安装 Bumblebee
连续使用两种办法安装 Nvidia 的驱动都失败了,我实在是不知道原因。我想,可能是因为笔记本中的双显卡吧,网络上似乎有人提到过这个问题。所以我的第 3 个方法就是从双显卡切换这个切入点去解决问题。
我是从 Fedora 的 Wiki 上知道 Bumblebee 的,不要看这个词很难拼写,如果你知道它的意思是大黄蜂你肯定就过目难忘了,之所以用这个名字是因为 Nvidia 官方的双显卡切换技术叫 Optimus,也就是擎天柱的意思。变形金刚迷还真多啊。Bumblebee 的安装过程见如下 Wiki:
很不幸,最终还是失败了。
安装 Bumblebee 失败后的补救办法
这个和上一个错误的补救措施相同,按 Ctrl+Alt+F2 进入另一个控制台,以 root 用户登录,将相应的软件包删除即可。命令为yum erase bumblebee
。我就不截图了。
Fedora 21 和 Nvidia 驱动不对付,究竟问题出在哪里呢?
在网上搜索一下,发现很多人使用 Fedora 21 安装 Nvidia 的驱动都没有成功。那么错误的原因究竟是什么呢?是双显卡的问题吗?还是 Linux 的内核太新?或者是 Nvidia 驱动的版本太新?再或者,是 Xorg 的问题还是 Gnome 的问题?这些问题我没有答案。在此将我的折腾过程晒出来,欢迎大家探讨。
(京山游侠于2015-03-29发布于博客园,转载请注明出处。)
最新进展
从 Fedora 23 开始,终于可以正常安装使用 Nvidia 驱动了。使用第一种方法从官网下载安装可以成功,使用第二种方法从 rpmfusion 安装 akmod-nvidia 也可以。不管使用哪种安装方式,都需要在 /etc/modprobe.d
中增加一个文件,在里面写上 blacklist nouveau
来禁止加载 nouveau 驱动,然后使用 dracut --force
重建 initramfs。从官网下载安装驱动成功后,可以看到 Nvidia X Sever Settings 程序,而从 rpmfusion 安装 akmod-nvidia 后没有 Nvidia X Server Settings 程序,但是通过 lsmod
命令可以看到确实是成功使用 Nvidia 驱动的。
下图是我在 Fedora 24 中的截图,证明确实可以成功安装 Nvidia 驱动。
然而,并不能证明使用 Nvidia 驱动比使用 Nouveau 驱动有更高的效率,如下两图:
glxgears 的帧率是一样的。而且,使用 nouveau 驱动的时候是可以开启 framebuffer 的,使用 Nvidia 驱动就不行。还有,使用 nouveau 驱动时可以使用基于 Wayland 的 Gnome,使用 Nvidia 就不行。其实,从 Fedora 21 开始就可以使用 Wayland,但是当时运行不是很流畅,有的应用还会崩溃。现在在 Fedora 24 中,我使用 Wayland 是很顺畅的。只是没有办法来检验究竟是使用 Xorg 效率高还是 Wayland 效率高。从下图 pstree
的命令可以看出,Wayland 代替 Xorg:
(京山游侠于2016-08-19更新于博客园,转载请注明出处。)