在配备 Tesla Nvidia 卡的服务器上,我们决定限制用户对 GPU 的访问。在我们的服务器中 2 个 GPU。
# ls -las /dev/nvidia*
0 crw-rw-rw-. 1 root root 195, 0 Dec 2 22:02 /dev/nvidia0
0 crw-rw-rw-. 1 root root 195, 1 Dec 2 22:02 /dev/nvidia1
我找到了这个解决方案定义 GPU 的用户限制
我创建本地组 gpu_cuda
sudo groupadd gpu_cuda
将用户添加到组后gpu_cuda
在 /etc/modprob.d/nvidia.conf 中创建一个包含内容的配置文件
#!/bin/bash
options nvidia NVreg_DeviceFileUID=0 NVreg_DeviceFileGID=0 NVreg_DeviceFileMode=0777 NVreg_ModifyDeviceFiles=0
在 /etc/init.d/gpu-restriction 中创建脚本
#!/bin/bash
### BEGIN INIT INFO
# Provides: gpu-restriction
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
# permissions if needed.
### END INIT INFO
set -e
start() {
/sbin/modprobe --ignore-install nvidia;
/sbin/modprobe nvidia_uvm;
test -c /dev/nvidia-uvm || mknod -m 777 /dev/nvidia-uvm c $(cat /proc/devices | while read major device; do if [ "$device" == "nvidia-uvm" ]; then echo $major; break; fi ; done) 0 && chown :root /dev/nvidia-uvm;
test -c /dev/nvidiactl || mknod -m 777 /dev/nvidiactl c 195 255 && chown :root /dev/nvidiactl;
devid=-1;
for dev in $(ls -d /sys/bus/pci/devices/*);
do vendorid=$(cat $dev/vendor);
if [ "$vendorid" == "0x10de" ];
then class=$(cat $dev/class);
classid=${class%%00};
if [ "$classid" == "0x0300" -o "$classid" == "0x0302" ];
then devid=$((devid+1));
test -c /dev/nvidia${devid} || mknod -m 750 /dev/nvidia${devid} c 195 ${devid} && chown :gpu_cuda /dev/nvidia${devid};
fi;
fi;
done
}
stop() {
:
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
# code to check status of app comes here
# example: status program_name
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
exit 0
我重新启动服务器并运行
/etc/init.d/gpu-restriction start
第一次检查结果良好。
# ls -las /dev/nvidia*
0 crw-rw-rw-. 1 root gpu_cuda 195, 0 Dec 2 22:02 /dev/nvidia0
0 crw-rw-rw-. 1 root gpu_cuda 195, 1 Dec 2 22:02 /dev/nvidia1
但第二次,chown 组又回到了 root
# ls -las /dev/nvidia*
0 crw-rw-rw-. 1 root root 195, 0 Dec 2 22:02 /dev/nvidia0
0 crw-rw-rw-. 1 root root 195, 1 Dec 2 22:02 /dev/nvidia1
为什么结果返回?以及如何解决这个问题?
答案1
nvidia 提供了设置其特殊设备文件的组 ID 的方法,而无需诉诸任何额外的阴暗脚本:
无论用户空间 NVIDIA 驱动程序组件自行执行此操作,还是调用 nvidia-modprobe,它都会默认创建具有以下属性的设备文件:
UID: 0 - 'root' GID: 0 - 'root' Mode: 0666 - 'rw-rw-rw-'
如果现有设备文件的属性与这些默认值不匹配,则会更改现有设备文件。如果您希望 NVIDIA 驱动程序创建具有不同属性的设备文件,您可以使用“NVreg_DeviceFileUID”(用户)、“NVreg_DeviceFileGID”(组)和“NVreg_DeviceFileMode”NVIDIA Linux 内核模块参数来指定它们。
nvidia Linux 内核模块参数可以在 /etc/modprobe.d/nvidia.conf 文件中设置,我的告诉:
...
options nvidia \
NVreg_DeviceFileGID=27 \
NVreg_DeviceFileMode=432 \
NVreg_DeviceFileUID=0 \
NVreg_ModifyDeviceFiles=1\
...
我确实可以ls -ails /dev/nvidia0
:
3419 0 crw-rw---- 1 root video 195, 0 4 déc. 15:01 /dev/nvidia0
并见证对 root 拥有的特殊文件的访问实际上仅限于视频组的成员(我的系统上的 GID=27)
因此,您需要做的就是获取您的gpu_cuda
组的组 ID 并相应地修改(或设置)您的 nvidia.conf。
积分:(/usr/share/doc/nvidia-drivers-470.141.03/html/faq.html
您可能需要根据您的驱动程序版本调整路径)。