收起左侧

关于大家关心的Nvidia在Docker运行中出现的一些问题,进行简单的解释。

2
回复
196
查看
[ 复制链接 ]

1

主题

4

回帖

0

牛值

江湖小虾

前言:

飞牛OS在开发中可以看的出,在安全方面还是比较严格的。在我们刚安装时候输入的用户名时,你的权限就已经确定了,所以在web中打开的Docker也继承了你的用户权限,并不是root的高级权限,所以在调用系统层时,会出现无法访问的现象。

导致用户无法在Docker中使用Nvidia驱动的主要有2个原因,一个是应用商城中的Nvidia驱动中的部分源文件有问题。另外一个是docker权限无法调用系统文件。

下面引用了几位大神之作,都是正确合理的操作,我只是做了一点点补充。

在飞牛OS使用libnvidia-container让docker容器支持NVIDIA GPU加速
https://club.fnnas.com/forum.php?mod=viewthread&tid=14106
最新版系统docker中调用nvidia失效解决办法
https://club.fnnas.com/forum.php?mod=viewthread&tid=19860
安装驱动后Docker下无法使用CUDA的解决方法
https://club.fnnas.com/forum.php?mod=viewthread&tid=1843

正文:

刚安装好飞牛OS的用户先进行普通注册,并安装好应用商城中的Nvidia。同时启动一次Docker(很重要),其次打开SSH功能后进入ssh代码:

#添加源地址

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://mirrors.ustc.edu.cn/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://nvidia.github.io#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://mirrors.ustc.edu.cn#g' | \
    tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

#更新源列表以及安装

sudo apt update && sudo apt install nvidia-container-toolkit

如果你安装了Nvidia驱动,那么列表返回并不像引用文章中提示的那样,而应该是这样:(文末会提示链接错误),这个可以不用管它。

ldconfig: /lib/x86_64-linux-gnu/libnvidia-nvvm.so.4 is not a symbolic link

#替换源驱动内 库文件

mv /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1.bak
mv /usr/lib/x86_64-linux-gnu/libnvidia-ml.so /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.bak
ln -sf /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.560.28.03 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
ln -sf /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.560.28.03 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so
mv /usr/lib/x86_64-linux-gnu/libcuda.so /usr/lib/x86_64-linux-gnu/libcuda.so.bak
mv /usr/lib/x86_64-linux-gnu/libcuda.so.1 /usr/lib/x86_64-linux-gnu/libcuda.so.1.bak
ln -sf /usr/lib/x86_64-linux-gnu/libcuda.so.560.28.03 /usr/lib/x86_64-linux-gnu/libcuda.so
ln -sf /usr/lib/x86_64-linux-gnu/libcuda.so.560.28.03 /usr/lib/x86_64-linux-gnu/libcuda.so.1
ln -sf /lib/x86_64-linux-gnu/libGLESv2_nvidia.so.560.28.03 /lib/x86_64-linux-gnu/libGLESv2_nvidia.so.2
ln -sf /lib/x86_64-linux-gnu/libcudadebugger.so.560.28.03 /lib/x86_64-linux-gnu/libcudadebugger.so.1
ln -sf /lib/x86_64-linux-gnu/libEGL_nvidia.so.560.28.03 /lib/x86_64-linux-gnu/libEGL_nvidia.so.0
ln -sf /lib/x86_64-linux-gnu/libGLESv1_CM_nvidia.so.560.28.03 /lib/x86_64-linux-gnu/libGLESv1_CM_nvidia.so.1
ln -sf /lib/x86_64-linux-gnu/libnvidia-fbc.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-fbc.so
ln -sf /lib/x86_64-linux-gnu/libnvidia-fbc.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-fbc.so.1
ln -sf /lib/x86_64-linux-gnu/libnvidia-cfg.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-cfg.so
ln -sf /lib/x86_64-linux-gnu/libnvidia-cfg.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-cfg.so.1
ln -sf /lib/x86_64-linux-gnu/libnvidia-ml.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-ml.so
ln -sf /lib/x86_64-linux-gnu/libnvidia-ml.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-ml.so.1
ln -sf /lib/x86_64-linux-gnu/libnvcuvid.so.560.28.03 /lib/x86_64-linux-gnu/libnvcuvid.so
ln -sf /lib/x86_64-linux-gnu/libnvcuvid.so.560.28.03 /lib/x86_64-linux-gnu/libnvcuvid.so.1
ln -sf /lib/x86_64-linux-gnu/libcuda.so.560.28.03 /lib/x86_64-linux-gnu/libcuda.so
ln -sf /lib/x86_64-linux-gnu/libcuda.so.560.28.03 /lib/x86_64-linux-gnu/libcuda.so.1
ln -sf /lib/x86_64-linux-gnu/libnvoptix.so.560.28.03 /lib/x86_64-linux-gnu/libnvoptix.so.1
ln -sf /lib/x86_64-linux-gnu/libnvidia-opencl.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-opencl.so.1
ln -sf /lib/x86_64-linux-gnu/libnvidia-allocator.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-allocator.so
ln -sf /lib/x86_64-linux-gnu/libnvidia-allocator.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-allocator.so.1
ln -sf /lib/x86_64-linux-gnu/libnvidia-egl-wayland.so.1.1.13 /lib/x86_64-linux-gnu/libnvidia-egl-wayland.so.1
ln -sf /lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 /lib/x86_64-linux-gnu/libOpenCL.so.1
ln -sf /lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so
ln -sf /lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so.1
ln -sf /lib/x86_64-linux-gnu/libnvidia-ngx.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-ngx.so.1
ln -sf /lib/x86_64-linux-gnu/libGLX_nvidia.so.560.28.03 /lib/x86_64-linux-gnu/libGLX_nvidia.so.0
ln -sf /lib/x86_64-linux-gnu/libnvidia-opticalflow.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-opticalflow.so
ln -sf /lib/x86_64-linux-gnu/libnvidia-opticalflow.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-opticalflow.so.1
ln -sf /lib/x86_64-linux-gnu/libnvidia-egl-gbm.so.1.1.1 /lib/x86_64-linux-gnu/libnvidia-egl-gbm.so.1
ln -sf /lib/x86_64-linux-gnu/libnvidia-encode.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-encode.so
ln -sf /lib/x86_64-linux-gnu/libnvidia-encode.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-encode.so.1
ln -sf /lib/x86_64-linux-gnu/libnvidia-nvvm.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-nvvm.so
ln -sf /lib/x86_64-linux-gnu/libnvidia-nvvm.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-nvvm.so.4
ln -sf /lib/x86_64-linux-gnu/libnvidia-vksc-core.so.560.28.03 /lib/x86_64-linux-gnu/libnvidia-vksc-core.so.1

#docker 作为root的权限组里

sudo chown root:docker /var/run/docker.sock  # 确保所属组是 docker
sudo chmod 660 /var/run/docker.sock         # 组用户可读写

#设置nvidia-smi的权限

sudo chmod a+rx /usr/bin/nvidia-smi
sudo chmod a+rx /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
sudo chmod a+rx /usr/lib/x86_64-linux-gnu/libnvidia-ml.so

#提高文件权限

sudo chmod 777 /usr/lib/x86_64-linux-gnu/*
sudo chmod -R a+r /usr/lib/firmware/nvidia  # 开放读取权限
sudo chmod a+rx /usr/lib/firmware/nvidia/560.28.03  # 确保目录可访问

#更改 docker/daemon.json文件,runtime使用绝对路径

sudo nano /etc/docker/daemon.json

打开后,用Delete删除里面所有内容,然后复制下面内容后,右键,之后Ctrl+X退出,先择Y保存,再回车确定路径

{
"data-root": "/vol1/docker",
"insecure-registries": ["127.0.0.1:19827"],
"live-restore": true,
"log-driver": "json-file",
"log-opts": {
"max-file": "5",
"max-size": "100m"
},
"proxies": {},
"registry-mirrors": [
"https://docker.ketches.cn",
"https://docker.fnnas.com",
"https://registry.hub.docker.com"
],
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}

#退回用户层

exit

#设置Docker包含用户权限

sudo usermod -aG docker $USER

#最后重启电脑

sudo systemctl reboot

重启后,SSH登陆NAS,用户层校验Docker权限,

groups

如果是
Users Administrators
表示没有权限,
如果是
Users docker Administrators
就对了

root层校验runtime

sudo docker info | grep -i runtim

返回如果是:
Runtimes: io.containerd.runc.v2 nvidia runc
Default Runtime: runc
代表runtime的工作模式是runc。步骤有错误。
应该是:
Runtimes: runc io.containerd.runc.v2 nvidia
Default Runtime: nvidia
代表runtime的工作模式是nvidia。

最后,记得删除之前的Docke。重新创建容器。

收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

1

主题

4

回帖

0

牛值

江湖小虾

7 天前 楼主 显示全部楼层

image.png

在新建容器时,功能配置选择默认,不可以选择高级执行容器,不然会提示没有权限访问库文件。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

1

主题

4

回帖

0

牛值

江湖小虾

7 天前 楼主 显示全部楼层

image.png也可以在终端机上输入nvidia-smi来进行校验是否准确连上显卡了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则