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

しかし、2番目に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

ルートが所有する特別なファイルへのアクセスが、実際にはビデオグループ(私のシステムのGID = 27)のメンバーに制限されていることを確認してください。

したがって、あなたがすべきことは、gpu_cudaグループのグループIDを取得し、それに応じてnvidia.confを変更(または設定)することです。


クレジット:(/usr/share/doc/nvidia-drivers-470.141.03/html/faq.htmlドライバのバージョンによってはパスを調整する必要があるかもしれません)。

関連情報