我测试了使用以下命令启动的Docker容器(从Nvidia CUDA映像创建):
docker run -i -t xxxxxx /bin/bash
我可以看到root提示符,但是仍然没有某些操作的特权。例如,当我执行时:
dmesg
我看到“权限被拒绝”。为什么?
在现代Linux中,成为root并不一定意味着拥有最终权限。功能机制通过中断可能分别授予/从特定任务授予/撤销的部分中的root权限来提供对权限的更细粒度控制,并且Docker使用此机制。
默认情况下,即使启动了容器化进程,Docker也会放弃许多危险的功能,即使该进程代表root用户运行。这是因为主机内核在所有容器和主机系统之间共享,因此,来自特权容器化过程的某些系统调用可能会揭示有关(您的情况)的信息,甚至会影响“外部世界”。这就是为什么即使您dmesg(1)
以root身份运行时也会看到“权限被拒绝”的原因。
在内部,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
这样可以解决您的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句