我正在使用隔离器,隔离器来隔离使用Linux容器的另一个程序的执行。 它非常方便,在我的计算机上运行得非常好(我可以运行叉炸弹和无限循环,并保护所有内容)。
现在我试图让这个在我的Ubuntu 12.04服务器上工作,但是我遇到了一些困难。 这也是一个新鲜的服务器。
当我运行:
sudo isolate --run -- mycommand
( mycommand
我通常尝试python3
或什么的),我得到:
clone: Operation not permitted
所以,我挖了克隆function(在isolate.c
这样isolate.c
):
box_pid = clone( box_inside, // Function to execute as the body of the new process argv, // Pass our stack SIGCHLD | CLONE_NEWIPC | CLONE_NEWNET | CLONE_NEWNS | CLONE_NEWPID, argv); // Pass the arguments if (box_pid < 0) die("clone: %m"); if (!box_pid) die("clone returned 0"); box_keeper();
以下是函数clone
的返回值:
成功时,subprocess的线程ID在调用者的执行线程中返回。 失败时,在调用者的上下文中返回-1,不会创buildsubprocess,并且将适当地设置errno。
这是我得到的错误:
EPERM不允许操作(POSIX.1)
然后我也发现这个:
EPERM CLONE_NEWNS是由非根进程(没有CAP_SYS_ADMIN的进程)指定的。
clone
函数确实是通过CLONE_NEWNS
在新的名称空间中运行程序。 我其实尝试删除,但我一直在clone: Operation not permitted
。
所以,这一切似乎都指出没有root权限,但我实际上运行命令作为root
(有和没有sudo
只是为了肯定),并与sudoers组中的普通用户。 没有一个工作,但它在当地很好。 根特权适用于其他任何事情,但由于某种原因,当我运行这个isolate
程序,它不起作用。
我试着用/usr/bin
isolate
文件在本地文件夹中运行./isolate
。
我有这个问题,因为我试图在Docker容器中使用隔离。
用--privileged
标志重新运行容器为我解决了这个问题。