设置容器/沙箱的一个常见场景是希望在新的 tmpfs 中创建一组最小的设备节点(而不是暴露主机/dev),我知道的唯一(非特权)方法是通过绑定安装想要的进去。我正在使用(内部unshare -mc --keep-caps)的命令是:
mkdir /tmp/x
mount -t tmpfs none /tmp/x
touch /tmp/x/null
mount -o bind /dev/null /tmp/x/null
Run Code Online (Sandbox Code Playgroud)
打算将支架移动到/dev. 但是,即使在执行移动之前,运行也会echo > /tmp/x/null产生“权限被拒绝”错误(EACCES )。
然而,如果我另外执行:
mkdir /tmp/x/y
touch /tmp/x/y/null
mount -o bind /dev/null /tmp/x/y/null
echo > /tmp/x/y/null
Run Code Online (Sandbox Code Playgroud)
写入成功,因为它应该。我已经解决了很多问题,但找不到应该发生这种情况的根本原因或原因。可以通过将绑定安装的节点放在一个子目录中并将它们的符号链接放在将成为 new 的文件系统的顶层来解决它/dev,但这似乎不是必需的。
这是怎么回事?对此有合理的解释吗?还是某些访问控制逻辑出错了?