我正在使用isolate,一个隔离器来隔离使用Linux容器的另一个程序的执行。它非常方便,它在我的计算机上本地运行得很好(我可以运行叉炸弹和无限循环,它可以保护所有东西)。
现在我试图在我拥有的Ubuntu 12.04服务器上运行它,但是我遇到了一些困难。它也是一台新服务器。
当我跑步时:
sudo isolate --run -- mycommand
(mycommand
我通常会尝试python3
或其他东西),我得到:
clone: Operation not permitted
所以,我挖掘了克隆函数(在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
的返回值:
成功时,子进程的线程ID将在调用者的执行线程中返回。失败时,在调用者的上下文中返回-1,不会创建子进程,并且将正确设置errno。
这就是我得到的错误:
不允许EPERM操作(POSIX.1)
然后我也发现了这个:
EPERM CLONE_NEWNS由非root进程指定(没有CAP_SYS_ADMIN的进程)。
clone
函数确实通过了CLONE_NEWNS
来在新的命名空间中运行程序。我实际上尝试删除,但我一直在clone: Operation not permitted
。
所以,这一切似乎都指出没有root权限,但我实际上将命令作为root
运行(有和没有sudo
只是为了确定),还有普通用户在sudoers组。这些都不起作用,但它在当地非常有效。 Root权限适用于其他所有内容但由于某些原因,当我运行此isolate
程序时,它不起作用。
我在isolate
中同时使用/usr/bin
并在本地文件夹中运行./isolate
。
答案 0 :(得分:4)
我有这个问题,因为我试图在docker容器中使用isolate。
使用--privileged
标记重新运行容器为我修复了它。
答案 1 :(得分:0)
您也可以将 --cap-add=SYS_ADMIN
传递给 docker run。
或者也--security-opt seccomp=unconfined
或者也提供您自己的允许系统调用的白名单,请参阅 https://docs.docker.com/engine/security/seccomp/#pass-a-profile-for-a-container