前几天发现公司服务器上的docker不能用了(在运行中的docker可正常使用,但是不能start和run一个容器),定位原因是服务器上存在多个版本的NVIDIA驱动。可能是服务器自更新或者有同事不小心安装了相关的依赖项。
现在是希望在不重启服务器的前提下,找到问题并解决它。

一、遇到的情况(两种)

docker run或者start时报错如下:

  1. Error response from daemon: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v1.linuxg.json: no such file or directory): exec: "nvidia-container-runtime": executable file not found in $PATH: : unknown
  2. Error: failed to start containers: xxx

nvidia-smi时报错如下:

  1. Failed to initialize NVML: Driver/library version mismatch

二、定位问题

2.1 查看nvidia版本

  1. >>> cat /proc/driver/nvidia/version
  2. NVRM version: NVIDIA UNIX x86_64 Kernel Module 460.56 Tue Feb 23 23:31:36 UTC 2021
  3. GCC version: gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)

2.2 查看系统更新日志(无异常)

  1. # 列出日志中与NVIDIA有关的信息
  2. >>> cat /var/log/dpkg.log |grep nvidia
  1. # 将所有与安装于更新有关的log保存在log.dat中
  2. >>> grep "install|upgrade" /var/log/dpkg.log | grep "2021-10" > log.dat

2.3 查看NVIDIA驱动版本以及其他依赖项

  1. >>> sudo dpkg --list |grep nvidia-*

linux系统下的nvidia-docker安装(四):在线和离线安装 - 图1
至此,发现了问题所在——NVIDIA多版本冲突

三、尝试解决

3.1 解决nvidia-smi报错

同事在不重启电脑的情况下,将多版本卸载后重新安装了一个NVIDIA-460驱动。但是具体安装方式我不清楚。安装后,查询结果如下:
linux系统下的nvidia-docker安装(四):在线和离线安装 - 图2
解决了nvidia-smi报错问题,但是docker仍不能使用。
对比之前截图,发现少了NVIDIA-docker相关的软件。按照本系列的《Linux系统下的cuda更新安装》教程逐步定位检查。确认 ① NVIDIA驱动更新OK;② CUDA安装 OK;③ cuDNN安装可能存在问题(示例报错:ERROR: cuda failure (unknown error) in error_util.h:91 \ Aborting…)

3.2 解决cuDNN示例报错问题

按照Linux系统下的cuda更新安装(二)中所示,重新安装了一次cuDNN,但是问题仍存在。没办法定位这个问题产生的影响,因此先解决docker的start与run的问题吧。

3.3 在线安装nvidia-docker2

安装nvidia-docker2的前提是安装好docker,可以用docker --version来查看自己安装的docker版本。
① 首先最简单的安装方式:sudo apt install -y nvidia-docker2。(一般在有网络情况下,执行这条命令就可以了。)
linux系统下的nvidia-docker安装(四):在线和离线安装 - 图3

② 是没找到相关的安装包资源吗?那就试试sudo apt-get update。得到了以下报错信息
linux系统下的nvidia-docker安装(四):在线和离线安装 - 图4

③ 那么试试添加nvidia-docker的源curl -s -L ``[https://nvidia.github.io/nvidia-docker/gpgkey](https://nvidia.github.io/nvidia-docker/gpgkey)`` | sudo apt-key add -得到了gpg: no valid OpenPGP data found.
网上查了一下,说是这个代码可以分为两部分执行,那就先下载gpg文件curl -O https://packages.cloud.google.com/apt/doc/apt-key.gpg。得到了超时报错
linux系统下的nvidia-docker安装(四):在线和离线安装 - 图5

好,至此已经忙了几个小时。虽然还没装好环境,但是得到一个大致的方向,就是公司电脑不能连外网(半年前还可以连,所以之前没往这个方向去想)。在和运维支持部的同事确认之后,开始寻找离线安装nvidia-docker2的方法。

3.4 离线安装nvidia-docker2

主要流程:
linux系统下的nvidia-docker安装(四):在线和离线安装 - 图6

① 下载libnvidia-container

  1. sudo dpkg -i libnvidia-container1_1.5.1-1_amd64.deb
  2. sudo dpkg -i libnvidia-container-tools_1.5.1-1_amd64.deb

② 下载nvidia-container-toolkit和nvidia-container-runtime

  1. sudo dpkg -i nvidia-container-toolkit_1.5.1-1_amd64.deb
  2. sudo dpkg -i nvidia-container-runtime_3.5.0-1_amd64.deb

③ 下载nvidia-docker2

  1. sudo dpkg -i nvidia-docker2_2.6.0-1_all.deb

④ 重启docker

  1. sudo service docker restart

遇到的问题:
① 安装nvidia-container-toolkit_1.5.1时遇到缺少libnvidia-container-toolkit依赖项 。
linux系统下的nvidia-docker安装(四):在线和离线安装 - 图7
用命令sudo apt-get -f -y install没有解决该问题,而是又一次提醒我无法连接网络的这一实事。
linux系统下的nvidia-docker安装(四):在线和离线安装 - 图8
后面安装提示下载了libnvidia-container1以及对应版本的libnvidia-container-tools。

参考文章: