Как я могу "монтировать" в своем пространстве процессов, не будучи корнем?


Я пытаюсь смонтировать 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 монтирование не может бытькорневым ; я работаю на ядре 4.4.0-53.
1 2

1 ответ:

Можно сделать программно через 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-страницах .