在ubuntu server上安装nvidia驱动以及cuda是件很令人头疼的事,但幸运的是,nvidia官方推出了CUDA Toolkit安装包,我们可以使用它直接安装显卡驱动和cuda toolkit工具包。但不那么幸运的是,这样做在一些服务器上是成功的,但在另一些服务器上又是失败的。这不禁引发了我的一些思考。经过了半个晚上的问题排查,共总结了以下几个问题来源。如果你也遇到了这个问题,希望这篇文章能帮助到您。
0. CUDA Toolkit 通常”食用”方法
去这里可以下载最新版本。
我在这里以 Ubuntu 20.04 x86_64 为例:
从图中我们也可以发现,具体的下载以及使用命令官方也给我们提供好了,我们直接执行以下两条命令即可。
1 | wget https://developer.download.nvidia.com/compute/cuda/11.2.0/local_installers/cuda_11.2.0_460.27.04_linux.run |
- 注:我在这里以我正在使用的cuda 11.2.0版本为例,如果你想要下载其他版本,可以点击这里。
等待一段时间后,你会看到下面这个画面:
待我们输入 accept 之后,又会让你选择要安装的部分:
叉号代表选择,如果哪个部分不需要,使用空格键取消掉叉号即可,比如在这里最后三个就显得没必要了。之后将光标移动到 Install 选项上,等待安装即可。
好了,通常的“食用”方法我们已经了解了,如果运气好,一次成功,您就可以放心的去搭建自己的“炼丹炉”了,但如果你和我一样不幸失败了,就请继续看下去吧。
而报错的主要原因是在安装nvidia驱动时出错了,具体可以在log中查看。可为什么驱动就安装失败了呢,又如何进行解决呢?
1. 系统内核版本与驱动所需不一致
不知你在安装nvidia驱动的时候是否经常遇到下述这个错误?或是突然某一天你发现nvidia-smi
报错了。
1 | nvidia-smi |
然后把这个错误复制到百度上,往往会出现一堆博客告诉你要去装一个叫做dkms
的工具,但我每次都照做了,可一次也没有成功过。再继续搜一些博客,有些好心人会告诉你这个错误的出现是因为你的系统内核版本与驱动版本不相符了。
嗯?那解决方案就很容易了,我手动切换到之前的内核不就好了?
可,我只能远程连接到服务器,如何才能切换内核呢?但这又怎能难住面向搜索引擎编程的我呢?
切换内核方法如下:
- 首先我们可以使用这个命令打印一下我们目前机器上已经安装的内核版本。你可能会看到如下信息:
1
grep menuentry /boot/grub/grub.cfg
咦?这是不是有点像我们在开机的时候出现的高级选项里面的菜单?哈哈,我好像感觉快能切换内核了哦!接下来要怎么做呢?1
2
3
4
5
6
7
8
9
10
11
12
13if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-36cdc2c8-c9e8-476e-ba87-d0a912825a92' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-36cdc2c8-c9e8-476e-ba87-d0a912825a92' {
menuentry 'Ubuntu, with Linux 5.10.0-1034-oem' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-1034-oem-advanced-36cdc2c8-c9e8-476e-ba87-d0a912825a92' {
menuentry 'Ubuntu, with Linux 5.10.0-1034-oem (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-1034-oem-recovery-36cdc2c8-c9e8-476e-ba87-d0a912825a92' {
menuentry 'Ubuntu, with Linux 5.4.0-77-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-77-generic-advanced-36cdc2c8-c9e8-476e-ba87-d0a912825a92' {
menuentry 'Ubuntu, with Linux 5.4.0-77-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-77-generic-recovery-36cdc2c8-c9e8-476e-ba87-d0a912825a92' {
menuentry 'Ubuntu, with Linux 5.4.0-73-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-73-generic-advanced-36cdc2c8-c9e8-476e-ba87-d0a912825a92' {
menuentry 'Ubuntu, with Linux 5.4.0-73-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-73-generic-recovery-36cdc2c8-c9e8-476e-ba87-d0a912825a92' {
menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' {
接下来,我们去修改一下GRUB,设置一下内核的启动版本。
1
sudo vim /etc/default/grub
我们能看到有一行是
GRUB_DEFAULT=0
,嗯… 0 这个意思是不是就是内核选项呢?对,没错!那我们只要把所需要的内核版本的序号改过去是不是就可以了哎,但很可惜,我也不知道序号是不是可用的,因为写这篇博客的时候我并没有去验证。(因为之前隐约记得写成序号重启之后开不了机了,一直卡在高级选项页面,因此不敢轻易尝试,毕竟,我不想再跑趟机房了呀!)
但,我在这里介绍另一种修改方式,不用整形数,我们用字符串!比如,我在这里要修改成Ubuntu, with Linux 5.4.0-73-generic
,那怎么改呢?
请将GRUB_DEFAULT=0
改为GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-73-generic"
*请注意**,等号左右两边是不能有空格的哦!
再之后,我们需要更新一下GRUB,怎么做呢?
1
sudo update-grub
最后,重启机器吧,等待重启之后我们可以打印一下系统内核版本,看看是不是我们想要的那个。
1
uname -r
安装Linux内核
这个时候就有小伙伴要问了,你只告诉了我们如何切换内核,可我的系统里没有我想要使用的内核版本啊,这时候怎么办呢?嘿嘿嘿,那当然是要去安装了!
我们可以先查看一下系统可以安装的内核版本
1 | sudo apt-cache search linux-image | grep generic |
找到满意的之后,就直接使用apt
进行安装吧!
1 | sudo apt install linux-headers-5.4.0-73-generic linux-image-5.4.0-73-generic |
为了保险起见,在这里你可以再次重启系统,但其实不重启也没影响的。
好了,你可以继续尝试用 CUDA_Toolkit
安装包安装驱动了,我想这次你应该不会失败的。
嘿嘿,忘了说,Linux 5.4.0-73-generic
和 cuda 11.2.0
以及 Nvidia Driver 460.27.04
很配哦!
为什么呢,因为写这篇博客时下载的Ubuntu20.04.2镜像附带的内核版本是 Linux 5.4.0-77-generic
的,就导致我一直没有安装成功驱动,呜呜呜!
如果你到这里还没有成功,那我想,你是不是忘了下面的一点东东。
2. 你缺一些环境依赖呀!
比如,当你去查看nvidia驱动安装的log
1 | cat /var/log/nvidia-installer.log |
你是不是发现你的系统缺了make
啦,赶紧安装上继续冲驱动吧!
1 | sudo apt install make |
对了,别忘了要安装gcc
哦!
其他的具体情况,就请详见安装日志啦,都到这里了,我相信你会成功的!
3. 一点点注意事项
(1)突然 server系统有了桌面?
作为ubuntu server
的忠实用户,请一定不要使用ubuntu-drivers devices
来安装Nvidia驱动!如果你这么做了然后使用了ubuntu-drivers autoinstall
安装了驱动,你重启后就会发现你的server版本的系统竟然多了桌面!这对我们怎么是能忍的呢?赶紧卸载掉gnome
!
1 | # 卸载掉gnome-shell主程序 |
(2)哎,我开机时间怎么这么长?
当我重启的时候,为啥需要这么长的时间,这破机器到底在干啥?别埋怨了,是开机的网络自检占据了大部分的时间,那我们怎么限制开机的网络自检时间呢?
1 | sudo vim /lib/systemd/system/systemd-networkd-wait-online.service |
我们在上图中所示的位置加一个 --timeout=5
参数即可,快去重启系统看看,你的开机速度是不是显著加快啦!
4. 写在最后
嗯,转眼间编辑到凌晨两点多了,夜猫子要去碎觉了!
另外,这篇文章有哪里写的不对的地方,请家人们一定要指出来哦!
感谢您读到这里,晚安。