前言

终于搞到了一块 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