常见的笔记本电脑有两块显卡:集成在CPU
内部的核心显卡,和作为GPU
的独立显卡(如Nvidia RTX3060
)。相比驱动完备的win10
,Linux
系统往往自带合适够用的核显驱动,但独显驱动很不理想,甚至直接没有,导致设备的图形处理和并行计算能力就不能充分发挥。本文就将探讨基于ubuntu
系统的N卡驱动配置。
标题:Linux系统下的N卡驱动配置
驱动安装
卸载旧驱动
首先卸载之前的,或者是系统自动安装的驱动
#for case1: original driver installed by apt-get:
#系统自带驱动,或者自己用apt装驱动的走这个方向
sudo apt-get remove --purge nvidia*
#for case2: original driver installed by runfile:
#自己之前去nvidia官网下载驱动装失败的走这个方向
sudo chmod +x *.run
sudo ./xxxx.run --uninstall
禁用nouveau
该软件相当于逆向nvidia的官方显卡驱动得到的开源的显卡驱动,一般是发行版自带
打开黑名单配置文件
sudo vim /etc/modprobe.d/blacklist.conf
在最后一行添加
blacklist nouveau
之后执行命令
sudo update-initramfs -u #重启 reboot #检查nouveau是否被禁用 lsmod | grep nouveau #若没有输出则成功
安装新驱动
方法一:从官网下载.run并安装
从官网链接找到自己需要的驱动版本,下载对应的.run安装程序
按下
Ctrl+Alt+(F1~F6中的任意一个)
进入模拟终端界面(防止驱动安装过程中GUI崩坏)也可使用命令行临时关闭图形界面(具体命令可能随系统版本不同而不同)
sudo service lightdm stop
进入模拟终端后,输入用户名和密码登录
进入
.run
文件的目录下并赋予执行权限sudo chmod a+x *.run
运行
.run
文件进行安装(注意参数)sudo ./*.run –no-opengl-files
参数说明
–no-opengl-files
只安装驱动文件,不安装OpenGL
文件。这个参数最重要- 如果对该参数报错,实质上也可以去掉参数继续,但最终的结果可能是要改用方法二
–no-x-check
安装驱动时不检查X服务–no-nouveau-check
安装驱动时不检查nouveau
后面两个参数可不加。
安装过程都选择默认项,除非碰到默认
abort
再选取continue
,但出现这样的选项就可以考虑换方法二了安装完成后
reboot
重启
方法二:使用apt流法安装
apt更新软件源
添加PPA(Personal Package Archives),通过Ubuntu社区维护的名为graphics-drivers的PPA提供驱动程序,该社区目前貌似只支持N卡
sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt-get update
查看设备可安装的驱动
(这条指令的原理有点神秘)
ubuntu-drivers devices
安装对应的驱动,如:
sudo apt install nvidia-driver-xxx
在2中,会有些驱动被标注
recommended
,标注的free
与否目前没有发现差别reboot
重启
验证
- 使用
nvidia-smi
验证安装成功的驱动
切换
适用多显卡的情况,如核心显卡+独立显卡
要想切换,首先需要安装nvidia-prime
包
方法一: 控制台使用prime-select
prime-select query
查看当前使用显卡模式prime-select nvidia
切换到N卡;prime-select intel
切换到英特尔核心显卡其他类似需求可以参照上述
方法二:GUI使用NVIDIA X Server Settings
- 从程序坞里找到
NVIDIA X Server Settings
- 在左侧菜单栏选择
PRIME Profiles
- 点选对应的GPU使用模式
reboot
重启即可生效
性能测试
mesa-utils
齿轮测试
- 对应
apt
安装的包名,其他包管理系统可能有区别 - 执行
glxgears
进行测试,FPS会输出到当前终端
glmark2
综合测试
包管理系统安装
glmark2
执行
glmark2
进行测试,终端会输出有关信息,最后会输出跑分可能出现的段错误:
Error: Failed to add fragment shader from file None: Error: 0(26) : warning C7022: unrecognized profile specifier "highp" Error: 0(26) : error C0502: syntax error at token "highp" Error: Error: Failed to add fragment shader from file None: Error: 0(75) : warning C7022: unrecognized profile specifier "highp" Error: 0(75) : error C0502: syntax error at token "highp" Error: [terrain] <default>:Segmentation fault (core dumped)
这里通过访问开源的
glmark2
的issue页面提出的问题,得到了解决方法,对自己以后解决开源工具使用的问题也有启发通过
gdb
调试可知,出现段错误的地方,访问的vector大小为0,定位到该问题出现在编译过程中,是受限于版本导致的参数不支持解决方法:将测试程序
shaders
目录下的所有.frag
文件中的GL_FRAGMENT_PRECISION_HIGH
替换成GL_FRAGMENT_PRECISION_HIGH_DISABLED
具体步骤:
找到glmark2安装位置
whereis glmark2
参考的源码目录为
/usr/share/glmark2
进入安装目录,对目录下的
shaders
目录做好备份mkdir backup cp ./shaders/*.frag
使用
sed
快速替换sudo sed -i 's/GL_FRAGMENT_PRECISION_HIGH/GL_FRAGMENT_PRECISION_HIGH_DISABLED/g' /usr/share/glmark2/shaders/*.frag
源码替换完成后,再次运行即可恢复正常