debian 系统不知为何,开机没有自动加载 nvidia-uvm 设备,需要在主机系统手动启动任意一个cuda程序才能加载,非常坑爹。
写了一个脚本,配置了一个自动创建 nvidia-uvm 的 systemd 的服务。
#!/bin/bash
# 确保为 root 用户
if [ "$UID" -ne "0" ]; then
echo "Must be root to run this script."
exit 1
fi
# 创建自动加载脚本
echo "Create preload-nv-mod.sh > /preload_nv_mod.sh"
cat << \EOF > /preload_nv_mod.sh
#!/bin/bash
/sbin/modprobe nvidia
if [ "$?" -eq 0 ]; then
# Count the number of NVIDIA controllers found.
NVDEVS=`lspci | grep -i NVIDIA`
N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l`
NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l`
N=`expr $N3D + $NVGA - 1`
for i in `seq 0 $N`; do
mknod -m 666 /dev/nvidia$i c 195 $i
done
mknod -m 666 /dev/nvidiactl c 195 255
else
exit 1
fi
/sbin/modprobe nvidia-uvm
if [ "$?" -eq 0 ]; then
# Find out the major device number used by the nvidia-uvm driver
D=`grep nvidia-uvm /proc/devices | awk '{print $1}'`
mknod -m 666 /dev/nvidia-uvm c $D 0
else
exit 1
fi
EOF
# 设定 755 权限
chown root:root /preload_nv_mod.sh
chmod 755 /preload_nv_mod.sh
# 创建 systemd 的服务配置文件
echo "Create preload-nv-mod.service > /lib/systemd/system/preload-nv-mod.service"
cat << \EOF > /lib/systemd/system/preload-nv-mod.service
[Unit]
Description=preload-nv-mod
Documentation=None
ConditionFileIsExecutable=/preload_nv_mod.sh
After=network.target
[Service]
Type=forking
ExecStart=/preload_nv_mod.sh
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
[Install]
WantedBy=multi-user.target
EOF
# 设定服务配置的权限
chown root:root /lib/systemd/system/preload-nv-mod.service
chmod 644 /lib/systemd/system/preload-nv-mod.service
# 启用服务
echo "setting autostart"
systemctl enable preload-nv-mod
# 启动服务
echo "start service"
systemctl start preload-nv-mod
# 检查服务状态
echo "check service status"
systemctl status preload-nv-mod
参考资料
nvidia cuda官方创建 nvidia-uvm 节点的脚本
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-verifications
stackoverflow 上的问题 正确创建 nvidia-uvm 设备
https://askubuntu.com/questions/590319/how-do-i-enable-automatically-nvidia-uvm
Debian11 创建 systemd 开机服务
https://www.burning.net.cn/article/article-60