다음 명령을 사용하여 Docker 컨테이너(Nvidia CUDA 이미지에서 생성됨) 테스트를 시작했습니다.
docker run -i -t xxxxxx /bin/bash
루트 프롬프트가 표시되지만 다음과 같은 특정 작업에 대한 권한은 여전히 없습니다.
dmesg
"권한이 거부되었습니다"가 표시됩니다. 왜?
답변1
현대 리눅스에서는뿌리반드시 최종 권한을 갖는다는 의미는 아닙니다. 기능 메커니즘은 권한을 중단하여 보다 세분화된 권한 제어를 제공합니다.뿌리Docker는 이 메커니즘을 사용하여 특정 작업에 대한 부분 권한을 개별적으로 부여/취소합니다.
기본적으로 Docker는 컨테이너화된 프로세스를 시작할 때 프로세스가 대신 실행되는 경우에도 많은 위험한 기능을 삭제합니다.뿌리사용자. 이는 호스트 커널이 모든 컨테이너와 호스트 시스템 간에 공유되므로 권한 있는 컨테이너화된 프로세스의 일부 시스템 호출이 (귀하의 사례)에 대한 정보를 유출하거나 "외부 세계"에 영향을 미칠 수도 있기 때문입니다. 그렇기 때문에 실행할 때에도 "Permission Denied dmesg(1)
" 가 표시되는 것입니다.뿌리.
내부적으로 커널 로그를 가져오기 위해 시스템 dmesg(1)
호출이 호출됩니다. syslog(2)
에 따르면 man capabilities
이 시스템 호출에는 다음과 같은 특정 기능이 필요합니다 CAP_SYSLOG
.
CAP_SYSLOG (since Linux 2.6.37)
* Perform privileged syslog(2) operations.
See syslog(2) for information on which operations require privilege.
기본적으로 이 기능은 Docker 컨테이너에서 제거되므로 dmesg(1)
컨테이너에서는 실패합니다.
이미지 제공자를 신뢰하거나 보안에 크게 신경 쓰지 않는 경우 추가 기능을 사용하여 컨테이너( --cap-add syslog
)를 시작할 수 있습니다.
docker run -it --cap-add syslog nvcr.io/nvidia/cuda:9.0-devel-ubuntu16.04
그러면 문제가 해결될 것입니다.