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 그룹이 루트로 돌아왔습니다.
# 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
드라이버 버전에 따라 경로를 조정해야 할 수도 있습니다).