我使用的是Ubuntu 17.04。
单个非特权unshare挂载命名空间有效。您可以尝试使用unshare(1)命令:
$ unshare -m -U /bin/sh
#
但是不允许在未共享的空间中再次进行未共享操作:
$ unshare -m -U /bin/sh
# unshare -m -U /bin/sh
unshare: Operation not permitted
#
以下是一个基本的 C 程序,其实现与上述功能类似:
#define _GNU_SOURCE
#include <stdio.h>
#include <sched.h>
#include <sys/mount.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
if(unshare(CLONE_NEWUSER|CLONE_NEWNS) == -1) {
perror("unshare");
return -1;
}
if(unshare(CLONE_NEWUSER|CLONE_NEWNS) == -1) {
perror("unshare2");
return -1;
}
return 0;
}
为什么不允许这样做?我在哪里可以找到相关文档?我在unshare或clone手册以及内核unshare文档中找不到此信息。
是否有系统设置可以允许此操作?
我想要实现的目标:
第一个unshare:我想用自己的版本来屏蔽系统上的一些二进制文件。
第二个unshare:非特权的chroot。
fprintf(/proc/self/uid_map, "%d %d 1\n", uid, uid); fputs("deny", /proc/self/setgroups); fprintf(/proc/self/gid_map, "%d %d 1\n", gid, gid);
并在此之前获取uid和gid 来完成它。 - Hadrian Węgrzynowski