目录
[2.1 法一](#2.1 法一)
[2.2 法二](#2.2 法二)
[3.1 解决方案](#3.1 解决方案)
[3.2 进一步解决](#3.2 进一步解决)
[3.3 最后解决](#3.3 最后解决)
一、初始问题
今天要在本机上装个环境时,运行了一下 nvidia-smi突然遇到一个问题:
Failed to initialize NVML: Driver/library version mismatch
然后查找解决方案,找到这个博主的方法:
输入:
bash
dpkg -l | grep nvidia
可以看到对应的nvidia驱动的版本号
然后查看内核的版本:
bash
cat /proc/driver/nvidia/version
看到我的是 535.183.01,可能是和 nvidia 驱动版本号不一致的问题,后面查找时一些博主说是由于 ubuntu 20.04 自动更新导致,所以最后可以关掉自动更新,这里先不赘述。
二、解决方法
2.1 法一
上面的博客中说到一个简单直接的方法,即重启,reboot,重启后系统会自动更新内核使得版本一致。然后就可以解决
但我因为在用服务器跑代码,在看,就想着不用重启的方法。。。后悔!
不过重启的方法我没试过,不知道是不是能解决。
2.2 法二
采用指令退出当前内核使用的显卡模块,然后重新加载升级后版本的显卡驱动作为内核模块。
bash
sudo rmmod nvidia
sudo nvidia-smi
但 sudo rmmod nvidia 就遇到问题:
bash
$ sudo rmmod nvidia
rmmod: ERROR: Module nvidia is in use by: nvidia_modeset nvidia_uvm
说明我们正在使用,所以需要手动退出nvidia_uvm, nvidia_modeset服务。
查看nvidia模块使用情况:
bash
$lsmod | grep nvidia
nvidia_uvm 94718 0
nvidia_drm 531248 0
nvidia_modeset 79588287 1 nvidia_drm
nvidia 121440 132 nvidia_modeset,nvidia_uvm 12899044640 132 nvidia_modeset,nvidia_uvm
用 kill -9 PID终止进程,但我一直显示找不到进程,就强制终止:
bash
sudo -f rmmod nvidia_uvm
sudo -f rmmod nvidia_drm
sudo -f rmmod nvidia_modeset
sudo rmmod nvidia
再输入:
bash
sudo nvidia-smi
没有解决,就重启,发现又出现了新的问题:
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
三、新的问题
3.1 解决方案
说到还是驱动的问题。
(1)安装 dkms
bash
sudo apt-get install dkms
(2)查看本机连接不上的驱动版本:
bash
ls -l /usr/src/
可以看到我的版本是 nvidia-535.183.01
如果没有 nvidia-535.183.01 这类文件,可以打开 ubuntu 的软件与更新,手动安装
安装完成后在 /usr/src/ 目录下就会有 nvidia-535.183.01文件。
(3)使用dkms重新安装适合驱动:
bash
sudo dkms install -m nvidia -v 535.183.01
如果安装成功,那么恭喜,已经可以 nvidia-smi了
3.2 进一步解决
如果和我一样,安装失败,那么继续吧!
输入:
bash
gcc --version
查看 gcc 版本。
如果你的gcc(尽量大于7.3版本)版本过低,那么上述命令sudo dkms install -m nvidia -v 470.103.01失败的原因就找到了。
(注意,这里up安装时层层报错,如果不按这个安装,可以直接跳转到 3.3 ,另一种方法安装,一步解决)
下面安装gcc7.5版本:
(1)下载gcc,输入命令:
bash
cd /usr/local/src/
wget http://ftp.gnu.org/gnu/gcc/gcc-7.5.0/gcc-7.5.0.tar.xz tar xvf
gcc-7.5.0.tar.xz
(2)安装gcc的依赖软件,gcc的软件包内提供了自动下载需要软件的脚本,命令如下:
bash
cd gcc-7.5.0/
./contrib/download_prerequisites
这里也可能出现问题,大概是如下的错误,因为小编这里的错误当时没保存,所以参考这篇文章:Ubuntu 16.04系统中GCC 9.1编译器安装方法及C++17标准测试示例-CSDN博客
configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
their locations. Source code for these libraries can be found at
their respective hosting sites as well as at
ftp://gcc.gnu.org/pub/gcc/infrastructure/. See also
http://gcc.gnu.org/install/prerequisites.html for additional info. If
you obtained GMP, MPFR and/or MPC from a vendor distribution package,
make sure that you have installed both the libraries and the header
files. They may be located in separate packages.
使用vi编辑器打开依赖包下载脚本文件:contrib/download_prerequisites
将该文件里的 base_url='ftp://gcc.gnu.org/pub/gcc/infrastructure/'**替换为:**base_url='http://mirror.linux-ia64.org/gnu/gcc/infrastructure/',即将不存在的服务器地址替换为镜像服务器地址。
然后再
bash
./contrib/download_prerequisites
如果提示如下信息,则代表下载并解压成功:
2018-03-24 21:01:37 URL:http://mirror.linux-ia64.org/gnu/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840/2383840] -> "./gmp-6.1.0.tar.bz2" [1]
2018-03-24 21:01:46 URL:http://mirror.linux-ia64.org/gnu/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284/1279284] -> "./mpfr-3.1.4.tar.bz2" [1]
2018-03-24 21:01:51 URL:http://mirror.linux-ia64.org/gnu/gcc/infrastructure/mpc-1.0.3.tar.gz [669925/669925] -> "./mpc-1.0.3.tar.gz" [1]
2018-03-24 21:01:58 URL:http://mirror.linux-ia64.org/gnu/gcc/infrastructure/isl-0.16.1.tar.bz2 [1626446/1626446] -> "./isl-0.16.1.tar.bz2" [1]
gmp-6.1.0.tar.bz2: 确定
mpfr-3.1.4.tar.bz2: 确定
mpc-1.0.3.tar.gz: 确定
isl-0.16.1.tar.bz2: 确定
All prerequisites downloaded successfully.
如果出现如下信息,则表示包:gmp-6.1.0.tar.bz2没有下载成功:
2018-03-24 20:54:39 URL:http://gcc.parentingamerica.com/infrastructure/mpc-1.0.3.tar.gz [669925/669925] -> "./mpc-1.0.3.tar.gz" [1]
2018-03-24 20:56:16 URL:http://gcc.parentingamerica.com/infrastructure/isl-0.16.1.tar.bz2 [1626446/1626446] -> "./isl-0.16.1.tar.bz2" [1]
gmp-6.1.0.tar.bz2: 失败
sha512sum: 警告:1 个校验和不匹配
error: Cannot verify integrity of possibly corrupted file gmp-6.1.0.tar.bz2
这是因为网络连接不正常造成的,解决方案是,进入目录 "/home/davidhopper/code/gcc/gcc-7.3.0" ,手动将已下载的"mpc-1.0.3.tar.gz "、"isl-0.16.1.tar.bz2"文件删除,重新执行
bash
./ contrib/download_prerequisites
命令下载。如果仍然提示失败,则应使用vi编辑器修改 contrib/download_prerequisites
文件里的 **base_ur=...**换为另一个能够正常连接并下载的镜像服务器地址。
或者使用笨方法:
进入镜像服务器网址:Index of /gnu/gcc/infrastructure,手动下载,并建立链接
bash
cd ~/code/gcc/gcc-7.3.0
tar zxvf gmp-6.1.0.tar.gz
tar zxvf mpfr-3.1.4.tar.gz
tar zxvf mpc-1.0.3.tar.gz
ln -s gmp-6.1.0 gmp
ln -s mpfr-3.1.4 mpfr
ln -s mpc-1.0.3 mpc
随后即可
(3)生成Makefile文件,输入命令:
bash
./configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
可能会出现如下的问题:
configure: error: in `/root/dev_env/ffmpeg-static/build/libpng-1.2.58':
configure: error: C compiler cannot create executables
See `config.log' for more details
查看 config.log ,发现:
collect2: ld returned 1 exit status
可能是要安装 openssl-devel,但up又失败了!!!
3.3 最后解决
这是一个师兄提供的方法,另一种方式安装 gcc
到这里:GitHub - gaoxiang12/slam_in_autonomous_driving: 《自动驾驶中的SLAM技术》对应开源代码
bash
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo update-alternatives --remove-all gcc
sudo update-alternatives --remove-all g++
#命令最后的1和10是优先级,如果使用auto选择模式,系统将默认使用优先级高的
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 1
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 1
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 10
注意:
这里:sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 1
好像最好一行一行的输入
然后重启,即可 nvidia-smi
最后还可以关闭自动更新