前言
终于搞到了一块 NVIDIA k40显卡和一台服务器来跑神经网络,服务器配置那么好自然是要装虚拟机来榨干性能啦,但是NVIDIA的显卡驱动的安装并不顺利,安装过程中出现了循环登录和编译错误,于是有了这篇博文。
准备工作
0. 环境参数
首先我要说一下我的环境参数:
项目 | 参数 |
---|---|
ESXi | 6.7 |
Ubuntu | 16.04 |
显卡 | NVIDIA k40c |
显卡驱动 | 384.66 |
gcc | 5.4.0 |
1. ESXi
首先去VMware下载中心注册个账号下载免费的ESXi,做个启动U盘安装到服务器上。然后记得设置ESXi服务器的IP地址,之后可以通过这个IP访问EXSi的web管理页面,服务器可以暂时放一边了。
接下来,记得先把显卡设置为直通,我这是图省事,也可以避免虚拟化导致的性能下降(其实就是懒)。设置方法,右边导航-> 管理-> 硬件-> PCI设备-> 找到显卡点切换直通
,设置完成后需要重新启动EXSi服务器。
现在我们可以开始安装虚拟机了,怎么装??我这里就不说了,记得要 添加PCI设备(显卡)
给虚拟机,然后启动虚拟机,启动成功的话就可以考虑显卡驱动的事儿了。
2. 获取驱动
如何获取驱动是一个问题,方法一是直接在虚拟机中通过网页下载,方法二是下载好后拷贝给虚拟机。
方法一:
ESXi通过虚拟交换机的方式来管理虚拟机们的,所以虚拟机与ESXi主机处于同一个内网网段中,如果你使用的拨号上网,那么在虚拟机中拨号一下就行了,当然可能你用的客户机会被挤掉线。如果你拥有PPTP服务器那就简单了,设置一下代理就OK啦。或许
把ESXi主机接入一台联网的路由器也是可行的,但是学校限制了路由器不好验证,如果你知道答案,请告诉我!booker_duan@yahoo.com
方法二:
利用U盘拷贝到虚拟机也是可以的,但是这时候虚拟机是run在服务器上的哦,所以U盘要插在服务器上。插上U盘-> 关闭虚拟机(如果开着的话)-> 编辑虚拟机设置-> 添加USB设备(选择你的U盘)
,搞定之后开机,你的U盘就出现了。
到NVIDIA驱动下载下载对应的驱动。注意:
操作系统选择Linux 64bit选项,即使提供了ubuntu 16.04的选项,最后得到的是一个.run
的文件,不应该下载.deb
格式的。
建议:执行到这步,最好创建一个虚拟机快照
安装驱动
0. 总结总结
网上说的驱动安装方法主要是三种:1、使用ubuntu自带的driver管理工具 2、使用apt安装 3、自行下载NVIDIA驱动安装。前两种方法都会遇到循环登录的问题。
方法1:和执行ubuntu-driver autoinstall
是一样的,结果:循环登录。
方法2:示例,sudo apt install nvidia-384
,结果:循环登录。方法3:
示例sudo ./NVIDIA-Linux-x86_64-384.66.run --no-opengl-files
,结果:安装成功。
1. 详细说说
我采用的方法3,具体步骤如下:
- 禁用nouveau
nouveau是ubuntu系统自带的开源驱动,所以先要把他禁用掉。
sudo vim /etc/modprobe.d/blacklist.conf
添加一行
blacklist nouveau
执行
sudo update-initramfs -u
重启后如果lsmod | grep nouveau
没有输出,说明已经禁用了nouveau了。
- 禁用X服务
sudo service lightdm stop
键盘Ctrl
+Alt
+F1
进入tty1,登录。
- 安装驱动文件
执行sudo ./NVIDIA-Linux-x86_64-384.66.run --no-opengl-files
安装驱动文件,注意参数。安装过程中dkms选择yes,其余continue就好了。如果全程没有出错,重启,运行nvidia-smi
将会输出显卡信息,恭喜你安装成功了。如果你遇到了编译错误,请接着往下看。
实验发现,如果方法三中不加上--no-opengl-files
这个参数,会导致循环登录的问题,由于方法1和方法2不能添加此参数,所以循环登录,使用deb安装也是同理。我也想解决循环登录这个问题,查了一些资料也没用,你可以看看~/.xsession-errors
,如果你解决了这个问题,希望你告诉我。booker_duan@yahoo.com
2. 编译出错
实际操作中我是遇到了编译错误,通过查看/var/lib/dkms/nvidia/384.66/build/make.log
发现问题是
[Werror]: error implicit declaration of function 'task_stack_page'
出现这个问题的原因可能是gcc版本较高造成的,因为和驱动编译的版本不统一导致了警告error的出现,由于找不到驱动编译使用的gcc版本,所以降级不太可能。我采用网上提供的方法解决了这个问题。
- 解压驱动文件
sudo ./nvidia.run -x
- 修改源码
编辑[the-extracted-folder]/kernel/nvidia-uvm/uvm8_va_block.c
添加一个头文件#include <linux/sched/task_stack.h>
- 再次安装驱动
sudo [the-extracted-folder]/nvidia-installer --no-opengl-files
,注意参数。
如果重启后运行nvidia-smi
输出了显卡信息,恭喜你安装成功了。
参考
【解决】Ubuntu安装NVIDIA驱动(咨询NVIDIA工程师的解决方案)
cannot install nvidia driver , In function ‘block_cpu_fault_locked’: error implicit declaration of function ‘task_stack_page
Xlib: extension “GLX” missing - with an NVIDIA card and on-board graphics