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
ドライバのバージョンによってはパスを調整する必要があるかもしれません)。