我如何在我的进程 space 中 "mount" 而不是 root?

How can I "mount" within my process space without being root?

我正在尝试挂载 overlayfs 而不是 root 在我的 C++ 代码中;我希望能够让这个 mount 发生并且只对我自己的进程及其后代可见:

if(-1 == mount("overlay", "./mnt", "overlay", MS_MGC_VAL, "lowerdir=/,upperdir=./upper,workdir=./work"))
    std::cerr << "e: " << errno << std::endl;
    ....

不幸的是,我得到的错误是 Operation not permitted。 我怎样才能做到这一点? 即使是简单的 tmpfs 挂载也不会成为 root;我 运行 在内核上 4.4.0-53

可以通过 user namespaces 以编程方式进行;通过调用:

clone(child_func, ..., CLONE_NEWNS | CLONE_NEWUSER | SIGCHLD, ...);
...
int child_func(void* args) {
    mount("overlay", "./mnt", "overlay", MS_MGC_VAL, "lowerdir=/,upperdir=./upper,workdir=./work");
    ...
}

理想情况下,您还希望设置 /proc/<pid>/uid_map/proc/<id>/gid_map 以获得更好的执行。 可能最好的例子可以在 man pages.

上找到