分类: LINUX
2008-05-03 00:23:20
1. 简介
portage树中的nVidia驱动由nVidia发布,构建于Linux内核之上。驱动中包括一个担负与卡对话的艰巨任务的二进制部分。驱动包括两部分,内核模块和X11驱动。两部分包括在一个单独的包中。因为nVidia给它们的驱动打包的方式,你需要在安装驱动前进行一些选择。
nvidia-drivers 包包括来自nVidia的最新驱动,支持所有nVidia的显卡。根据卡的新旧不同,有几个版本。它使用eclass检测你正在使用的是哪种卡,然后安装适合的版本。
2. 驱动兼容性
nvidia-drivers包支持所有可用的nVidia卡。根据你使用的卡,有多个相应版本。
较新的卡(如GeForce 8, 7, 6和FX 5系列)应该使用100.x系列的较新的驱动。
较老的卡(如GeForce 3或GeForce 4系列)需要96.x驱动。对于这些卡,你应该在/etc/portage/package.mask中屏蔽掉>=x11-drivers/nvidia-drivers-97.00。这样将阻止安装你的显卡不兼容的新版驱动。
老的基于NV2x的显卡(如:TNT、TNT2、Geforce和GeForce 2)需要更老的71.x驱动(例如nvidia-drivers-71.86.01)。对于这类卡,你应该在/etc/portage/package.mask中屏蔽掉>=x11-drivers/nvidia-drivers-87.00
你可以在通过读相应的x86或x86-64的README来检查你的显卡与哪个驱动兼容。
3. 配置显卡
正如刚才提到的,nVidia内核驱动在你当前内核上运行。它做成了一个模块,所以你的内核必须支持内核模块的加载才行。如果你是用genkernel all配置的内核,那就是可以的。如果不是,请再检查一下你的内核配置,保证这项支持被打开。
代码 3.1: 打开内核模块加载的支持 |
Loadable module support ---> [*] Enable loadable module support |
你还要在内核中打开Memory Type Range Register
代码 3.2: 打开MTRR |
Processor and Features ---> [*] MTRR (Memory Type Range Register) support |
另外,如果你装的是AGP显卡,你可以选择打开内核里的agpgart支持,直接编到内核里或者编成模块。如果你不使用内核中的agpgart支持,驱动将使用它们自己的agpgart实现,这个实现叫做NvAGP。在某些系统中,它的表现要强于内核中的agpgart。在另外一些系统中,它的表现要弱于内核中的agpgart。你需要自己评估在你自己的系统中哪个更好以得到最佳性能。如果你搞不清楚该怎么做,那就使用内核中的agpgart吧。
代码 3.3: 打开agpgart支持 |
Device Drivers ---> Character devices ---> <*> /dev/agpgart (AGP Support) |
注意: 在amd64平台,IOMMU控制着agpgart的设置。 |
重要: 对于x86和AMD64的处理器,内核中的驱动与nvidia提供的二进制驱动冲突。如果你为这些CPU编译内核,你必须按照下面的方法完全去掉内核中的驱动。 |
代码 3.4: 去掉内核中的驱动 |
Device Drivers ---> Graphics Support ---> < > nVidia Framebuffer Support < > nVidia Riva support |
一个framebuffer替代物── VESA:
代码 3.5: 打开VESA支持 |
Device Drivers ---> Graphics Support ---> [*] VESA VGA graphics support |
或者,你可能想试试uvesafb,一种高级的framebuffer。注意你可以把它编到内核里,也可以把它编成一个模块。后面的例子是把uvesafb编到内核里的。
代码 3.6: 打开uvesafb支持 |
Device Drivers ---> Graphics Support ---> <*> Userspace VESA VGA graphics support |
要了解更多的信息,可以到/usr/src/linux/Documentation/fb/下找你使用的framebuffer的相应文档。
nvidia-drivers的ebuild按/usr/src/linux符号链接自动检测你的内核版本。请确认你正确配置了你的内核而且这个符号链接指向了正确的内核源码。参阅中的“配置内核”一节。
首先,你需要emerge eselect(如果你没装它的话)。如果你在使用gentoo-sources-2.6.18-r4,你的内核列表看起来象下面一样:
代码 3.7: 检查你的/usr/src/linux符号链接 |
# eselect kernel list Available kernel symlink targets: [1] linux-2.6.18-gentoo-r4 * [2] linux-2.6.20-gentoo-r7 [3] linux-2.6.20-gentoo-r8 (确认正确的内核被标了星号) |
在上面的输出中,你会注意到linux-2.6.18-gentoo-r4内核标记了星号(*),这表示它是符号链接指向的内核。
如果符号链接没有指向正确的内核源码,你必须象前面的例子那样选择想要的内核源码。
代码 3.8: 建立或更新/usr/src/linux符号链接。 |
(选择正确的内核) # eselect kernel set 1 |
然后就要安装驱动了。
代码 3.9: 安装nVidia驱动 |
# emerge nvidia-drivers
|
注意: 安装驱动时可以加上gtk用户标识。加上后将会安装media-video/nvidia-settings。这是一个方便的用来查看和配置nVidia显卡各个方面的图形化工具。 |
重要: 每次你或重新编译当前内核,你需要运行emerge nvidia-drivers重新安装nVidia模块。一个更容易的保持由ebuild安装的模块可用的方式是安装sys-kernel/module-rebuild。一旦你已经安装了它,简单地运行module-rebuild populate以把一个需要重新编译的包列表populate到数据库中。仅仅运行module-rebuild rebuild来为你的新内核重建驱动就行了。 |
安装完成后,运行modprobe nvidia把内核模块载入内存。如果是在升级的情况下,你应该把先前的模块移出内存。
代码 3.10: 载入内核模块 |
# lsmod | grep nvidia && rmmod nvidia # modprobe nvidia |
为避免不得不每次启动都手动地加载模块,你可能想要在启动系统时自动地加载,那就编辑/etc/modules.autoload.d/kernel-2.6,把nvidia加进去。不要忘了过后儿运行update-modules。
重要: 如果你把agpgart编成模块,你需要把它加入/etc/modules.autoload.d/kernel-2.6 |
代码 3.11: 运行update-modules |
# update-modules
|
一旦安装完合适的驱动,需要用nvidia驱动而不是默认的nv驱动来配置X服务。
用你喜欢的编辑器(如nano或vim)打开/etc/X11/xorg.conf,到Device一节,把Driver一行改成如下:
代码 3.12: 在X服务配置中把nv改成nvidia |
Section "Device"
Identifier "nVidia Inc. GeForce2"
Driver "nvidia""
VideoRam 65536
EndSection
|
然后到Module一节,确认glx模块加载,同时dri模块没加载:
代码 3.13: 更新Module一节 |
Section "Module" (……) # Load "dri" Load "glx" (……) EndSection |
下一步,在Screen一节,确保DefaultDepth指令被设为16或24,或者你只有 Depth设为16或24的Display小节。如果不这样做,nVidia的GLX扩展将无法启动。
代码 3.14: 更新Screen section |
Section "Screen" (……) DefaultDepth 16 Subsection "Display" (……) EndSection |
运行eselect,让X服务使用nVidia的GLX库:
代码 3.15: 运行eselect |
# eselect opengl set nvidia
|
你必须把你的用户加入video组,他才会有访问nVidia设备文件的权限:
代码 3.16: 把你的用户加入video组 |
# gpasswd -a youruser video
|
如果你不使用udev,这个步骤不一定需要,但也不会有坏处,还能使你的系统适应将来的需要。
要测试你的nVidia显卡,就启动X,运行glxinfo,它是mesa-progs包的一部分。应该出现“direct rendering is activated”这类结果:
代码 3.17: 检查直接渲染状态 |
$ glxinfo | grep direct
direct rendering: Yes
|
如果要测试你的FPS,就运行glxgears命令。
有些工具,如mplayer和xine-lib,使用一个叫做xvmc的本地USE标识来打开XvMCNVIDIA支持。这个支持在看高清电影时很有用。在/etc/make.conf中的USE变量中加入xvmc或者在/etc/portage/package.use中为media-video/mplayer和/或media-libs/xine-lib加入这个USE标识。
也有一些程序使用nvidiaUSE标识,所以你可能需要把它加入/etc/make.conf。
然后,运行emerge -uD --newuse world以重新编译这些获益于上述USE标识改变的应用程序。
nVidia也为你提供了一个设置工具。这个工具使你能够查看并且不必重启X服务器就改变图形设置。这个工具在portage树的media-video/nvidia-settings包里。如前所述,如果你安装驱动时在/etc/make.conf或/etc/portage/package.use中加入了gtkUSE标识,这个包将自动安装。
4. 故障排除
如果你在nVidia的2D加速方面有什么问题。那可能是你不能用MTRR建立混合写入区。要确认这个,请检查/proc/mtrr的内容:
代码 4.1: 检查你是否打开了混合写入 |
# cat /proc/mtrr
|
每行都应有"write-back"或"write-combining"。如果你看到有一行有"uncachable",你需要更改BIOS设置来修正它。
重启并进入BIOS,找到MTRR设置(可能会在"CPU Settings"下面)。把该项设置由"continuous"改为"discrete",再引导回Linux。你将发现没有带"uncachable"的行了。2D加速没有任何毛病了。
当我试图加载内核模块时,出现"no such device"。
这个错误通常出现在你没有匹配的显卡时。确认你有装了nVidia的显卡。你可以运行lspci再看一次。
如果你确信你有nVidia显卡,检查你的BIOS看一下Assign IRQ to VGA是否设置了。
5. 专家级配置
nVidia驱动包还包含了包罗万象的文档。这些文档安装在/usr/share/doc,能够用以下命令查看:
代码 5.1: 查看NVIDIA文档 |
$ less /usr/share/doc/nvidia-drivers-*/README.gz
|
nvidia内核模块能接受一些参数。你可以用这些参数调整驱动的行为。这些参数中的大部分都在文档中提到了。你可以通过编辑/etc/modules.d/nvidia来增加或改变这些参数的值。在改变这个文件后记住要运行update-modules,一定要牢记你所做的新设置只有在nvidia模块重新加载后才会生效。
代码 5.2: 调整nvidia驱动参数 |
(用你喜欢的编辑器编辑/etc/modules.d/nvidia) # nano -w /etc/modules.d/nvidia (更新模块信息) # update-modules (卸载nvidia模块……) # modprobe -r nvidia (……然后再次加载) # modprobe nvidia |
GLX这个层次也还有相当多的参数可以设置。这些参数控制电视输出、双显、显示器刷新率检测等等的配置。同样,所有这些可用的参数的细节可以在文档中找到。
如果你想要使用这些参数,你需要把它们填入X配置文件(通常是/etc/X11/xorg.conf)的相关设备节。举例如下,假如我想要不显示飞溅屏幕:
代码 5.3: X配置中的nvidia高级配置 |
Section "Device"
Identifier "nVidia Inc. GeForce2"
Driver "nvidia"
Option "NoLogo" "true"
VideoRam 65536
EndSection
|