群晖驱动编译篇(五)SA6400 NVIDIA Display Driver nvidia-smi
本驱动坑度:30,编译耗时: 60分钟以内,主要是东西太多了
设备信息:SA6400 DSM 7.2.1-69057 Update 5
内核信息:5.10.55+
驱动源码下载地址:https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.100/NVIDIA-Linux-x86_64-550.100.run
目的:使用nvidia-smi
坑:NVIDIA自带的链接库太大了 600MB+
使用指引:
下载官方驱动https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.100/NVIDIA-Linux-x86_64-550.100.run
1.执行下面命令解压驱动程序:
chmod +x NVIDIA-Linux-x86_64-550.100.run
./NVIDIA-Linux-x86_64-550.100.run -x --tmpdir .
2. 创建存放目录,需要预留1G空间
mkdir -p /volume2/@nvidia/bin
mkdir -p /volume2/@nvidia/lib
mkdir -p /volume2/@nvidia/module
3. 提取nvidia-smi需要的依赖库和可执行程序
cd NVIDIA-Linux-x86_64-550.100/
cp -f libcudadebugger.so.550.100 /volume2/@nvidia/lib/
cp -f libcuda.so.550.100 /volume2/@nvidia/lib/
cp -f libEGL_nvidia.so.550.100 /volume2/@nvidia/lib/
cp -f libEGL.so.1.1.0 /volume2/@nvidia/lib/
cp -f libEGL.so.550.100 /volume2/@nvidia/lib/
cp -f libGLdispatch.so.0 /volume2/@nvidia/lib/
cp -f libGLESv1_CM_nvidia.so.550.100 /volume2/@nvidia/lib/
cp -f libGLESv1_CM.so.1.2.0 /volume2/@nvidia/lib/
cp -f libGLESv2_nvidia.so.550.100 /volume2/@nvidia/lib/
cp -f libGLESv2.so.2.1.0 /volume2/@nvidia/lib/
cp -f libGL.so.1.7.0 /volume2/@nvidia/lib/
cp -f libGLX_nvidia.so.550.100 /volume2/@nvidia/lib/
cp -f libglxserver_nvidia.so.550.100 /volume2/@nvidia/lib/
cp -f libGLX.so.0 /volume2/@nvidia/lib/
cp -f libnvcuvid.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-allocator.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-api.so.1 /volume2/@nvidia/lib/
cp -f libnvidia-cfg.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-eglcore.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-egl-gbm.so.1.1.1 /volume2/@nvidia/lib/
cp -f libnvidia-egl-wayland.so.1.1.13 /volume2/@nvidia/lib/
cp -f libnvidia-encode.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-fbc.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-glcore.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-glsi.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-glvkspirv.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-gpucomp.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-gtk2.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-gtk3.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-ml.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-ngx.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-nvvm.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-opencl.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-opticalflow.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-pkcs11-openssl3.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-pkcs11.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-ptxjitcompiler.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-rtcore.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-tls.so.550.100 /volume2/@nvidia/lib/
cp -f libnvidia-wayland-client.so.550.100 /volume2/@nvidia/lib/
cp -f libnvoptix.so.550.100 /volume2/@nvidia/lib/
cp -f libOpenCL.so.1.0.0 /volume2/@nvidia/lib/
cp -f libOpenGL.so.0 /volume2/@nvidia/lib/
cp -f libvdpau_nvidia.so.550.100 /volume2/@nvidia/lib/
cp -f nvidia_drv.so /volume2/@nvidia/lib/
cp -f nvidia-cuda-mps-control /volume2/@nvidia/bin/
cp -f nvidia-cuda-mps-server /volume2/@nvidia/bin/
cp -f nvidia-debugdump /volume2/@nvidia/bin/
cp -f nvidia-installer /volume2/@nvidia/bin/
cp -f nvidia-modprobe /volume2/@nvidia/bin/
cp -f nvidia-ngx-updater /volume2/@nvidia/bin/
cp -f nvidia-persistenced /volume2/@nvidia/bin/
cp -f nvidia-powerd /volume2/@nvidia/bin/
cp -f nvidia-settings /volume2/@nvidia/bin/
cp -f nvidia-smi /volume2/@nvidia/bin/
cp -f nvidia-xconfig /volume2/@nvidia/bin/
4. 加载内核模块
sudo mv nvidia.ko /volume2/@nvidia/module/
sudo insmod /volume2/@nvidia/module/nvidia.ko
5. 下载ldconfig和ld.so.conf(DSMDriver/SA6400/NVIDIA Graphics Cards/miniruntime at main · adnin10086/DSMDriver (github.com)),可以自行修改ld.so.conf中nvidia驱动存放位置(/volume2/@nvidia)
sudo chmod +x ldconfig
sudo mv ldconfig /sbin/ldconfig
sudo mv ld.so.conf /etc/ld.so.conf
sudo ldconfig
6. 建立软连接,便于执行命令
sudo ln -s /volume2/@nvidia/bin/nvidia-smi /usr/bin
7. 运行nvidia-smi命令
nvidia-smi
8. 开机自动加载驱动。在群晖中创建计划任务,触发动作选”开机”,执行权限root,脚本内容如下:
sleep 5
/sbin/insmod /volume2/@nvidia/module/nvidia.ko
sleep 5
Runtimes 需要修改DSM ContainerManager的配置文件,配置文件在
/var/packages/ContainerManager/etc/dockerd.json
躺平玩法:
直接从Github下载我编译好的驱动,仅在SA6400 DSM 7.2.1-69057 Update 5 上验证。但因为是基于内核源码编译的,理论上能在内核版本为5.10.x的SA6400上使用
下载地址:DSMDriver/SA6400/NVIDIA Graphics Cards/build at main · adnin10086/DSMDriver (github.com)
战斗机玩法:
编译准备:
- 驱动源码:https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.100/NVIDIA-Linux-x86_64-550.100.run
- 群晖内核源码:https://global.synologydownload.com/download/ToolChain/Synology%20NAS%20GPL%20Source/7.2-64570/epyc7002/linux-5.10.x.txz
- 交叉编译工具:https://global.synologydownload.com/download/ToolChain/toolchain/7.2-72746/AMD%20×86%20Linux%20Linux%205.10.55%20%28epyc7002%29/epyc7002-gcc1220_glibc236_x86_64-GPL.txz
- Debain 11机器一台
编译方法:
第一步:先解压文件:
tar -xf linux-5.10.x.txz
tar -xf epyc7002-gcc1220_glibc236_x86_64-GPL.txz
chmod +x NVIDIA-Linux-x86_64-550.100.run
./NVIDIA-Linux-x86_64-550.100.run -x --tmpdir .
第二步:内核编译配置初始化
在群晖源码内核中执行以下命令,博主的目录是/root/build/linux-5.10.x
cd /root/build/linux-5.10.x
apt update
apt install -y build-essential flex bison libssl-dev libelf-dev
cp synology/synoconfigs/epyc7002 .config
sed -i "s/# CONFIG_X86_PAT is not set/CONFIG_X86_PAT=y/g" .config
make oldconfig ; make modules_prepare
sed -i "s/#define UTS_RELEASE \"5.10.55\"/#define UTS_RELEASE \"5.10.55+\"/g" include/generated/utsrelease.h
第三步:修改源码
方式一:下载patch文件DSMDriver/SA6400/NVIDIA Graphics Cards/patch at main · adnin10086/DSMDriver (github.com)
cd /root/build/NVIDIA-Linux-x86_64-550.100/kernel
patch -p1 < 001_sys_close_force_version_judge.patch
方式二:人肉修改
修改/root/build/NVIDIA-Linux-x86_64-550.100/kernel/nvidia/nv-caps.c 第599行
/*
* From v4.17-rc1 (to v5.10.8) kernels have stopped exporting sys_close(fd)
* and started exporting __close_fd, as of this commit:
* 2018-04-02 2ca2a09d6215 ("fs: add ksys_close() wrapper; remove in-kernel
* calls to sys_close()")
* Kernels v5.11-rc1 onwards have stopped exporting __close_fd, and started
* exporting close_fd, as of this commit:
* 2020-12-20 8760c909f54a ("file: Rename __close_fd to close_fd and remove
* the files parameter")
*/
#if NV_IS_EXPORT_SYMBOL_PRESENT_close_fd
close_fd(fd);
#elif NV_IS_EXPORT_SYMBOL_PRESENT___close_fd
__close_fd(current->files, fd);
#else
sys_close(fd);
#endif
task_unlock(current);
#endif
}
修改为
/*
* From v4.17-rc1 (to v5.10.8) kernels have stopped exporting sys_close(fd)
* and started exporting __close_fd, as of this commit:
* 2018-04-02 2ca2a09d6215 ("fs: add ksys_close() wrapper; remove in-kernel
* calls to sys_close()")
* Kernels v5.11-rc1 onwards have stopped exporting __close_fd, and started
* exporting close_fd, as of this commit:
* 2020-12-20 8760c909f54a ("file: Rename __close_fd to close_fd and remove
* the files parameter")
*/
#if NV_IS_EXPORT_SYMBOL_PRESENT_close_fd
close_fd(fd);
#elif NV_IS_EXPORT_SYMBOL_PRESENT___close_fd
__close_fd(current->files, fd);
#elif (LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0))
sys_close(fd);
#else
ksys_close(fd);
#endif
task_unlock(current);
#endif
}
第四步:编译源码,注意目录地址是NVIDIA-Linux-x86_64-550.100/kernel
cd /root/build/NVIDIA-Linux-x86_64-550.100/kernel
export ARCH=x86_64
export CROSS_COMPILE=/root/nvida/x86_64-pc-linux-gnu/bin/x86_64-pc-linux-gnu-
export IGNORE_MISSING_MODULE_SYMVERS=1
make SYSSRC=/root/build/linux-5.10.x
最后结果如下图:
