前言:
飞牛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。重新创建容器。