我如何在我的进程 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.
上找到
我正在尝试挂载 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.