我可以在lxc(linux容器)中使用套接字作为stdin / stdout吗?

时间:2011-05-09 19:36:56

标签: linux virtualization lxc

我有兴趣在lxc容器中启动一个守护进程,其stdin / stdout作为从主机inetd样式传递的套接字。这可能吗?

3 个答案:

答案 0 :(得分:1)

我不认为 LXC有本机支持,但你总是可以在xinetd下运行你的lxc命令来获得你想要的东西。或者编写自己的服务器,在一侧与插座对话,并在另一侧与LXC(通过popen()或其他方式)进行对话。

答案 1 :(得分:1)

inetd是一个守护进程,启动(非守护进程)程序,使用stdin / stdout来监听/与你交谈

LXC实用程序lxc-startlxc-execute坚持关闭所有打开的文件描述符(包括stdin / stdout),使它们与inetd无关。然而,他们最终会调用clone(2),您也可以这样编写自己的C包装器:

#define STACKSIZE 409600
/* choose your favourite brand of isolationism below */
#define SPLENDID_ISOLATION (CLONE_NEWPID|CLONE_NEWNS|CLONE_NEWNET)


int exec_command(void* arg) {
  /* don't close stdin/stdout here! */
  execl("command", "command", arg, NULL);
  return 1; 
}

void main(int  argc, char **argv) {
  void *stack = malloc(STACKSIZE) + STACKSIZE - 1; /* grows downwards */
  clone(&exec_command, stack, SIGCHLD|CLONE_VFORK|SPLENDID_ISOLATION, argv[1]);
  wait(NULL);
}

然后可以在inetd下运行此包装器。

答案 2 :(得分:1)

请注意,如果使用LXC“快照”克隆,使用目录后备存储(因此使用overlayfs),则Unix FIFO管道当前已损坏。参见:

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1214500