限制用户访问 nvidia GPU?

限制用户访问 nvidia GPU?

在配备 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您可能需要根据您的驱动程序版本调整路径)。

相关内容