【新手实战】ubuntu 14.04_64bit升级xorg-edgers英伟达显卡驱动

CPU/显卡/打印机/USB设备等硬件问题
回复
alexshots
帖子: 248
注册时间: 2010-01-22 23:45

【新手实战】ubuntu 14.04_64bit升级xorg-edgers英伟达显卡驱动

#1

帖子 alexshots » 2014-12-06 21:02

【新手实战】ubuntu 14.04_64bit升级xorg-edgers英伟达显卡驱动

为什么要有这个,因为ubuntu 14.04 LTS官方库,给的是nvidia 331.38的驱动,有些游戏跑着不爽。正好自己是nv的显卡,所以折腾一下。说一下具体我怎么弄的。

去www。nvidia。cn官方网站查了一下自己的nvidia显卡,现在最新的驱动是340.xx的。其实nvidia官方网站,还有更新的显卡驱动比如346.xx什么的,但是我那个显卡再nvidia官方网站,查的时候,网页工具,就告诉我说你用340的驱动。所以不能瞎装,不是最新就最好。

然后,去xorg edgers的网站,现在ubuntu 14.04 LTS 64bit已经出了一段时间了,已经更新到ubuntu 14.04.1了,所以我估计xorg-edgers team已经跟进了。去一下他们的网站
https://launchpad.net/~xorg-edgers/+archive/ubuntu/ppa
果然,他们现在提供高于ubuntu官方源的331.xx的340.xx的驱动,所以,值得一装。项目也支持ubuntu 12.04.2,ubuntu 14.04.1, ubuntu 14.10。
再老的ubuntu 发行版,现在2014年12月初,他们都已经放弃支持了!呵呵。早年我还用过他们的ubuntu 12.10的n卡驱动,好给力。

然后那就开始吧。折腾自己的ubuntu。安装新立德synaptic package manager包安装管理软件,ubuntu软件中心就有。

安装build-essential编译核心工具。

新版ubuntu自带multi-arch,所以i386 architecture和ia32-libs我就不管了。虽然我用的是64bit版的ubuntu 14.04.

更新到最新,直接unity界面,左上角dash,点开,software updater。源我已经之前配好了。用的aliyun的,速度还可以。系统更新到最新!linux有更新,需要重启。重启之!再进桌面。

卸载原来nvidia-331驱动(这我手动装的),卸载过程中自动移除dkms模块。在新立德中搜nvidia,只要是版本331.xx的,包括libcuda***,还有nvidia-***开头的什么的包,都remove卸载。然后apply之。
重启ubuntu,因为ubuntu官方源的驱动nvidia-331那个可以和开源驱动并存,而且开源显卡驱动我没删除,所以,删除331.xx驱动后不用立刻补装开源驱动xserver-xorg-xxxx-xxxx那个开源驱动。直接重启,开机ubuntu就回退到开源驱动了。

再进开源驱动的ubuntu 14.04的桌面,software updater更新管理崎,联网更新到最新。

然后基本现在就是最新的官方ubuntu内核+ubuntu官方源的开源显卡驱动。ubuntu 14.04.1的。
加装ppa吧。ctrl-alt-t呼出控制台,命令
sudo add-apt-repository ppa:xorg-edgers/ppa

之后有他们团队的简单警告,按回车继续,ctrl-c组合键是退出。我就直接回车之。提示
gpg: keyring `/tmp/tmpar7icca4/secring.gpg' created
gpg: keyring `/tmp/tmpar7icca4/pubring.gpg' created
gpg: requesting key 8844C542 from hkp server keyserver.ubuntu.com
?: keyserver.ubuntu.com: Host not found
gpgkeys: HTTP fetch error 7: couldn't connect: Success
gpg: no valid OpenPGP data found.
gpg: Total number processed: 0

不行,不知道为什么,怎么连不上keyserver服务器啊,然后去这里
https://launchpad.net/~xorg-edgers/+archive/ubuntu/ppa
该网页提供了密钥gpg的密钥,手动输入密钥。
于是改用方案2,控制台中
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8844C542
还不行。提示
gpg: requesting key 8844C542 from hkp server keyserver.ubuntu.com
?: keyserver.ubuntu.com: Host not found
gpgkeys: HTTP fetch error 7: couldn't connect: Connection timed out
gpg: no valid OpenPGP data found.
gpg: Total number processed: 0

这是为什么?!

后来控制台中,用nslookup命令查了一下,对比ip138上的keyserver.ubuntu.com的英国ip解析结果。发现dns能解析正确ip。我用的114dns的。本来打算,如果是dns问题,直接我把ip分析结果写入hosts。
然后再试试sudo add-apt-repository ppa:xorg-edgers/ppa,就又行了。奇怪。

那好,既然加入的xorg-edgers的ppa,那就继续吧,刚才可能加不成功是网络或者服务器繁忙吧。

开新立德reload一下,相当于把加装xorg-edgers的ppa以后的新的包库目录,撸一遍新的。

然后安装ppa-purge,这个就是说,一旦出ooxx问题,我能用ppa-purge命令能退回到ubuntu官方原来源中的包的样子,能装回去。什么事儿都怕个万一。

然后还是software updater更新到最新。这时就能开始看到xorg edgers自己的新版开源驱动什么的了。更新安装之。

然后就要真的开装xorg-edgers的闭源显卡驱动了。nvidia的。动手之前,我用ctrl-alt-t呼出控制台,命令uname -r看了一眼,内核是3.13.0-41的,来自官方ubuntu 14.04.1了。应该没有内核版本过老(低于3.7.0时代的linux内核)的问题。所以没有内核更新。

然后,看一眼,内核headers,image,source三版本同步问题。用新立德简单搜索一下这些包的名字看一眼。确认一下:
linux-headers是3.13.0-41 版本3.13.0-41.70
linux-image是3.13.0-41-generic 版本3.13.0-41.70
image extra那个基本也是一个版本。
linux-source是3.13.0 版本是3.13.0-41.70

这个就比较省心了,确实三版本同步,因为LTS的版本headers是自动给你装的。非LTS的ubuntu发行版本,可能要手动装对应好版本的headers和source。这可能一下就100多MB出去了。

然后就继续新立德中,装nvidia-340驱动了。依赖的多个包,会自动解决。
我看直接就给装340.58了。nvidia-settings渺似是通用的,所以给装的346.16的。

然后重启ubuntu,看结果。重启后进桌面正常。

还是ctrl-alt-t呼出控制台,命令sudo apt-get install mesa-utils:i386
为什么要32bit版i386呢,就是glxinfo命令有32位和64位版,默认在64位下不加:i386都是64位版,但是ubuntu的linux大型3d商业游戏好多还是32bit版的,所以要用32bit版的测试看显卡驱动安装是否成功。

那么一步步证验吧,ctrl-alt-t控制台输入glxinfo | more 回车之。以下是输出:

name of display: :0
display: :0 screen: 0
direct rendering: Yes
server glx vendor string: NVIDIA Corporation
server glx version string: 1.4
server glx extensions:
GLX_ARB_create_context, GLX_ARB_create_context_profile,
GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float,
GLX_ARB_multisample, GLX_EXT_buffer_age,
GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile,
GLX_EXT_framebuffer_sRGB, GLX_EXT_stereo_tree, GLX_EXT_swap_control,
GLX_EXT_swap_control_tear, GLX_EXT_texture_from_pixmap,
GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_NV_delay_before_swap,
GLX_NV_float_buffer, GLX_NV_multisample_coverage, GLX_SGIX_fbconfig,
GLX_SGIX_pbuffer, GLX_SGI_swap_control, GLX_SGI_video_sync
client glx vendor string: NVIDIA Corporation
client glx version string: 1.4
client glx extensions:
GLX_ARB_create_context, GLX_ARB_create_context_profile,
。。。。。底下我就省略了。关键就是那个direct rendering: Yes,这就证明32位下驱动成功了!

ctrl-c退出glxinfo模式。
=-==-=-====-==--=-==-=

用sudo dkms status命令。有这样的字样
nvidia-340, 340.58, 3.13.0-41-generic, x86_64: installed
nvidia-340-uvm, 340.58, 3.13.0-41-generic, x86_64: installed
那个installed,就是已安装的意思。
-=-==-=-=-=-=-=

命令sudo lsmod | grep nv的输出,含有如下字样
nvidia 10557103 49
证明dkms的显卡驱动mod加入进去了。

=-=====-===-

命令sudo modinfo nvidia-340,因为我新立德中装的驱动的包名叫nvidia-340,所以我命令后头跟的也是那个包名,它的输出是
filename: /lib/modules/3.13.0-41-generic/updates/dkms/nvidia_340.ko
alias: char-major-195-*
version: 340.58
supported: external
license: NVIDIA
alias: pci:v000010DEd00000E00sv*sd*bc04sc80i00*
alias: pci:v000010DEd00000AA3sv*sd*bc0Bsc40i00*
alias: pci:v000010DEd*sv*sd*bc03sc02i00*
alias: pci:v000010DEd*sv*sd*bc03sc00i00*
depends: drm
vermagic: 3.13.0-41-generic SMP mod_unload modversions
parm: NVreg_Mobile:int
parm: NVreg_ResmanDebugLevel:int
parm: NVreg_RmLogonRC:int
parm: NVreg_ModifyDeviceFiles:int
parm: NVreg_DeviceFileUID:int
parm: NVreg_DeviceFileGID:int
parm: NVreg_DeviceFileMode:int
parm: NVreg_RemapLimit:int
parm: NVreg_UpdateMemoryTypes:int
parm: NVreg_InitializeSystemMemoryAllocations:int
parm: NVreg_UsePageAttributeTable:int
parm: NVreg_MapRegistersEarly:int
parm: NVreg_RegisterForACPIEvents:int
parm: NVreg_CheckPCIConfigSpace:int
parm: NVreg_EnablePCIeGen3:int
parm: NVreg_EnableMSI:int
parm: NVreg_MemoryPoolSize:int
parm: NVreg_RegistryDwords:charp
parm: NVreg_RmMsg:charp
parm: NVreg_AssignGpus:charp
一切正常。
=--=-=-=-=

我还安装过steam。控制台中用这个命令,简单证验一下。
ldd ~/.steam/steam/ubuntu12_32/steamui.so
输出是
linux-gate.so.1 => (0xf777e000)
libavcodec.so.56 => not found
liboverride.so => not found
libtier0_s.so => not found
libvideo.so => not found
libvstdlib_s.so => not found
libSDL2-2.0.so.0 => not found
libXtst.so.6 => not found
libXfixes.so.3 => /usr/lib/i386-linux-gnu/libXfixes.so.3 (0xf4f56000)
libXrandr.so.2 => not found
libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xf4f43000)
libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xf4e0f000)
libGL.so.1 => /usr/lib32/nvidia-340/libGL.so.1 (0xf4cf8000)
libpangoft2-1.0.so.0 => not found
libpango-1.0.so.0 => not found
libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xf4c57000)
libfontconfig.so.1 => not found
libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xf4c05000)
libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xf4af8000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xf4977000)
libgtk-x11-2.0.so.0 => not found
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf496e000)
libpulse.so.0 => not found
libavresample.so.2 => not found
libavutil.so.54 => not found
libgdk_pixbuf-2.0.so.0 => not found
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf4927000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf4922000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf4838000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf481c000)
/lib/ld-linux.so.2 (0xf777f000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf466d000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xf464b000)
libnvidia-tls.so.340.58 => /usr/lib32/nvidia-340/tls/libnvidia-tls.so.340.58 (0xf4646000)
libnvidia-glcore.so.340.58 => /usr/lib32/nvidia-340/libnvidia-glcore.so.340.58 (0xf20b1000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf2097000)
libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xf206f000)
libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0xf2068000)
libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xf202a000)
libgmodule-2.0.so.0 => /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0 (0xf2024000)
libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0xf2001000)
libresolv.so.2 => /lib/i386-linux-gnu/libresolv.so.2 (0xf1fe9000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf1fcc000)
libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xf1fc8000)
libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xf1fc0000)

问题不大。
=-=-==-=-==-=

用ldd /usr/bin/glxinfo查看i386版的glxinfo到底用的哪个opengl库,可以看到
linux-gate.so.1 => (0xf77c5000)
libGL.so.1 => /usr/lib32/nvidia-340/libGL.so.1 (0xf7693000)
libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xf755f000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf73af000)
libnvidia-tls.so.340.58 => /usr/lib32/nvidia-340/tls/libnvidia-tls.so.340.58 (0xf73aa000)
libnvidia-glcore.so.340.58 => /usr/lib32/nvidia-340/libnvidia-glcore.so.340.58 (0xf4e16000)
libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xf4e03000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf4dfe000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xf4ddb000)
/lib/ld-linux.so.2 (0xf77c6000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf4d95000)
libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xf4d91000)
libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xf4d8a000)
很明显,libGL用的驱动提供的32bit的库。很好很好。
=-=--==-=--=

控制台中输入nvidia-settings,弹出一个显卡设置窗口,可以在某一个窗口下看到direct rendering : yes,这个是因为我64bit的系统,那个表示64bit下direct rendering启用。我用mesa-utils:i386包中带的glxinfo命令,证验的是32bit下direct rendering是否启用,2个都启用,证明显卡驱动装的ok了。

-==-==-=-===-

起一个游戏,linux下的无主之地2.玩一下。这游戏据说虚幻引擎的。
游戏内环境光遮罩ambient occlusion的显示不正常问题解决了。果然是老版本驱动的问题!

ok。至此,ubuntu 14.04 LTS,xorg-edgers新版显卡驱动程序升级成功!
安心去耍游戏了。
-
头像
NetDreamer
帖子: 858
注册时间: 2007-10-19 20:40
联系:

Re: 【新手实战】ubuntu 14.04_64bit升级xorg-edgers英伟达显卡驱动

#2

帖子 NetDreamer » 2014-12-06 21:23

:em11 ma ke
Live and let live.
回复