【问题标题】:Can I use a socket as stdin/stdout in lxc (linux containers)?我可以在 lxc(Linux 容器)中使用套接字作为标准输入/标准输出吗?
【发布时间】:2011-05-09 19:36:55
【问题描述】:

我有兴趣在 lxc 容器内启动一个守护进程,它的标准输入/标准输出作为从主机传递的套接字,inetd 样式。这可能吗?

【问题讨论】:

  • 请随时要求澄清,因为我正在为这个问题寻求赏金。
  • 你不能只使用netcat吗?
  • 我在考虑 unix 套接字。我不认为 netcat 会成功。那也是两年前的事了。
  • 如何使用netcat?我没有使用该命令的经验,但听起来很有趣

标签: linux virtualization lxc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    inetd 是一个守护进程,它启动(非守护进程)程序,这些程序使用标准输入/标准输出来监听/与您交谈

    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 下运行此包装器。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-02
        • 2013-09-18
        • 2018-06-26
        • 1970-01-01
        相关资源
        最近更新 更多